-- ideiasti_db

DROP TABLE IF EXISTS `wp_ak_params`;
CREATE TABLE `wp_ak_params` (
  `tag` varchar(255) NOT NULL,
  `data` longtext DEFAULT NULL,
  PRIMARY KEY (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

INSERT INTO `wp_ak_params` VALUES ('update_version', '7.7.6');

DROP TABLE IF EXISTS `wp_ak_profiles`;
CREATE TABLE `wp_ak_profiles` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `description` varchar(255) NOT NULL,
  `configuration` longtext DEFAULT NULL,
  `filters` longtext DEFAULT NULL,
  `quickicon` tinyint(3) NOT NULL DEFAULT 1,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

INSERT INTO `wp_ak_profiles` VALUES ('1', 'Default Backup Profile', '###AES128###tDVoBanG2OJ5L1OinB5jvmEQ/P+8nD5zD/dasXHy0WFALFWyH1gfBXScxbn29LTxRihJxZWD9QPGu5DJ8d/X66+w4YH/aGP6gD90v558qcMzltp6CkPHcyDJRUWPD8SE4v87VLqWdwUdMYD3/miFjtkSEpAB5zYQG2kHKLVFJ3+60wQ13lI6G6tufPOjLkOlc2tZqzFWN1UvI5CVwv0hrWh/ffQ3kjAGsnqiQ2ngWhKx32Yn6bp7Y5auf2D7ACS9E14DkiEIErkzyUbtuViRgbX7GalJvkoJZxOz3YdGZwQqKFE5KCJr2/FiJoAROGV6QnOeMa/24XezY4Xf17h4LxWZQBt2jKHlYTw4PpQQOfhQqIzc7hIl71dT77AtKqgdLpKb13Hv4BrToJsokWapzk+5dOnvLWiIDbfccZVKekBTdHe0R9aEpD6/wLFNyV6VXmVf8wPyPi/xXGMJqPJn/FO9Fq2dfCmFcGSlHN7tKB4ULl1fAzEiIh01H4sGXIS6oUQAk86C6XKCuBWqkFnK7ZmS46er8wM5r3nLKRqlDlQu+pJtLb0hveVGm0yCwHXRXKf+TnS6iH0qMD5awzvzA/v71oXQEx9jgJ/iQa7qdeaaFgjia2nH/zTT/OeEKLlGJEbTYE5OGfl0ozA5X+XyjlSuoVuxLBrtKwGnBzLN+WWl39jaCnINuS1f3VfoT6eQA10ea4oVJfeaWDAGFy6d03DNt+jPKr/YjlshrwqHvVeafBOVW3ZBTTZg8hCAUDRleez+HSvuDf9h5MyQ9ZRXhLvoqBRvVbGcieZrzBTGSCFDnP4FivtY4Y1C3szauiPiHUgSBrPVwXxD2xiiXXFQkpYcIb9fQ21iK48kLXfHyqR1QAQAVnB9786YlfHBk2qMWv7AEgUAoIvvlvrbT5AP/YR9b3a66BmDcsq+k3eVnfdaZuZ3pGW8FbCJyUiB30VpOLk1z3m5/bGhTFyIhyybr4zrxBUB3nRUz7huzMO8hbJLY7WmM5hl1MlK7D91x62dZ2Zk6eq6jOtXFcf5VCjcmkiZOtGWvYk3fUrWBRuo09Op3sxvnvSbHBg1fJFhC+q7NhaeLz94qD/PcWMVGn/RUBjMtLX4hdSRgV+tQWyH0dtTFrPidGlrMQb7y1WuPKkpMzLPXc8Pdcp8ZrNauM3290pD3h8g4WsrtP1Lm3vavp+B3xziXICbqHjPrJiUAkTAgHIjyYhAMf4HO4VgxG5Ak9GPT3DEIoZSFFifO14DgjWstpTDGpSXg8BBymkR0dU0KX9AeQLbGQt/iGIMLEGxEWLjIvfTy5utN2PgdyX2QAhZ1E6s3gC9xBrvcWWFfj7qDSeUs5dwXwA92ef8Y4rgzN+UiTh82m6q+Zorsty4jo00o6ZuIKTYV6a99b5EVYiEUVbNXsnAUpEfAqNWNnoDNcCRbtRnaZGKDysKpAe6Z3M8bjq64Ohe2zAW0cBrk8ML0BKnomioRfNEHijq2zrUDGOeXmuM/pzb5510T11J8sjU52p8tadtBZHiq3DWEYnE49z9mcY53JCh6vqw2Q7P7UZdx9ZSvy4ua3BzYCzcmnkDghaxSF/mra9omBniYSQYn4Zg0xCzJqz7dfZt5cXh2zUycnA4gysX+Dnvt+Oun4jDhIOy5EtQ3dySZuSxkAxL151gu2I9RF9tMEzv4s5olRcxSFolD/Hu78Sx1xLAsHlOex8Y8ZeRavZj+1L8h3Blb8HJGJiUtk+tieH/ntQOPEb4BN0wJDWh8nvunpaLSU1sdubfiznIlbPmP/SCxzdqaHIiZl/DdF6O6IG39ollEYjVzByc+psyK8hYhN83+O5MZoNERnpzpO64Yg6ahdiIXwU3R28GpTU3MIkYjevTXqXtavJSIeSqRK989ikrsMxPO5Vvg6axkzzmMBHOpiFkKLGQ0xMIo1xYooSM685kSICNBKCwLcLyOiPjoKYZFd05uWSVw38uqeYoExIYT6SIHLWsGeaa1o5EpnumqVeddAezbNhf3m2IfEKPx/44IZCNjRXpBV2HaWPszN0tyji1uCDAHQDCgZMlq1QWeTAfPrbn+oOXgmTbPHcHL9IYLhY6D7UgBjVFPZqNKAsUKUFjGV8dwelBYJHPdO6+f607b1GF9OT8MwDvUXyOLpHUHa3klzHCaJs2IB1Hk7jVnWFiCfZuVqDXw1c92F5Re+QUAbsoY0v1hjHrHU78TcWym1GXRTMQHEK4nlagw1DN8E4z625i/5pcDqX+flFuoSHQm/WrcmVNjQapMuK1YyVi6rpAotjapbXkdtGJkh7u4JbXTrNeN0I37cFHgyoGLA/SfRRpwEIN9RIeBpMn0dzxmFj6UC7iKA2rbOT3irFDs3daPBaMPjgV9QV/ws4Cw0/wZw0neglki8DnoKK0jELpRQTHvcpQAJSCHfa5HNnGkRdgdTlM0a36OiNfeUyYgmaDpUbKZYMKqaM1DUgTAUVfbOR+7cNOZZX4yCB0+QaIfm9oczuepnld0P13YxkavaDVeTrLynDddrjDkRzeV5zD1r+JsnHn6v8sDa4dbKrWkpBsMOmj/NCAG4S857ZRChCUsev3vS5741ZNcG0CXxY5d0l26b+TQz6X00ELJmS1GNOufVLV7+lEoqEEyITJeRhhRrHBq9HqEtz5DMW3yP1QazHFhnQZPHa+jLTSGUXNeXk97CsuTGWGOVBKsYoI/UB8uxKOoEtjuxzHeTzA5wO74IM4VsO0Ry8ZW30TaNOA4QeKBdpZHjShYTAYsqcygqgDPbfoGgxR3D+ka9Y1IZqyIf3laa+QcZPmvatdm51p3fgSW3Pkm8ecfOI5KDjYg1PK1d/nDi68mTJU2n80/HdSEUnAAKCFyXJlepnq6cxjBmoV5w5y1SABMX2PFjz1drZb+drJDMLzp2G3M+EMz3a8qPfGOhp3wkpMFpHricOXB0G3ITI6NsgMEYex6E9WsxHGM1LuV9XbMln2UMTcI0myge+/qr4tg3jj5dtZoYXh633R7if+EZGP+8xmBho+Jww8r+qLV224+teZyz4glRarh+LwIkzvKGZlzOCNdp8YlUQi1/Nq33cyhB+yqQM13gjI2AzprTgkudKh20NZQv7MHJdpU2kWl5FrEhxo27Pvrf1osWiKYXtUvdu/lyExyTkiuToStuuago7swpIRW680W9z7G0elskbsV6i54H0d7wA5zcpjIW7oSO/Y4QLfW9SlMM7Ec0FiRjPms+Px1Wdr6Fje2mP6DIHKKfKoUatg0GU7bYq2K4uocMBhxDKk8mrQf1NwyT1LQu9l+g1qRGZwJGK3FbLdeNaC1HNR1fmmRu/GeSEVTDKJ5ITfl0uAAQfzfCjVRsDzlcHFwtGWBJ1UrHXZ/w3nSeTWYyro003y8aGDUfqk3eO88Iodj3wolc6Bbb95Uu4OS/h0DosDitaqQf91BXYjUr70PjVLoyDWuTXwjOsUJmbogROQf+UDwsKT/XmEg0LH4glskG+8S4rvW6bYtQ6isXoNYEG46Pia9KEt5tM8n+6Til+Nz2ZUi5j6pwDk1p5qwpiSGVdtgKGzSKRAKtvdzAsWrLFMC48lusYGrVJjYVa8tcv7mP6POpJJEn0hjBESAfXYcmImtjyK3d5wQtPHnKughZbgni+9e3Yh8cWH+RnsQ+Jw4BeiFNSIk1MnZ5+Wp+zkxEcVqQ2yirG8uqM4SUfAq/CA8hKh/VtfTfYkAE4V4Od0xMxen8LA4LRNwe02r+Z0OLvFWaYU2wSICiNtiDbBJ+MfwiU5t80GjQ8q/nz8yputdGmsmBtT184n/0VT/XZo5gfyUG8zro30JdEzbnjc43CRejacb975Y4vv8Vsh8wf/4q2NgJBoVNO5rWChrLoij6ha+0HMwnEHVir3GbB1UWSyNnLt0Dmu4BQudlWBu+urfyvZ4O7VwD7bAtEJxbLEHDO3d3GvSUoCCoSYyZqeQHol9WIvLoxL/pbS+7kA11lVo2Rrc0vlJV1VKCXM+NvOOWzki7r8eIQX3gdwJfZA2gb8MKmoMu/UgFrHH53mDxr0q2aB3q7eEC10X4lu72jYh2JjiPgC3AT3ACNH/86pS9Rr1eOC4B6QoR8SegGtBzcsOK/wn99SuxRLkU8veQVt+MbPlGIOUuMeStUD07Ot2MLIqOfmwkWTM1RlJAD7B38lkmHWoB/yaCTXo2FxyhqAG28EFYFlQWxLyNZeds31pWbVp7XKmnzMSlBTVFKMrGQ33GwjOaAQsBNaMYouGwtdgvn/lQxg4drRszp6hGErLEHaxeu3QUZ96FMWHNVbR7iKT1gE7ySYxNH6yltKUElW7kfC90MatIzyclayizVBe1QMAAA=', '', '1');

DROP TABLE IF EXISTS `wp_ak_stats`;
CREATE TABLE `wp_ak_stats` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `description` varchar(255) NOT NULL,
  `comment` longtext DEFAULT NULL,
  `backupstart` timestamp NULL DEFAULT NULL,
  `backupend` timestamp NULL DEFAULT NULL,
  `status` enum('run','fail','complete') NOT NULL DEFAULT 'run',
  `origin` varchar(30) NOT NULL DEFAULT 'backend',
  `type` varchar(30) NOT NULL DEFAULT 'full',
  `profile_id` bigint(20) NOT NULL DEFAULT 1,
  `archivename` longtext DEFAULT NULL,
  `absolute_path` longtext DEFAULT NULL,
  `multipart` int(11) NOT NULL DEFAULT 0,
  `tag` varchar(255) DEFAULT NULL,
  `backupid` varchar(255) DEFAULT NULL,
  `filesexist` tinyint(3) NOT NULL DEFAULT 1,
  `remote_filename` varchar(1000) DEFAULT NULL,
  `total_size` bigint(20) NOT NULL DEFAULT 0,
  `frozen` tinyint(1) NOT NULL DEFAULT 0,
  `instep` tinyint(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  KEY `idx_fullstatus` (`filesexist`,`status`),
  KEY `idx_stale` (`status`,`origin`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

INSERT INTO `wp_ak_stats` VALUES ('1', 'Backup taken on Monday, 06 July 2026 23:26 -03', '', '2026-07-07 02:26:14', '2026-07-07 02:27:20', 'complete', 'backend', 'full', '1', 'site-localhost-20260706-232614-03-InD7quKDxBTqRnZK.jpa', 'C:/xampp/htdocs/ideiasti/wp-content/plugins/akeebabackupwp/app/backups/site-localhost-20260706-232614-03-InD7quKDxBTqRnZK.jpa', '0', 'backend', 'id-20260707-022613-899422', '1', 'NULL', '360798322', '0', '1');

DROP TABLE IF EXISTS `wp_ak_storage`;
CREATE TABLE `wp_ak_storage` (
  `tag` varchar(255) NOT NULL,
  `lastupdate` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  `data` longtext DEFAULT NULL,
  PRIMARY KEY (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;


DROP TABLE IF EXISTS `wp_ak_users`;
CREATE TABLE `wp_ak_users` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `parameters` longtext DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;


DROP TABLE IF EXISTS `wp_akeeba_common`;
CREATE TABLE `wp_akeeba_common` (
  `key` varchar(190) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `value` longtext NOT NULL,
  PRIMARY KEY (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;


DROP TABLE IF EXISTS `wp_commentmeta`;
CREATE TABLE `wp_commentmeta` (
  `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `comment_id` bigint(20) unsigned NOT NULL DEFAULT 0,
  `meta_key` varchar(255) DEFAULT NULL,
  `meta_value` longtext DEFAULT NULL,
  PRIMARY KEY (`meta_id`),
  KEY `comment_id` (`comment_id`),
  KEY `meta_key` (`meta_key`(191))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;


DROP TABLE IF EXISTS `wp_comments`;
CREATE TABLE `wp_comments` (
  `comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `comment_post_ID` bigint(20) unsigned NOT NULL DEFAULT 0,
  `comment_author` tinytext NOT NULL,
  `comment_author_email` varchar(100) NOT NULL DEFAULT '',
  `comment_author_url` varchar(200) NOT NULL DEFAULT '',
  `comment_author_IP` varchar(100) NOT NULL DEFAULT '',
  `comment_date` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
  `comment_date_gmt` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
  `comment_content` text NOT NULL,
  `comment_karma` int(11) NOT NULL DEFAULT 0,
  `comment_approved` varchar(20) NOT NULL DEFAULT '1',
  `comment_agent` varchar(255) NOT NULL DEFAULT '',
  `comment_type` varchar(20) NOT NULL DEFAULT 'comment',
  `comment_parent` bigint(20) unsigned NOT NULL DEFAULT 0,
  `user_id` bigint(20) unsigned NOT NULL DEFAULT 0,
  PRIMARY KEY (`comment_ID`),
  KEY `comment_post_ID` (`comment_post_ID`),
  KEY `comment_approved_date_gmt` (`comment_approved`,`comment_date_gmt`),
  KEY `comment_date_gmt` (`comment_date_gmt`),
  KEY `comment_parent` (`comment_parent`),
  KEY `comment_author_email` (`comment_author_email`(10))
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

INSERT INTO `wp_comments` VALUES ('1', '1', 'Um comentarista do WordPress', 'wapuu@wordpress.example', 'https://br.wordpress.org/', '', '2026-07-03 01:08:54', '2026-07-03 04:08:54', 'Oi, isto é um comentário.\nPara iniciar a moderar, editar e excluir comentários, visite a tela Comentários no painel.\nOs avatares dos comentaristas vêm do <a href=\"https://br.gravatar.com/\">Gravatar</a>.', '0', '1', '', 'comment', '0', '0');

DROP TABLE IF EXISTS `wp_e_events`;
CREATE TABLE `wp_e_events` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `event_data` text DEFAULT NULL,
  `created_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `created_at_index` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;


DROP TABLE IF EXISTS `wp_links`;
CREATE TABLE `wp_links` (
  `link_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `link_url` varchar(255) NOT NULL DEFAULT '',
  `link_name` varchar(255) NOT NULL DEFAULT '',
  `link_image` varchar(255) NOT NULL DEFAULT '',
  `link_target` varchar(25) NOT NULL DEFAULT '',
  `link_description` varchar(255) NOT NULL DEFAULT '',
  `link_visible` varchar(20) NOT NULL DEFAULT 'Y',
  `link_owner` bigint(20) unsigned NOT NULL DEFAULT 1,
  `link_rating` int(11) NOT NULL DEFAULT 0,
  `link_updated` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
  `link_rel` varchar(255) NOT NULL DEFAULT '',
  `link_notes` mediumtext NOT NULL,
  `link_rss` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`link_id`),
  KEY `link_visible` (`link_visible`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;


DROP TABLE IF EXISTS `wp_options`;
CREATE TABLE `wp_options` (
  `option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `option_name` varchar(191) NOT NULL DEFAULT '',
  `option_value` longtext NOT NULL,
  `autoload` varchar(20) NOT NULL DEFAULT 'yes',
  PRIMARY KEY (`option_id`),
  UNIQUE KEY `option_name` (`option_name`),
  KEY `autoload` (`autoload`)
) ENGINE=InnoDB AUTO_INCREMENT=1133 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

INSERT INTO `wp_options` VALUES ('1', 'cron', 'a:12:{i:1783393736;a:1:{s:34:\"wp_privacy_delete_old_export_files\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}}i:1783395760;a:1:{s:28:\"elementor/tracker/send_event\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1783397336;a:1:{s:32:\"recovery_mode_clean_expired_keys\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1783397363;a:3:{s:19:\"wp_scheduled_delete\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:25:\"delete_expired_transients\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:21:\"wp_update_user_counts\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1783397367;a:1:{s:30:\"wp_scheduled_auto_draft_delete\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1783400934;a:1:{s:16:\"wp_version_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1783402734;a:1:{s:17:\"wp_update_plugins\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1783404534;a:1:{s:16:\"wp_update_themes\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1783428207;a:1:{s:41:\"googlesitekit_cron_update_remote_features\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1783660339;a:1:{s:30:\"wp_delete_temp_updater_backups\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}i:1783742936;a:1:{s:30:\"wp_site_health_scheduled_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}s:7:\"version\";i:2;}', 'on');
INSERT INTO `wp_options` VALUES ('2', 'siteurl', 'http://localhost:8082/ideiasti', 'on');
INSERT INTO `wp_options` VALUES ('3', 'home', 'http://localhost:8082/ideiasti', 'on');
INSERT INTO `wp_options` VALUES ('4', 'blogname', 'ideiasti', 'on');
INSERT INTO `wp_options` VALUES ('5', 'blogdescription', 'Bem vindo ao Blog ideiasti, um blog voltado para Qualidade de Software e Engenharia de Software', 'on');
INSERT INTO `wp_options` VALUES ('6', 'users_can_register', '0', 'on');
INSERT INTO `wp_options` VALUES ('7', 'admin_email', 'pcyasuic@outlook.com', 'on');
INSERT INTO `wp_options` VALUES ('8', 'start_of_week', '1', 'on');
INSERT INTO `wp_options` VALUES ('9', 'use_balanceTags', '0', 'on');
INSERT INTO `wp_options` VALUES ('10', 'use_smilies', '1', 'on');
INSERT INTO `wp_options` VALUES ('11', 'require_name_email', '1', 'on');
INSERT INTO `wp_options` VALUES ('12', 'comments_notify', '1', 'on');
INSERT INTO `wp_options` VALUES ('13', 'posts_per_rss', '10', 'on');
INSERT INTO `wp_options` VALUES ('14', 'rss_use_excerpt', '0', 'on');
INSERT INTO `wp_options` VALUES ('15', 'mailserver_url', 'mail.example.com', 'on');
INSERT INTO `wp_options` VALUES ('16', 'mailserver_login', 'login@example.com', 'on');
INSERT INTO `wp_options` VALUES ('17', 'mailserver_pass', '', 'on');
INSERT INTO `wp_options` VALUES ('18', 'mailserver_port', '110', 'on');
INSERT INTO `wp_options` VALUES ('19', 'default_category', '1', 'on');
INSERT INTO `wp_options` VALUES ('20', 'default_comment_status', 'open', 'on');
INSERT INTO `wp_options` VALUES ('21', 'default_ping_status', 'open', 'on');
INSERT INTO `wp_options` VALUES ('22', 'default_pingback_flag', '1', 'on');
INSERT INTO `wp_options` VALUES ('23', 'posts_per_page', '10', 'on');
INSERT INTO `wp_options` VALUES ('24', 'date_format', 'j \\d\\e F \\d\\e Y', 'on');
INSERT INTO `wp_options` VALUES ('25', 'time_format', 'H:i', 'on');
INSERT INTO `wp_options` VALUES ('26', 'links_updated_date_format', 'j \\d\\e F \\d\\e Y, H:i', 'on');
INSERT INTO `wp_options` VALUES ('27', 'comment_moderation', '0', 'on');
INSERT INTO `wp_options` VALUES ('28', 'moderation_notify', '1', 'on');
INSERT INTO `wp_options` VALUES ('29', 'permalink_structure', '/{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}postname{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}/', 'on');
INSERT INTO `wp_options` VALUES ('31', 'hack_file', '0', 'on');
INSERT INTO `wp_options` VALUES ('32', 'blog_charset', 'UTF-8', 'on');
INSERT INTO `wp_options` VALUES ('33', 'moderation_keys', '', 'off');
INSERT INTO `wp_options` VALUES ('34', 'active_plugins', 'a:4:{i:0;s:33:\"akeebabackupwp/akeebabackupwp.php\";i:1;s:23:\"elementor/elementor.php\";i:2;s:35:\"google-site-kit/google-site-kit.php\";i:3;s:47:\"ideiasti-md-publisher/ideiasti-md-publisher.php\";}', 'on');
INSERT INTO `wp_options` VALUES ('35', 'category_base', '', 'on');
INSERT INTO `wp_options` VALUES ('36', 'ping_sites', 'https://rpc.pingomatic.com/', 'on');
INSERT INTO `wp_options` VALUES ('37', 'comment_max_links', '2', 'on');
INSERT INTO `wp_options` VALUES ('38', 'gmt_offset', '0', 'on');
INSERT INTO `wp_options` VALUES ('39', 'default_email_category', '1', 'on');
INSERT INTO `wp_options` VALUES ('40', 'recently_edited', '', 'off');
INSERT INTO `wp_options` VALUES ('41', 'template', 'ideiasti-tech', 'on');
INSERT INTO `wp_options` VALUES ('42', 'stylesheet', 'ideiasti-tech', 'on');
INSERT INTO `wp_options` VALUES ('43', 'comment_registration', '0', 'on');
INSERT INTO `wp_options` VALUES ('44', 'html_type', 'text/html', 'on');
INSERT INTO `wp_options` VALUES ('45', 'use_trackback', '0', 'on');
INSERT INTO `wp_options` VALUES ('46', 'default_role', 'subscriber', 'on');
INSERT INTO `wp_options` VALUES ('47', 'db_version', '61833', 'on');
INSERT INTO `wp_options` VALUES ('48', 'uploads_use_yearmonth_folders', '1', 'on');
INSERT INTO `wp_options` VALUES ('49', 'upload_path', '', 'on');
INSERT INTO `wp_options` VALUES ('50', 'blog_public', '1', 'on');
INSERT INTO `wp_options` VALUES ('51', 'default_link_category', '2', 'on');
INSERT INTO `wp_options` VALUES ('52', 'show_on_front', 'posts', 'on');
INSERT INTO `wp_options` VALUES ('53', 'tag_base', '', 'on');
INSERT INTO `wp_options` VALUES ('54', 'show_avatars', '1', 'on');
INSERT INTO `wp_options` VALUES ('55', 'avatar_rating', 'G', 'on');
INSERT INTO `wp_options` VALUES ('56', 'upload_url_path', '', 'on');
INSERT INTO `wp_options` VALUES ('57', 'thumbnail_size_w', '150', 'on');
INSERT INTO `wp_options` VALUES ('58', 'thumbnail_size_h', '150', 'on');
INSERT INTO `wp_options` VALUES ('59', 'thumbnail_crop', '1', 'on');
INSERT INTO `wp_options` VALUES ('60', 'medium_size_w', '300', 'on');
INSERT INTO `wp_options` VALUES ('61', 'medium_size_h', '300', 'on');
INSERT INTO `wp_options` VALUES ('62', 'avatar_default', 'mystery', 'on');
INSERT INTO `wp_options` VALUES ('63', 'large_size_w', '1024', 'on');
INSERT INTO `wp_options` VALUES ('64', 'large_size_h', '1024', 'on');
INSERT INTO `wp_options` VALUES ('65', 'image_default_link_type', 'none', 'on');
INSERT INTO `wp_options` VALUES ('66', 'image_default_size', '', 'on');
INSERT INTO `wp_options` VALUES ('67', 'image_default_align', '', 'on');
INSERT INTO `wp_options` VALUES ('68', 'close_comments_for_old_posts', '0', 'on');
INSERT INTO `wp_options` VALUES ('69', 'close_comments_days_old', '14', 'on');
INSERT INTO `wp_options` VALUES ('70', 'thread_comments', '1', 'on');
INSERT INTO `wp_options` VALUES ('71', 'thread_comments_depth', '5', 'on');
INSERT INTO `wp_options` VALUES ('72', 'page_comments', '0', 'on');
INSERT INTO `wp_options` VALUES ('73', 'comments_per_page', '50', 'on');
INSERT INTO `wp_options` VALUES ('74', 'default_comments_page', 'newest', 'on');
INSERT INTO `wp_options` VALUES ('75', 'comment_order', 'asc', 'on');
INSERT INTO `wp_options` VALUES ('76', 'sticky_posts', 'a:0:{}', 'on');
INSERT INTO `wp_options` VALUES ('77', 'widget_categories', 'a:2:{i:1;a:0:{}s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('78', 'widget_text', 'a:2:{i:1;a:0:{}s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('79', 'widget_rss', 'a:2:{i:1;a:0:{}s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('80', 'uninstall_plugins', 'a:2:{s:23:\"elementor/elementor.php\";a:2:{i:0;s:21:\"Elementor\\Maintenance\";i:1;s:9:\"uninstall\";}s:33:\"akeebabackupwp/akeebabackupwp.php\";a:2:{i:0;s:14:\"AkeebaBackupWP\";i:1;s:9:\"uninstall\";}}', 'off');
INSERT INTO `wp_options` VALUES ('81', 'timezone_string', 'America/Sao_Paulo', 'on');
INSERT INTO `wp_options` VALUES ('82', 'page_for_posts', '0', 'on');
INSERT INTO `wp_options` VALUES ('83', 'page_on_front', '0', 'on');
INSERT INTO `wp_options` VALUES ('84', 'default_post_format', '0', 'on');
INSERT INTO `wp_options` VALUES ('85', 'link_manager_enabled', '0', 'on');
INSERT INTO `wp_options` VALUES ('86', 'finished_splitting_shared_terms', '1', 'on');
INSERT INTO `wp_options` VALUES ('87', 'site_icon', '0', 'on');
INSERT INTO `wp_options` VALUES ('88', 'medium_large_size_w', '768', 'on');
INSERT INTO `wp_options` VALUES ('89', 'medium_large_size_h', '0', 'on');
INSERT INTO `wp_options` VALUES ('90', 'wp_page_for_privacy_policy', '3', 'on');
INSERT INTO `wp_options` VALUES ('91', 'show_comments_cookies_opt_in', '1', 'on');
INSERT INTO `wp_options` VALUES ('92', 'admin_email_lifespan', '1798603734', 'on');
INSERT INTO `wp_options` VALUES ('93', 'disallowed_keys', '', 'off');
INSERT INTO `wp_options` VALUES ('94', 'comment_previously_approved', '1', 'on');
INSERT INTO `wp_options` VALUES ('96', 'auto_update_core_dev', 'enabled', 'on');
INSERT INTO `wp_options` VALUES ('97', 'auto_update_core_minor', 'enabled', 'on');
INSERT INTO `wp_options` VALUES ('98', 'auto_update_core_major', 'enabled', 'on');
INSERT INTO `wp_options` VALUES ('99', 'wp_force_deactivated_plugins', 'a:0:{}', 'on');
INSERT INTO `wp_options` VALUES ('100', 'wp_attachment_pages_enabled', '0', 'on');
INSERT INTO `wp_options` VALUES ('101', 'wp_notes_notify', '1', 'on');
INSERT INTO `wp_options` VALUES ('102', 'initial_db_version', '61833', 'on');
INSERT INTO `wp_options` VALUES ('103', 'wp_user_roles', 'a:5:{s:13:\"administrator\";a:2:{s:4:\"name\";s:13:\"Administrator\";s:12:\"capabilities\";a:66:{s:13:\"switch_themes\";b:1;s:11:\"edit_themes\";b:1;s:16:\"activate_plugins\";b:1;s:12:\"edit_plugins\";b:1;s:10:\"edit_users\";b:1;s:10:\"edit_files\";b:1;s:14:\"manage_options\";b:1;s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:6:\"import\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:8:\"level_10\";b:1;s:7:\"level_9\";b:1;s:7:\"level_8\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:12:\"delete_users\";b:1;s:12:\"create_users\";b:1;s:17:\"unfiltered_upload\";b:1;s:14:\"edit_dashboard\";b:1;s:14:\"update_plugins\";b:1;s:14:\"delete_plugins\";b:1;s:15:\"install_plugins\";b:1;s:13:\"update_themes\";b:1;s:14:\"install_themes\";b:1;s:11:\"update_core\";b:1;s:10:\"list_users\";b:1;s:12:\"remove_users\";b:1;s:13:\"promote_users\";b:1;s:18:\"edit_theme_options\";b:1;s:13:\"delete_themes\";b:1;s:6:\"export\";b:1;s:42:\"elementor_atomic_widgets_access_styles_tab\";b:1;s:45:\"elementor_atomic_widgets_edit_local_css_class\";b:1;s:37:\"elementor_global_classes_update_class\";b:1;s:37:\"elementor_global_classes_remove_class\";b:1;s:36:\"elementor_global_classes_apply_class\";b:1;}}s:6:\"editor\";a:2:{s:4:\"name\";s:6:\"Editor\";s:12:\"capabilities\";a:38:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:42:\"elementor_atomic_widgets_access_styles_tab\";b:1;s:45:\"elementor_atomic_widgets_edit_local_css_class\";b:1;s:37:\"elementor_global_classes_remove_class\";b:1;s:36:\"elementor_global_classes_apply_class\";b:1;}}s:6:\"author\";a:2:{s:4:\"name\";s:6:\"Author\";s:12:\"capabilities\";a:14:{s:12:\"upload_files\";b:1;s:10:\"edit_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:42:\"elementor_atomic_widgets_access_styles_tab\";b:1;s:45:\"elementor_atomic_widgets_edit_local_css_class\";b:1;s:37:\"elementor_global_classes_remove_class\";b:1;s:36:\"elementor_global_classes_apply_class\";b:1;}}s:11:\"contributor\";a:2:{s:4:\"name\";s:11:\"Contributor\";s:12:\"capabilities\";a:9:{s:10:\"edit_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:42:\"elementor_atomic_widgets_access_styles_tab\";b:1;s:45:\"elementor_atomic_widgets_edit_local_css_class\";b:1;s:37:\"elementor_global_classes_remove_class\";b:1;s:36:\"elementor_global_classes_apply_class\";b:1;}}s:10:\"subscriber\";a:2:{s:4:\"name\";s:10:\"Subscriber\";s:12:\"capabilities\";a:2:{s:4:\"read\";b:1;s:7:\"level_0\";b:1;}}}', 'on');
INSERT INTO `wp_options` VALUES ('104', 'fresh_site', '0', 'off');
INSERT INTO `wp_options` VALUES ('105', 'WPLANG', 'pt_BR', 'auto');
INSERT INTO `wp_options` VALUES ('106', 'user_count', '1', 'off');
INSERT INTO `wp_options` VALUES ('107', 'widget_block', 'a:6:{i:2;a:1:{s:7:\"content\";s:19:\"<!-- wp:search /-->\";}i:3;a:1:{s:7:\"content\";s:156:\"<!-- wp:group --><div class=\"wp-block-group\"><!-- wp:heading --><h2>Posts recentes</h2><!-- /wp:heading --><!-- wp:latest-posts /--></div><!-- /wp:group -->\";}i:4;a:1:{s:7:\"content\";s:224:\"<!-- wp:group --><div class=\"wp-block-group\"><!-- wp:heading --><h2>Comentários</h2><!-- /wp:heading --><!-- wp:latest-comments {\"displayAvatar\":false,\"displayDate\":false,\"displayExcerpt\":false} /--></div><!-- /wp:group -->\";}i:5;a:1:{s:7:\"content\";s:146:\"<!-- wp:group --><div class=\"wp-block-group\"><!-- wp:heading --><h2>Arquivos</h2><!-- /wp:heading --><!-- wp:archives /--></div><!-- /wp:group -->\";}i:6;a:1:{s:7:\"content\";s:150:\"<!-- wp:group --><div class=\"wp-block-group\"><!-- wp:heading --><h2>Categorias</h2><!-- /wp:heading --><!-- wp:categories /--></div><!-- /wp:group -->\";}s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('108', 'sidebars_widgets', 'a:3:{s:19:\"wp_inactive_widgets\";a:0:{}s:9:\"sidebar-1\";a:5:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";i:3;s:7:\"block-5\";i:4;s:7:\"block-6\";}s:13:\"array_version\";i:3;}', 'auto');
INSERT INTO `wp_options` VALUES ('109', 'widget_pages', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('110', 'widget_calendar', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('111', 'widget_archives', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('112', 'widget_media_audio', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('113', 'widget_media_image', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('114', 'widget_media_gallery', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('115', 'widget_media_video', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('116', 'widget_meta', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('117', 'widget_search', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('118', 'widget_recent-posts', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('119', 'widget_recent-comments', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('120', 'widget_tag_cloud', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('121', 'widget_nav_menu', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('122', 'widget_custom_html', 'a:1:{s:12:\"_multiwidget\";i:1;}', 'auto');
INSERT INTO `wp_options` VALUES ('123', '_transient_wp_core_block_css_files', 'a:2:{s:7:\"version\";s:3:\"7.0\";s:5:\"files\";a:596:{i:0;s:31:\"accordion-heading/style-rtl.css\";i:1;s:35:\"accordion-heading/style-rtl.min.css\";i:2;s:27:\"accordion-heading/style.css\";i:3;s:31:\"accordion-heading/style.min.css\";i:4;s:28:\"accordion-item/style-rtl.css\";i:5;s:32:\"accordion-item/style-rtl.min.css\";i:6;s:24:\"accordion-item/style.css\";i:7;s:28:\"accordion-item/style.min.css\";i:8;s:29:\"accordion-panel/style-rtl.css\";i:9;s:33:\"accordion-panel/style-rtl.min.css\";i:10;s:25:\"accordion-panel/style.css\";i:11;s:29:\"accordion-panel/style.min.css\";i:12;s:23:\"accordion/style-rtl.css\";i:13;s:27:\"accordion/style-rtl.min.css\";i:14;s:19:\"accordion/style.css\";i:15;s:23:\"accordion/style.min.css\";i:16;s:22:\"archives/style-rtl.css\";i:17;s:26:\"archives/style-rtl.min.css\";i:18;s:18:\"archives/style.css\";i:19;s:22:\"archives/style.min.css\";i:20;s:20:\"audio/editor-rtl.css\";i:21;s:24:\"audio/editor-rtl.min.css\";i:22;s:16:\"audio/editor.css\";i:23;s:20:\"audio/editor.min.css\";i:24;s:19:\"audio/style-rtl.css\";i:25;s:23:\"audio/style-rtl.min.css\";i:26;s:15:\"audio/style.css\";i:27;s:19:\"audio/style.min.css\";i:28;s:19:\"audio/theme-rtl.css\";i:29;s:23:\"audio/theme-rtl.min.css\";i:30;s:15:\"audio/theme.css\";i:31;s:19:\"audio/theme.min.css\";i:32;s:21:\"avatar/editor-rtl.css\";i:33;s:25:\"avatar/editor-rtl.min.css\";i:34;s:17:\"avatar/editor.css\";i:35;s:21:\"avatar/editor.min.css\";i:36;s:20:\"avatar/style-rtl.css\";i:37;s:24:\"avatar/style-rtl.min.css\";i:38;s:16:\"avatar/style.css\";i:39;s:20:\"avatar/style.min.css\";i:40;s:25:\"breadcrumbs/style-rtl.css\";i:41;s:29:\"breadcrumbs/style-rtl.min.css\";i:42;s:21:\"breadcrumbs/style.css\";i:43;s:25:\"breadcrumbs/style.min.css\";i:44;s:21:\"button/editor-rtl.css\";i:45;s:25:\"button/editor-rtl.min.css\";i:46;s:17:\"button/editor.css\";i:47;s:21:\"button/editor.min.css\";i:48;s:20:\"button/style-rtl.css\";i:49;s:24:\"button/style-rtl.min.css\";i:50;s:16:\"button/style.css\";i:51;s:20:\"button/style.min.css\";i:52;s:22:\"buttons/editor-rtl.css\";i:53;s:26:\"buttons/editor-rtl.min.css\";i:54;s:18:\"buttons/editor.css\";i:55;s:22:\"buttons/editor.min.css\";i:56;s:21:\"buttons/style-rtl.css\";i:57;s:25:\"buttons/style-rtl.min.css\";i:58;s:17:\"buttons/style.css\";i:59;s:21:\"buttons/style.min.css\";i:60;s:22:\"calendar/style-rtl.css\";i:61;s:26:\"calendar/style-rtl.min.css\";i:62;s:18:\"calendar/style.css\";i:63;s:22:\"calendar/style.min.css\";i:64;s:25:\"categories/editor-rtl.css\";i:65;s:29:\"categories/editor-rtl.min.css\";i:66;s:21:\"categories/editor.css\";i:67;s:25:\"categories/editor.min.css\";i:68;s:24:\"categories/style-rtl.css\";i:69;s:28:\"categories/style-rtl.min.css\";i:70;s:20:\"categories/style.css\";i:71;s:24:\"categories/style.min.css\";i:72;s:19:\"code/editor-rtl.css\";i:73;s:23:\"code/editor-rtl.min.css\";i:74;s:15:\"code/editor.css\";i:75;s:19:\"code/editor.min.css\";i:76;s:18:\"code/style-rtl.css\";i:77;s:22:\"code/style-rtl.min.css\";i:78;s:14:\"code/style.css\";i:79;s:18:\"code/style.min.css\";i:80;s:18:\"code/theme-rtl.css\";i:81;s:22:\"code/theme-rtl.min.css\";i:82;s:14:\"code/theme.css\";i:83;s:18:\"code/theme.min.css\";i:84;s:22:\"columns/editor-rtl.css\";i:85;s:26:\"columns/editor-rtl.min.css\";i:86;s:18:\"columns/editor.css\";i:87;s:22:\"columns/editor.min.css\";i:88;s:21:\"columns/style-rtl.css\";i:89;s:25:\"columns/style-rtl.min.css\";i:90;s:17:\"columns/style.css\";i:91;s:21:\"columns/style.min.css\";i:92;s:33:\"comment-author-name/style-rtl.css\";i:93;s:37:\"comment-author-name/style-rtl.min.css\";i:94;s:29:\"comment-author-name/style.css\";i:95;s:33:\"comment-author-name/style.min.css\";i:96;s:29:\"comment-content/style-rtl.css\";i:97;s:33:\"comment-content/style-rtl.min.css\";i:98;s:25:\"comment-content/style.css\";i:99;s:29:\"comment-content/style.min.css\";i:100;s:26:\"comment-date/style-rtl.css\";i:101;s:30:\"comment-date/style-rtl.min.css\";i:102;s:22:\"comment-date/style.css\";i:103;s:26:\"comment-date/style.min.css\";i:104;s:31:\"comment-edit-link/style-rtl.css\";i:105;s:35:\"comment-edit-link/style-rtl.min.css\";i:106;s:27:\"comment-edit-link/style.css\";i:107;s:31:\"comment-edit-link/style.min.css\";i:108;s:32:\"comment-reply-link/style-rtl.css\";i:109;s:36:\"comment-reply-link/style-rtl.min.css\";i:110;s:28:\"comment-reply-link/style.css\";i:111;s:32:\"comment-reply-link/style.min.css\";i:112;s:30:\"comment-template/style-rtl.css\";i:113;s:34:\"comment-template/style-rtl.min.css\";i:114;s:26:\"comment-template/style.css\";i:115;s:30:\"comment-template/style.min.css\";i:116;s:42:\"comments-pagination-numbers/editor-rtl.css\";i:117;s:46:\"comments-pagination-numbers/editor-rtl.min.css\";i:118;s:38:\"comments-pagination-numbers/editor.css\";i:119;s:42:\"comments-pagination-numbers/editor.min.css\";i:120;s:34:\"comments-pagination/editor-rtl.css\";i:121;s:38:\"comments-pagination/editor-rtl.min.css\";i:122;s:30:\"comments-pagination/editor.css\";i:123;s:34:\"comments-pagination/editor.min.css\";i:124;s:33:\"comments-pagination/style-rtl.css\";i:125;s:37:\"comments-pagination/style-rtl.min.css\";i:126;s:29:\"comments-pagination/style.css\";i:127;s:33:\"comments-pagination/style.min.css\";i:128;s:29:\"comments-title/editor-rtl.css\";i:129;s:33:\"comments-title/editor-rtl.min.css\";i:130;s:25:\"comments-title/editor.css\";i:131;s:29:\"comments-title/editor.min.css\";i:132;s:23:\"comments/editor-rtl.css\";i:133;s:27:\"comments/editor-rtl.min.css\";i:134;s:19:\"comments/editor.css\";i:135;s:23:\"comments/editor.min.css\";i:136;s:22:\"comments/style-rtl.css\";i:137;s:26:\"comments/style-rtl.min.css\";i:138;s:18:\"comments/style.css\";i:139;s:22:\"comments/style.min.css\";i:140;s:20:\"cover/editor-rtl.css\";i:141;s:24:\"cover/editor-rtl.min.css\";i:142;s:16:\"cover/editor.css\";i:143;s:20:\"cover/editor.min.css\";i:144;s:19:\"cover/style-rtl.css\";i:145;s:23:\"cover/style-rtl.min.css\";i:146;s:15:\"cover/style.css\";i:147;s:19:\"cover/style.min.css\";i:148;s:22:\"details/editor-rtl.css\";i:149;s:26:\"details/editor-rtl.min.css\";i:150;s:18:\"details/editor.css\";i:151;s:22:\"details/editor.min.css\";i:152;s:21:\"details/style-rtl.css\";i:153;s:25:\"details/style-rtl.min.css\";i:154;s:17:\"details/style.css\";i:155;s:21:\"details/style.min.css\";i:156;s:20:\"embed/editor-rtl.css\";i:157;s:24:\"embed/editor-rtl.min.css\";i:158;s:16:\"embed/editor.css\";i:159;s:20:\"embed/editor.min.css\";i:160;s:19:\"embed/style-rtl.css\";i:161;s:23:\"embed/style-rtl.min.css\";i:162;s:15:\"embed/style.css\";i:163;s:19:\"embed/style.min.css\";i:164;s:19:\"embed/theme-rtl.css\";i:165;s:23:\"embed/theme-rtl.min.css\";i:166;s:15:\"embed/theme.css\";i:167;s:19:\"embed/theme.min.css\";i:168;s:19:\"file/editor-rtl.css\";i:169;s:23:\"file/editor-rtl.min.css\";i:170;s:15:\"file/editor.css\";i:171;s:19:\"file/editor.min.css\";i:172;s:18:\"file/style-rtl.css\";i:173;s:22:\"file/style-rtl.min.css\";i:174;s:14:\"file/style.css\";i:175;s:18:\"file/style.min.css\";i:176;s:23:\"footnotes/style-rtl.css\";i:177;s:27:\"footnotes/style-rtl.min.css\";i:178;s:19:\"footnotes/style.css\";i:179;s:23:\"footnotes/style.min.css\";i:180;s:23:\"freeform/editor-rtl.css\";i:181;s:27:\"freeform/editor-rtl.min.css\";i:182;s:19:\"freeform/editor.css\";i:183;s:23:\"freeform/editor.min.css\";i:184;s:22:\"gallery/editor-rtl.css\";i:185;s:26:\"gallery/editor-rtl.min.css\";i:186;s:18:\"gallery/editor.css\";i:187;s:22:\"gallery/editor.min.css\";i:188;s:21:\"gallery/style-rtl.css\";i:189;s:25:\"gallery/style-rtl.min.css\";i:190;s:17:\"gallery/style.css\";i:191;s:21:\"gallery/style.min.css\";i:192;s:21:\"gallery/theme-rtl.css\";i:193;s:25:\"gallery/theme-rtl.min.css\";i:194;s:17:\"gallery/theme.css\";i:195;s:21:\"gallery/theme.min.css\";i:196;s:20:\"group/editor-rtl.css\";i:197;s:24:\"group/editor-rtl.min.css\";i:198;s:16:\"group/editor.css\";i:199;s:20:\"group/editor.min.css\";i:200;s:19:\"group/style-rtl.css\";i:201;s:23:\"group/style-rtl.min.css\";i:202;s:15:\"group/style.css\";i:203;s:19:\"group/style.min.css\";i:204;s:19:\"group/theme-rtl.css\";i:205;s:23:\"group/theme-rtl.min.css\";i:206;s:15:\"group/theme.css\";i:207;s:19:\"group/theme.min.css\";i:208;s:21:\"heading/style-rtl.css\";i:209;s:25:\"heading/style-rtl.min.css\";i:210;s:17:\"heading/style.css\";i:211;s:21:\"heading/style.min.css\";i:212;s:19:\"html/editor-rtl.css\";i:213;s:23:\"html/editor-rtl.min.css\";i:214;s:15:\"html/editor.css\";i:215;s:19:\"html/editor.min.css\";i:216;s:19:\"icon/editor-rtl.css\";i:217;s:23:\"icon/editor-rtl.min.css\";i:218;s:15:\"icon/editor.css\";i:219;s:19:\"icon/editor.min.css\";i:220;s:18:\"icon/style-rtl.css\";i:221;s:22:\"icon/style-rtl.min.css\";i:222;s:14:\"icon/style.css\";i:223;s:18:\"icon/style.min.css\";i:224;s:20:\"image/editor-rtl.css\";i:225;s:24:\"image/editor-rtl.min.css\";i:226;s:16:\"image/editor.css\";i:227;s:20:\"image/editor.min.css\";i:228;s:19:\"image/style-rtl.css\";i:229;s:23:\"image/style-rtl.min.css\";i:230;s:15:\"image/style.css\";i:231;s:19:\"image/style.min.css\";i:232;s:19:\"image/theme-rtl.css\";i:233;s:23:\"image/theme-rtl.min.css\";i:234;s:15:\"image/theme.css\";i:235;s:19:\"image/theme.min.css\";i:236;s:29:\"latest-comments/style-rtl.css\";i:237;s:33:\"latest-comments/style-rtl.min.css\";i:238;s:25:\"latest-comments/style.css\";i:239;s:29:\"latest-comments/style.min.css\";i:240;s:27:\"latest-posts/editor-rtl.css\";i:241;s:31:\"latest-posts/editor-rtl.min.css\";i:242;s:23:\"latest-posts/editor.css\";i:243;s:27:\"latest-posts/editor.min.css\";i:244;s:26:\"latest-posts/style-rtl.css\";i:245;s:30:\"latest-posts/style-rtl.min.css\";i:246;s:22:\"latest-posts/style.css\";i:247;s:26:\"latest-posts/style.min.css\";i:248;s:18:\"list/style-rtl.css\";i:249;s:22:\"list/style-rtl.min.css\";i:250;s:14:\"list/style.css\";i:251;s:18:\"list/style.min.css\";i:252;s:22:\"loginout/style-rtl.css\";i:253;s:26:\"loginout/style-rtl.min.css\";i:254;s:18:\"loginout/style.css\";i:255;s:22:\"loginout/style.min.css\";i:256;s:19:\"math/editor-rtl.css\";i:257;s:23:\"math/editor-rtl.min.css\";i:258;s:15:\"math/editor.css\";i:259;s:19:\"math/editor.min.css\";i:260;s:18:\"math/style-rtl.css\";i:261;s:22:\"math/style-rtl.min.css\";i:262;s:14:\"math/style.css\";i:263;s:18:\"math/style.min.css\";i:264;s:25:\"media-text/editor-rtl.css\";i:265;s:29:\"media-text/editor-rtl.min.css\";i:266;s:21:\"media-text/editor.css\";i:267;s:25:\"media-text/editor.min.css\";i:268;s:24:\"media-text/style-rtl.css\";i:269;s:28:\"media-text/style-rtl.min.css\";i:270;s:20:\"media-text/style.css\";i:271;s:24:\"media-text/style.min.css\";i:272;s:19:\"more/editor-rtl.css\";i:273;s:23:\"more/editor-rtl.min.css\";i:274;s:15:\"more/editor.css\";i:275;s:19:\"more/editor.min.css\";i:276;s:30:\"navigation-link/editor-rtl.css\";i:277;s:34:\"navigation-link/editor-rtl.min.css\";i:278;s:26:\"navigation-link/editor.css\";i:279;s:30:\"navigation-link/editor.min.css\";i:280;s:29:\"navigation-link/style-rtl.css\";i:281;s:33:\"navigation-link/style-rtl.min.css\";i:282;s:25:\"navigation-link/style.css\";i:283;s:29:\"navigation-link/style.min.css\";i:284;s:38:\"navigation-overlay-close/style-rtl.css\";i:285;s:42:\"navigation-overlay-close/style-rtl.min.css\";i:286;s:34:\"navigation-overlay-close/style.css\";i:287;s:38:\"navigation-overlay-close/style.min.css\";i:288;s:33:\"navigation-submenu/editor-rtl.css\";i:289;s:37:\"navigation-submenu/editor-rtl.min.css\";i:290;s:29:\"navigation-submenu/editor.css\";i:291;s:33:\"navigation-submenu/editor.min.css\";i:292;s:25:\"navigation/editor-rtl.css\";i:293;s:29:\"navigation/editor-rtl.min.css\";i:294;s:21:\"navigation/editor.css\";i:295;s:25:\"navigation/editor.min.css\";i:296;s:24:\"navigation/style-rtl.css\";i:297;s:28:\"navigation/style-rtl.min.css\";i:298;s:20:\"navigation/style.css\";i:299;s:24:\"navigation/style.min.css\";i:300;s:23:\"nextpage/editor-rtl.css\";i:301;s:27:\"nextpage/editor-rtl.min.css\";i:302;s:19:\"nextpage/editor.css\";i:303;s:23:\"nextpage/editor.min.css\";i:304;s:24:\"page-list/editor-rtl.css\";i:305;s:28:\"page-list/editor-rtl.min.css\";i:306;s:20:\"page-list/editor.css\";i:307;s:24:\"page-list/editor.min.css\";i:308;s:23:\"page-list/style-rtl.css\";i:309;s:27:\"page-list/style-rtl.min.css\";i:310;s:19:\"page-list/style.css\";i:311;s:23:\"page-list/style.min.css\";i:312;s:24:\"paragraph/editor-rtl.css\";i:313;s:28:\"paragraph/editor-rtl.min.css\";i:314;s:20:\"paragraph/editor.css\";i:315;s:24:\"paragraph/editor.min.css\";i:316;s:23:\"paragraph/style-rtl.css\";i:317;s:27:\"paragraph/style-rtl.min.css\";i:318;s:19:\"paragraph/style.css\";i:319;s:23:\"paragraph/style.min.css\";i:320;s:35:\"post-author-biography/style-rtl.css\";i:321;s:39:\"post-author-biography/style-rtl.min.css\";i:322;s:31:\"post-author-biography/style.css\";i:323;s:35:\"post-author-biography/style.min.css\";i:324;s:30:\"post-author-name/style-rtl.css\";i:325;s:34:\"post-author-name/style-rtl.min.css\";i:326;s:26:\"post-author-name/style.css\";i:327;s:30:\"post-author-name/style.min.css\";i:328;s:26:\"post-author/editor-rtl.css\";i:329;s:30:\"post-author/editor-rtl.min.css\";i:330;s:22:\"post-author/editor.css\";i:331;s:26:\"post-author/editor.min.css\";i:332;s:25:\"post-author/style-rtl.css\";i:333;s:29:\"post-author/style-rtl.min.css\";i:334;s:21:\"post-author/style.css\";i:335;s:25:\"post-author/style.min.css\";i:336;s:33:\"post-comments-count/style-rtl.css\";i:337;s:37:\"post-comments-count/style-rtl.min.css\";i:338;s:29:\"post-comments-count/style.css\";i:339;s:33:\"post-comments-count/style.min.css\";i:340;s:33:\"post-comments-form/editor-rtl.css\";i:341;s:37:\"post-comments-form/editor-rtl.min.css\";i:342;s:29:\"post-comments-form/editor.css\";i:343;s:33:\"post-comments-form/editor.min.css\";i:344;s:32:\"post-comments-form/style-rtl.css\";i:345;s:36:\"post-comments-form/style-rtl.min.css\";i:346;s:28:\"post-comments-form/style.css\";i:347;s:32:\"post-comments-form/style.min.css\";i:348;s:32:\"post-comments-link/style-rtl.css\";i:349;s:36:\"post-comments-link/style-rtl.min.css\";i:350;s:28:\"post-comments-link/style.css\";i:351;s:32:\"post-comments-link/style.min.css\";i:352;s:26:\"post-content/style-rtl.css\";i:353;s:30:\"post-content/style-rtl.min.css\";i:354;s:22:\"post-content/style.css\";i:355;s:26:\"post-content/style.min.css\";i:356;s:23:\"post-date/style-rtl.css\";i:357;s:27:\"post-date/style-rtl.min.css\";i:358;s:19:\"post-date/style.css\";i:359;s:23:\"post-date/style.min.css\";i:360;s:27:\"post-excerpt/editor-rtl.css\";i:361;s:31:\"post-excerpt/editor-rtl.min.css\";i:362;s:23:\"post-excerpt/editor.css\";i:363;s:27:\"post-excerpt/editor.min.css\";i:364;s:26:\"post-excerpt/style-rtl.css\";i:365;s:30:\"post-excerpt/style-rtl.min.css\";i:366;s:22:\"post-excerpt/style.css\";i:367;s:26:\"post-excerpt/style.min.css\";i:368;s:34:\"post-featured-image/editor-rtl.css\";i:369;s:38:\"post-featured-image/editor-rtl.min.css\";i:370;s:30:\"post-featured-image/editor.css\";i:371;s:34:\"post-featured-image/editor.min.css\";i:372;s:33:\"post-featured-image/style-rtl.css\";i:373;s:37:\"post-featured-image/style-rtl.min.css\";i:374;s:29:\"post-featured-image/style.css\";i:375;s:33:\"post-featured-image/style.min.css\";i:376;s:34:\"post-navigation-link/style-rtl.css\";i:377;s:38:\"post-navigation-link/style-rtl.min.css\";i:378;s:30:\"post-navigation-link/style.css\";i:379;s:34:\"post-navigation-link/style.min.css\";i:380;s:27:\"post-template/style-rtl.css\";i:381;s:31:\"post-template/style-rtl.min.css\";i:382;s:23:\"post-template/style.css\";i:383;s:27:\"post-template/style.min.css\";i:384;s:24:\"post-terms/style-rtl.css\";i:385;s:28:\"post-terms/style-rtl.min.css\";i:386;s:20:\"post-terms/style.css\";i:387;s:24:\"post-terms/style.min.css\";i:388;s:31:\"post-time-to-read/style-rtl.css\";i:389;s:35:\"post-time-to-read/style-rtl.min.css\";i:390;s:27:\"post-time-to-read/style.css\";i:391;s:31:\"post-time-to-read/style.min.css\";i:392;s:24:\"post-title/style-rtl.css\";i:393;s:28:\"post-title/style-rtl.min.css\";i:394;s:20:\"post-title/style.css\";i:395;s:24:\"post-title/style.min.css\";i:396;s:26:\"preformatted/style-rtl.css\";i:397;s:30:\"preformatted/style-rtl.min.css\";i:398;s:22:\"preformatted/style.css\";i:399;s:26:\"preformatted/style.min.css\";i:400;s:24:\"pullquote/editor-rtl.css\";i:401;s:28:\"pullquote/editor-rtl.min.css\";i:402;s:20:\"pullquote/editor.css\";i:403;s:24:\"pullquote/editor.min.css\";i:404;s:23:\"pullquote/style-rtl.css\";i:405;s:27:\"pullquote/style-rtl.min.css\";i:406;s:19:\"pullquote/style.css\";i:407;s:23:\"pullquote/style.min.css\";i:408;s:23:\"pullquote/theme-rtl.css\";i:409;s:27:\"pullquote/theme-rtl.min.css\";i:410;s:19:\"pullquote/theme.css\";i:411;s:23:\"pullquote/theme.min.css\";i:412;s:39:\"query-pagination-numbers/editor-rtl.css\";i:413;s:43:\"query-pagination-numbers/editor-rtl.min.css\";i:414;s:35:\"query-pagination-numbers/editor.css\";i:415;s:39:\"query-pagination-numbers/editor.min.css\";i:416;s:31:\"query-pagination/editor-rtl.css\";i:417;s:35:\"query-pagination/editor-rtl.min.css\";i:418;s:27:\"query-pagination/editor.css\";i:419;s:31:\"query-pagination/editor.min.css\";i:420;s:30:\"query-pagination/style-rtl.css\";i:421;s:34:\"query-pagination/style-rtl.min.css\";i:422;s:26:\"query-pagination/style.css\";i:423;s:30:\"query-pagination/style.min.css\";i:424;s:25:\"query-title/style-rtl.css\";i:425;s:29:\"query-title/style-rtl.min.css\";i:426;s:21:\"query-title/style.css\";i:427;s:25:\"query-title/style.min.css\";i:428;s:25:\"query-total/style-rtl.css\";i:429;s:29:\"query-total/style-rtl.min.css\";i:430;s:21:\"query-total/style.css\";i:431;s:25:\"query-total/style.min.css\";i:432;s:20:\"query/editor-rtl.css\";i:433;s:24:\"query/editor-rtl.min.css\";i:434;s:16:\"query/editor.css\";i:435;s:20:\"query/editor.min.css\";i:436;s:19:\"quote/style-rtl.css\";i:437;s:23:\"quote/style-rtl.min.css\";i:438;s:15:\"quote/style.css\";i:439;s:19:\"quote/style.min.css\";i:440;s:19:\"quote/theme-rtl.css\";i:441;s:23:\"quote/theme-rtl.min.css\";i:442;s:15:\"quote/theme.css\";i:443;s:19:\"quote/theme.min.css\";i:444;s:23:\"read-more/style-rtl.css\";i:445;s:27:\"read-more/style-rtl.min.css\";i:446;s:19:\"read-more/style.css\";i:447;s:23:\"read-more/style.min.css\";i:448;s:18:\"rss/editor-rtl.css\";i:449;s:22:\"rss/editor-rtl.min.css\";i:450;s:14:\"rss/editor.css\";i:451;s:18:\"rss/editor.min.css\";i:452;s:17:\"rss/style-rtl.css\";i:453;s:21:\"rss/style-rtl.min.css\";i:454;s:13:\"rss/style.css\";i:455;s:17:\"rss/style.min.css\";i:456;s:21:\"search/editor-rtl.css\";i:457;s:25:\"search/editor-rtl.min.css\";i:458;s:17:\"search/editor.css\";i:459;s:21:\"search/editor.min.css\";i:460;s:20:\"search/style-rtl.css\";i:461;s:24:\"search/style-rtl.min.css\";i:462;s:16:\"search/style.css\";i:463;s:20:\"search/style.min.css\";i:464;s:20:\"search/theme-rtl.css\";i:465;s:24:\"search/theme-rtl.min.css\";i:466;s:16:\"search/theme.css\";i:467;s:20:\"search/theme.min.css\";i:468;s:24:\"separator/editor-rtl.css\";i:469;s:28:\"separator/editor-rtl.min.css\";i:470;s:20:\"separator/editor.css\";i:471;s:24:\"separator/editor.min.css\";i:472;s:23:\"separator/style-rtl.css\";i:473;s:27:\"separator/style-rtl.min.css\";i:474;s:19:\"separator/style.css\";i:475;s:23:\"separator/style.min.css\";i:476;s:23:\"separator/theme-rtl.css\";i:477;s:27:\"separator/theme-rtl.min.css\";i:478;s:19:\"separator/theme.css\";i:479;s:23:\"separator/theme.min.css\";i:480;s:24:\"shortcode/editor-rtl.css\";i:481;s:28:\"shortcode/editor-rtl.min.css\";i:482;s:20:\"shortcode/editor.css\";i:483;s:24:\"shortcode/editor.min.css\";i:484;s:24:\"site-logo/editor-rtl.css\";i:485;s:28:\"site-logo/editor-rtl.min.css\";i:486;s:20:\"site-logo/editor.css\";i:487;s:24:\"site-logo/editor.min.css\";i:488;s:23:\"site-logo/style-rtl.css\";i:489;s:27:\"site-logo/style-rtl.min.css\";i:490;s:19:\"site-logo/style.css\";i:491;s:23:\"site-logo/style.min.css\";i:492;s:27:\"site-tagline/editor-rtl.css\";i:493;s:31:\"site-tagline/editor-rtl.min.css\";i:494;s:23:\"site-tagline/editor.css\";i:495;s:27:\"site-tagline/editor.min.css\";i:496;s:26:\"site-tagline/style-rtl.css\";i:497;s:30:\"site-tagline/style-rtl.min.css\";i:498;s:22:\"site-tagline/style.css\";i:499;s:26:\"site-tagline/style.min.css\";i:500;s:25:\"site-title/editor-rtl.css\";i:501;s:29:\"site-title/editor-rtl.min.css\";i:502;s:21:\"site-title/editor.css\";i:503;s:25:\"site-title/editor.min.css\";i:504;s:24:\"site-title/style-rtl.css\";i:505;s:28:\"site-title/style-rtl.min.css\";i:506;s:20:\"site-title/style.css\";i:507;s:24:\"site-title/style.min.css\";i:508;s:26:\"social-link/editor-rtl.css\";i:509;s:30:\"social-link/editor-rtl.min.css\";i:510;s:22:\"social-link/editor.css\";i:511;s:26:\"social-link/editor.min.css\";i:512;s:27:\"social-links/editor-rtl.css\";i:513;s:31:\"social-links/editor-rtl.min.css\";i:514;s:23:\"social-links/editor.css\";i:515;s:27:\"social-links/editor.min.css\";i:516;s:26:\"social-links/style-rtl.css\";i:517;s:30:\"social-links/style-rtl.min.css\";i:518;s:22:\"social-links/style.css\";i:519;s:26:\"social-links/style.min.css\";i:520;s:21:\"spacer/editor-rtl.css\";i:521;s:25:\"spacer/editor-rtl.min.css\";i:522;s:17:\"spacer/editor.css\";i:523;s:21:\"spacer/editor.min.css\";i:524;s:20:\"spacer/style-rtl.css\";i:525;s:24:\"spacer/style-rtl.min.css\";i:526;s:16:\"spacer/style.css\";i:527;s:20:\"spacer/style.min.css\";i:528;s:20:\"table/editor-rtl.css\";i:529;s:24:\"table/editor-rtl.min.css\";i:530;s:16:\"table/editor.css\";i:531;s:20:\"table/editor.min.css\";i:532;s:19:\"table/style-rtl.css\";i:533;s:23:\"table/style-rtl.min.css\";i:534;s:15:\"table/style.css\";i:535;s:19:\"table/style.min.css\";i:536;s:19:\"table/theme-rtl.css\";i:537;s:23:\"table/theme-rtl.min.css\";i:538;s:15:\"table/theme.css\";i:539;s:19:\"table/theme.min.css\";i:540;s:23:\"tag-cloud/style-rtl.css\";i:541;s:27:\"tag-cloud/style-rtl.min.css\";i:542;s:19:\"tag-cloud/style.css\";i:543;s:23:\"tag-cloud/style.min.css\";i:544;s:28:\"template-part/editor-rtl.css\";i:545;s:32:\"template-part/editor-rtl.min.css\";i:546;s:24:\"template-part/editor.css\";i:547;s:28:\"template-part/editor.min.css\";i:548;s:27:\"template-part/theme-rtl.css\";i:549;s:31:\"template-part/theme-rtl.min.css\";i:550;s:23:\"template-part/theme.css\";i:551;s:27:\"template-part/theme.min.css\";i:552;s:24:\"term-count/style-rtl.css\";i:553;s:28:\"term-count/style-rtl.min.css\";i:554;s:20:\"term-count/style.css\";i:555;s:24:\"term-count/style.min.css\";i:556;s:30:\"term-description/style-rtl.css\";i:557;s:34:\"term-description/style-rtl.min.css\";i:558;s:26:\"term-description/style.css\";i:559;s:30:\"term-description/style.min.css\";i:560;s:23:\"term-name/style-rtl.css\";i:561;s:27:\"term-name/style-rtl.min.css\";i:562;s:19:\"term-name/style.css\";i:563;s:23:\"term-name/style.min.css\";i:564;s:28:\"term-template/editor-rtl.css\";i:565;s:32:\"term-template/editor-rtl.min.css\";i:566;s:24:\"term-template/editor.css\";i:567;s:28:\"term-template/editor.min.css\";i:568;s:27:\"term-template/style-rtl.css\";i:569;s:31:\"term-template/style-rtl.min.css\";i:570;s:23:\"term-template/style.css\";i:571;s:27:\"term-template/style.min.css\";i:572;s:27:\"text-columns/editor-rtl.css\";i:573;s:31:\"text-columns/editor-rtl.min.css\";i:574;s:23:\"text-columns/editor.css\";i:575;s:27:\"text-columns/editor.min.css\";i:576;s:26:\"text-columns/style-rtl.css\";i:577;s:30:\"text-columns/style-rtl.min.css\";i:578;s:22:\"text-columns/style.css\";i:579;s:26:\"text-columns/style.min.css\";i:580;s:19:\"verse/style-rtl.css\";i:581;s:23:\"verse/style-rtl.min.css\";i:582;s:15:\"verse/style.css\";i:583;s:19:\"verse/style.min.css\";i:584;s:20:\"video/editor-rtl.css\";i:585;s:24:\"video/editor-rtl.min.css\";i:586;s:16:\"video/editor.css\";i:587;s:20:\"video/editor.min.css\";i:588;s:19:\"video/style-rtl.css\";i:589;s:23:\"video/style-rtl.min.css\";i:590;s:15:\"video/style.css\";i:591;s:19:\"video/style.min.css\";i:592;s:19:\"video/theme-rtl.css\";i:593;s:23:\"video/theme-rtl.min.css\";i:594;s:15:\"video/theme.css\";i:595;s:19:\"video/theme.min.css\";}}', 'on');
INSERT INTO `wp_options` VALUES ('127', '_transient_wp_styles_for_blocks', 'a:2:{s:4:\"hash\";s:32:\"e9ec654858504bb96fe91d370bd2e8e3\";s:6:\"blocks\";a:7:{s:32:\"0368537a03d4b05ed11f802c802c5153\";s:0:\"\";s:32:\"500888137eafa12a508de2c588d9ffdd\";s:46:\":root :where(.wp-block-icon svg){width: 24px;}\";s:32:\"a6036e6eb2ad2df7ed8860b807868647\";s:0:\"\";s:32:\"3b46efc0a10c1dae38f584ad199c3544\";s:120:\":where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}\";s:32:\"ab4df16c9e454bfed8a404309545590d\";s:120:\":where(.wp-block-term-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-term-template.is-layout-grid){gap: 1.25em;}\";s:32:\"68ec5cad52d993402775a7503ba9efb7\";s:102:\":where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}\";s:32:\"b8b4aa19e69b9b2de0f5c27097467bd6\";s:69:\":root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}\";}}', 'on');
INSERT INTO `wp_options` VALUES ('129', 'recovery_keys', 'a:0:{}', 'off');
INSERT INTO `wp_options` VALUES ('137', '_site_transient_timeout_browser_900b53410dbe0e0c28417a226c81086c', '1783656566', 'off');
INSERT INTO `wp_options` VALUES ('138', '_site_transient_browser_900b53410dbe0e0c28417a226c81086c', 'a:10:{s:4:\"name\";s:6:\"Chrome\";s:7:\"version\";s:9:\"149.0.0.0\";s:8:\"platform\";s:7:\"Windows\";s:10:\"update_url\";s:29:\"https://www.google.com/chrome\";s:7:\"img_src\";s:43:\"http://s.w.org/images/browsers/chrome.png?1\";s:11:\"img_src_ssl\";s:44:\"https://s.w.org/images/browsers/chrome.png?1\";s:15:\"current_version\";s:2:\"18\";s:7:\"upgrade\";b:0;s:8:\"insecure\";b:0;s:6:\"mobile\";b:0;}', 'off');
INSERT INTO `wp_options` VALUES ('139', '_site_transient_timeout_php_check_da775d00ae55849f14f81cf79fc50d46', '1783656567', 'off');
INSERT INTO `wp_options` VALUES ('140', '_site_transient_php_check_da775d00ae55849f14f81cf79fc50d46', 'a:5:{s:19:\"recommended_version\";s:3:\"8.3\";s:15:\"minimum_version\";s:3:\"7.4\";s:12:\"is_supported\";b:0;s:9:\"is_secure\";b:1;s:13:\"is_acceptable\";b:1;}', 'off');
INSERT INTO `wp_options` VALUES ('142', 'can_compress_scripts', '1', 'on');
INSERT INTO `wp_options` VALUES ('155', '_site_transient_wp_plugin_dependencies_plugin_data', 'a:2:{s:9:\"elementor\";a:35:{s:4:\"name\";s:84:\"Elementor Website Builder &#8211; muito mais do que apenas um construtor de páginas\";s:4:\"slug\";s:9:\"elementor\";s:7:\"version\";s:5:\"4.1.4\";s:6:\"author\";s:64:\"<a href=\"https://profiles.wordpress.org/elemntor/\">Elementor</a>\";s:14:\"author_profile\";s:40:\"https://profiles.wordpress.org/elemntor/\";s:12:\"contributors\";a:1:{s:8:\"elemntor\";a:3:{s:7:\"profile\";s:40:\"https://profiles.wordpress.org/elemntor/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/7d70f15d78757f876d1847a8f87dd93e1d9c168264b4aeeaf72058656690d05b?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:9:\"Elementor\";}}s:8:\"requires\";s:3:\"6.8\";s:6:\"tested\";s:3:\"7.0\";s:12:\"requires_php\";s:3:\"7.4\";s:16:\"requires_plugins\";a:0:{}s:6:\"rating\";i:90;s:7:\"ratings\";a:5:{i:5;i:6130;i:4;i:231;i:3;i:120;i:2;i:116;i:1;i:677;}s:11:\"num_ratings\";i:7274;s:11:\"support_url\";s:47:\"https://wordpress.org/support/plugin/elementor/\";s:15:\"support_threads\";i:53;s:24:\"support_threads_resolved\";i:44;s:15:\"active_installs\";i:10000000;s:12:\"last_updated\";s:21:\"2026-06-21 1:20pm GMT\";s:5:\"added\";s:10:\"2016-05-30\";s:8:\"homepage\";s:87:\"https://elementor.com/?utm_source=wp-plugins&utm_campaign=plugin-uri&utm_medium=wp-dash\";s:8:\"sections\";a:6:{s:11:\"description\";s:28440:\"<p><span class=\"embed-youtube\" style=\"text-align:center; display: block;\"><iframe loading=\"lazy\" class=\"youtube-player\" width=\"750\" height=\"422\" src=\"https://www.youtube.com/embed/ROEC0CPRO3w?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=pt-BR&#038;autohide=2&#038;wmode=transparent\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\"></iframe></span></p>\n<h4>O CONSTRUTOR DE SITES WORDPRESS Nº 1 DE ARRASTAR E SOLTAR, SEM CÓDIGOS, COM MAIS DE 22 MILHÕES DE SITES EM TODO O MUNDO, AGORA COM IA.</h4>\n<p>O Elementor, a principal plataforma de criação de sites para WordPress, permite que você crie sites profissionais e com design impecável de forma integrada, graças ao seu Editor Atômico, que não requer programação e funciona com o recurso de arrastar e soltar.</p>\n<p>Oferecendo suporte ao ciclo de vida completo do site, o Elementor permite que você crie, otimize e gerencie seu site com confiança, com recursos avançados, como criação com inteligência artificial, otimização de imagens, envio de e-mails transacionais, ferramentas de acessibilidade, otimizadores de desempenho e muito mais.</p>\n<p>Agora na versão 4 (o Editor atômico)! Apresentamos uma nova geração de blocos de construção atômicos, que priorizam o desempenho e permitem controlar cada elemento atômico, sem limites nem layouts fixos. Defina seus sistemas de design globais e componentes reutilizáveis uma única vez, e eles serão aplicados instantaneamente em todos os lugares, transformando horas ou até dias de trabalho em apenas alguns cliques.</p>\n<p>Libere todos os recursos com o <strong><a href=\"https://go.elementor.com/wp-repo-description-tab-elementor-pro-pro-features/\" rel=\"nofollow ugc\">Elementor One</a></strong>.</p>\n<p>Precisa de hospedagem em nuvem rápida e segura para o seu site Elementor? Experimente o <strong><a href=\"https://elemn.to/repo-hosting\" rel=\"nofollow ugc\">Elementor Host</a></strong>, desenvolvido pelo Google Cloud e Cloudflare. Pontuação de 4,9/5 no TrustPilot.</p>\n<h3>🌟 Crie sites profissionais impressionantes</h3>\n<ul>\n<li><strong><a href=\"https://go.elementor.com/feature-page-editor/\" rel=\"nofollow ugc\">Construtor de arrastar e soltar intuitivo</a></strong>: Crie qualquer site com nosso editor de arrastar e soltar sem códigos. Alcance a precisão no design, com controle total sobre o layout e o estilo.</li>\n<li><strong><a href=\"https://go.elementor.com/wp-repo-description-tab-pro-features-feature-page/\" rel=\"nofollow ugc\">Ferramentas de design com pixels perfeitos</a></strong>: Envie SVGs, aplique máscaras, gradientes, sombras de caixa, efeitos de título, divisores de forma e use controles CSS integrados, para personalização avançada.</li>\n<li><strong><a href=\"https://go.elementor.com/wp-repo-description-tab-library-full-website-kit/\" rel=\"nofollow ugc\">Biblioteca de modelos</a></strong>: Aplique kits de sites completos para configurações instantâneas ou escolha em uma vasta biblioteca de páginas únicas, blocos e modelos de pop-up.</li>\n<li><strong><a href=\"https://go.elementor.com/feature-page-editor/\" rel=\"nofollow ugc\">Widgets avançados</a></strong>: Acesse mais de 40 widgets GRATUITOS, incluindo título, imagem, editor de texto, vídeo, botão, galeria, carrossel e muitos outros.</li>\n<li><strong><a href=\"https://go.elementor.com/wp-repo-description-tab-elementor-ai/\" rel=\"nofollow ugc\">Recursos de IA</a></strong>: Revolucione seu processo de criação de design e conteúdo, com a integração nativa de IA. Crie imediatamente seções, textos, códigos e imagens.</li>\n</ul>\n<h4>🗝️ Principais recursos</h4>\n<ul>\n<li><strong><a href=\"https://go.elementor.com/feature-page-global-settings/\" rel=\"nofollow ugc\">Sistema de design</a></strong>: Use variáveis e classes para garantir a consistência das cores, tipografia e elementos de design, assegurando uma aparência coesa e profissional, que é atualizada globalmente em todos os lugares.</li>\n<li><strong><a href=\"https://go.elementor.com/feature-page-responsive-design/\" rel=\"nofollow ugc\">Design responsivo</a></strong>: Otimize seu design para todos os dispositivos com pontos de interrupção personalizados, garantindo uma experiência perfeita em desktops, tablets e dispositivos móveis.</li>\n<li><strong>Formas de máscara</strong>: Transforme qualquer elemento, como uma imagem ou um vídeo, em qualquer forma que você queira, para criar designs marcantes.</li>\n<li><strong>Transformação de CSS</strong>: Use a transformação de CSS para rotacionar, dimensionar e inclinar elementos, adicionando um estilo dinâmico ao seu site.</li>\n<li><strong>Animações de entrada</strong>: Adicione animações de entrada aos elementos para criar experiências de usuário envolventes e interativas.</li>\n<li><strong><a href=\"https://elementor.com/features/#SaveBackup\" rel=\"nofollow ugc\">Histórico de revisões</a></strong>: O recurso de histórico de revisões do Elementor permite que os usuários acompanhem e revertam para versões anteriores dos seus designs, proporcionando tranquilidade e flexibilidade durante o processo criativo.</li>\n<li><strong><a href=\"https://go.elementor.com/wp-repo-description-tab-developers-developers-website/\" rel=\"nofollow ugc\">Amigável para desenvolvedores</a></strong>: Equipado com ampla documentação, API, ferramentas para desenvolvedores e áreas de código personalizado, o Elementor oferece um ambiente propício para que os desenvolvedores ampliem seus recursos e criem soluções personalizadas.</li>\n<li><strong><a href=\"https://elementor.com/features/contact-button/\" rel=\"nofollow ugc\">Botões flutuantes</a></strong>: melhore a interação do usuário com botões de ação flutuantes personalizáveis, que permanecem visíveis enquanto os usuários rolam a tela.</li>\n<li><strong>Componentes [Pro]</strong>: Reutilize os mesmos blocos de construção em todas as páginas e sites e os atualize em todos os lugares em que aparecem. Inclui edição controlada de conteúdo, permitindo que colaboradores e clientes atualizem apenas as propriedades de conteúdo expostas, sem quebrar o layout ou o estilo.</li>\n<li><strong><a href=\"https://go.elementor.com/wp-repo-description-tab-pro-features-industry-leading-theme-builder/\" rel=\"nofollow ugc\">Construtor de temas</a> [Pro]</strong>: Crie cada parte do seu site &#8211; cabeçalhos, rodapés, posts e arquivos &#8211; para ter controle total sobre a aparência.</li>\n<li><strong><a href=\"https://go.elementor.com/wp-repo-description-tab-pro-features-popup-builder/\" rel=\"nofollow ugc\">Construtor de pop-ups</a> [Pro]</strong>: Crie pop-ups chamativos com o construtor de pop-ups do Elementor, que conta com opções avançadas de direcionamento e acionamento para otimizar o envolvimento do usuário e as conversões.</li>\n<li><strong><a href=\"https://go.elementor.com/wp-repo-description-tab-pro-features-professional-form-builder-and-submission-log/\" rel=\"nofollow ugc\">Formulários</a> [Pro]</strong>: Crie e integre formulários personalizados, usando recursos avançados e integrações para capturar e gerenciar envios de forma eficaz.</li>\n<li><strong><a href=\"https://go.elementor.com/wp-repo-description-tab-pro-features-woocommerce-builder/\" rel=\"nofollow ugc\">Construtor do WooCommerce</a> [Pro]</strong>: Integre o Elementor ao WooCommerce para criar páginas de produtos personalizadas, layouts de loja, arquivos, carrinhos, páginas de finalização de compra, minha conta e muito mais, aumentando o apelo visual e a funcionalidade da sua loja.</li>\n<li><strong><a href=\"https://go.elementor.com/wp-repo-description-tab-pro-features-dynamic-content/\" rel=\"nofollow ugc\">Conteúdo dinâmico</a> [Pro]</strong>: Aproveite os recursos de conteúdo dinâmico para criar experiências personalizadas e interativas na web, conectando seus designs a várias fontes de dados.</li>\n<li><strong><a href=\"https://go.elementor.com/features-page-notes/\" rel=\"nofollow ugc\">Anotações</a> [Pro]</strong>: Melhore a colaboração da equipe usando o recurso de anotações do Elementor para deixar feedbacks e comentários diretamente na interface do design.</li>\n<li><strong>Código personalizado [Pro]</strong>: Insere código personalizado para estender a funcionalidade do seu site, oferecendo flexibilidade para personalizações avançadas.</li>\n<li><strong> CSS personalizado [Pro]</strong>: Aplique CSS personalizado para fazer o ajuste fino do estilo dos elementos, garantindo um controle preciso sobre os aspectos do design.</li>\n<li><strong><a href=\"https://go.elementor.com/wp-repo-description-tab-pro-features-motion-effects/\" rel=\"nofollow ugc\">Efeitos de movimento</a> [Pro]</strong>: Adicione efeitos de movimento avançados a elementos, para proporcionar uma experiência de usuário mais dinâmica e envolvente.</li>\n<li><strong>Fontes e ícones personalizados [Pro]</strong>: Envie e use fontes e ícones personalizados, para combinar com a identidade da sua marca.</li>\n</ul>\n<h4>😍 Widgets do Elementor GRATUITO</h4>\n<p>Desbloqueie o potencial do Elementor com nosso conjunto abrangente de widgets e ferramentas gratuitas, desenvolvido para otimizar seu processo de criação de sites e melhorar seus recursos de design:</p>\n<ul>\n<li><strong>Título</strong>: Adicione manchetes chamativas.</li>\n<li><strong>Imagem</strong>: Controle o tamanho, a opacidade e outros aspectos.</li>\n<li><strong>Editor de texto</strong>: Exatamente como o editor de texto do WordPress.</li>\n<li><strong>Vídeo</strong>: Adicione vídeos do YouTube, do Vimeo, do VideoPress, do Dailymotion ou auto-hospedados.</li>\n<li><strong>Botão</strong>: Crie botões interativos.</li>\n<li><strong>Link na biografia</strong>: Crie componentes de link na biografia para promover sua empresa/serviços.</li>\n<li><strong>Caixa de imagem</strong>: Uma caixa com imagem, título e texto.</li>\n<li><strong>Depoimentos</strong>: Depoimentos de clientes.</li>\n<li><strong>Ícone</strong>: Coloque um ou mais dos mais de 600 ícones disponíveis.</li>\n<li><strong>Caixa de ícones</strong>: Um ícone, um título manchete e um texto em um único widget.</li>\n<li><strong>Ícones sociais</strong>: Crie links para suas páginas sociais, com os ícones do Facebook/X (antigo Twitter).</li>\n<li><strong>Galeria de imagens</strong>: Exiba suas imagens em uma grade.</li>\n<li><strong>Carrossel de imagens</strong>: Crie carrosséis rotativos, ou controles deslizantes (sliders) para as imagens escolhidas.</li>\n<li><strong>Lista de ícones</strong>: Use qualquer ícone para criar uma lista com marcadores.</li>\n<li><strong>Contador</strong>: Mostre os números de forma crescente.</li>\n<li><strong>Barra de progresso</strong>: Inclua uma barra de progresso crescente.</li>\n<li><strong>Abas aninhadas</strong>: Exiba o conteúdo em abas verticais ou horizontais.</li>\n<li><strong>Sanfona aninhada</strong>: Exiba qualquer tipo de conteúdo em seções recolhíveis.</li>\n<li><strong>Classificação</strong>: Exibe quantas estrelas (ou outro ícone) os outros visitantes deram.</li>\n<li><strong>Alerta</strong>: Inclua uma caixa de alerta colorida, para chamar a atenção do visitante.</li>\n<li><strong> HTML </strong>: Insira código na página.</li>\n<li><strong>Shortcode</strong>: Insira shortcodes de qualquer plugin na página.</li>\n<li><strong>Âncora de menu</strong>: Vincule qualquer menu a esta âncora.</li>\n<li><strong>Leia mais</strong>: Defina o limite &#8220;Leia mais&#8221; para o resumo nas páginas de arquivo.</li>\n<li><strong>Barra lateral</strong>: Adicione barras laterais à página.</li>\n<li><strong>Google Maps</strong>: Incorpore mapas na página.</li>\n<li><strong>SoundCloud</strong>: Adicione trechos de áudio do SoundCloud.</li>\n<li><strong>Divisor</strong>: Separe o conteúdo com um divisor projetado.</li>\n<li><strong>Espaçador</strong>: Adicione espaço entre elementos.</li>\n<li><strong>Caminho de texto</strong>: Anexe seu texto a um caminho.</li>\n<li><strong>E contando…</strong></li>\n</ul>\n<h3>🚀 Melhore seu site</h3>\n<p><strong><a href=\"https://go.elementor.com/wp-repo-description-tab-performance-performance-page/\" rel=\"nofollow ugc\">Sites com alto desempenho</a></strong>: O desempenho do site afeta a experiência do visitante e a classificação dos resultados da pesquisa. O Elementor, em parceria com o Google Chrome, melhora continuamente o desempenho sem comprometer o design.</p>\n<p><strong>Os principais recursos incluem:</strong></p>\n<ul>\n<li><strong>Saída DOM reduzida</strong>: Estrutura HTML otimizada para renderização mais rápida.</li>\n<li><strong>Carregamento de arquivos de mídia melhorado</strong>: Carregamento otimizado de imagens, vídeos e outros ativos de mídia.</li>\n<li><strong>Arquivos CSS e JS reduzidos</strong>: folhas de estilo e scripts minimizados, carregados individualmente apenas sob demanda, para acelerar o tempo de carregamento.</li>\n<li><strong>Carregamento tardio</strong>: Carregamento adiado de recursos não críticos, para melhorar a velocidade de carregamento inicial da página.</li>\n<li><strong>Carregamento mais rápido de fontes</strong>: Fornecimento eficiente de fontes da web para aumentar a velocidade de renderização dos textos.</li>\n<li><strong>Carregamento otimizado de ativos da interface</strong>: Carregamento eficiente de ativos como JavaScript e CSS para minimizar o bloqueio de renderização.</li>\n<li><strong>Armazenamento em cache de elementos</strong>: Armazene em cache os elementos de design acessados com frequência, para reduzir o tempo de resposta do servidor e melhorar o desempenho geral.</li>\n</ul>\n<h3>🔥 Recursos do editor do Elementor Pro</h3>\n<p>Crie sites incomparáveis enquanto economiza tempo, dinheiro e recursos com o construtor de sites completo do <a href=\"https://go.elementor.com/wp-repo-description-tab-elementor-pro-elementor-pro/\" rel=\"nofollow ugc\">Editor do Elementor Pro</a>. Tenha acesso a mais de 100 widgets, recursos e ferramentas profissionais.</p>\n<p><strong>Widgets do Editor Pro para design:</strong></p>\n<ol>\n<li><strong>Posts</strong>: Exibe os posts do seu blog com layouts e estilos personalizáveis.</li>\n<li><strong>Botões de compartilhamento</strong>: Permite que os visitantes compartilhem seu conteúdo com facilidade em várias plataformas de mídia social.</li>\n<li><strong>Portfólio</strong>: Apresente seu trabalho ou projetos com layouts de portfólio impressionantes.</li>\n<li><strong>Slides</strong>: Crie apresentações de slides dinâmicos com animações e transições personalizadas.</li>\n<li><strong>Formulário</strong>: Crie e personalize formulários avançados para interação com o usuário e coleta de dados.</li>\n<li><strong>Acesso</strong>: Adicione um formulário de acesso ou um módulo de cadastro de usuário ao seu site.</li>\n<li><strong>Menu de navegação</strong>: Personalize e estilize o menu de navegação do seu site, para melhorar a experiência do usuário.</li>\n<li><strong>Manchete animada</strong>: Crie títulos principais que chamam a atenção com efeitos animados.</li>\n<li><strong>Tabela de preços</strong>: Exibe planos ou pacotes de preços em um formato estruturado e visualmente atraente.</li>\n<li><strong>Lista de preços</strong>: Exibe uma lista de preços ou serviços com opções de estilo personalizáveis.</li>\n<li><strong>Galeria</strong>: Crie lindas galerias de imagens com várias opções de layout e suporte a lightbox.</li>\n<li><strong>Caixa giratória</strong>: Adicione animações interativas com efeito de giro para destacar conteúdos ou recursos.</li>\n<li><strong>Chamada para ação</strong>: Estimule a interação do usuário e as conversões com seções de chamada para ação convincentes.</li>\n<li><strong>Carrossel de mídia</strong>: Exibe um carrossel de arquivos de mídia, como imagens ou vídeos.</li>\n<li><strong>Carrossel de depoimentos</strong>: Exibe depoimentos de clientes em um formato de carrossel como prova social.</li>\n<li><strong>Carrossel aninhado</strong>: Crie carrosséis aninhados para uma organização do conteúdo mais sofisticada.</li>\n<li><strong>Carrossel em loop</strong>: Exibe conteúdo em um carrossel em loop para visualização contínua.</li>\n<li><strong>Tabela de conteúdo</strong>: Gere uma tabela de conteúdo (índice) para artigos ou guias mais longos para melhorar a navegação.</li>\n<li><strong>Contagem regressiva</strong>: Adicione temporizadores com contagem regressiva para criar urgência em promoções ou eventos.</li>\n<li><strong>Página do Facebook</strong>: Incorpore o feed ou o conteúdo da sua página do Facebook ao seu site.</li>\n<li><strong>Bloco de citação</strong>: Destaque citações ou depoimentos com opções de formatação elegantes.</li>\n<li><strong>Modelo</strong>: Salve e reutilize modelos de design para manter a consistência da marca e do layout.</li>\n<li><strong>Avaliações</strong>: Apresente as avaliações e classificações dos clientes para aumentar a confiança e a credibilidade.</li>\n<li><strong>Botão do Facebook</strong>: Adicione botões para promover interações com sua página ou conteúdo do Facebook.</li>\n<li><strong>Incorporação do Facebook</strong>: Incorpore publicações ou conteúdo do Facebook ao seu site.</li>\n<li><strong>Comentários do Facebook</strong>: Ative os comentários do Facebook nas páginas ou posts do seu site.</li>\n<li><strong>Botão do PayPal</strong>: Integre botões do PayPal para facilitar os pagamentos on-line.</li>\n<li><strong>Botão do Stripe</strong>: Integre botões de pagamento do Stripe para facilitar transações on-line seguras.</li>\n<li><strong>Widget Lottie</strong>: Adicione animações Lottie para aumentar o apelo visual e o envolvimento.</li>\n<li><strong>Destaque de código</strong>: Exiba fragmentos de código (snippets) com destaque na sintaxe para melhorar a legibilidade.</li>\n<li><strong>Lista de reprodução de vídeos</strong>: Crie e personalize listas de reprodução para conteúdo de vídeo no seu site.</li>\n<li><strong>Mega menu</strong>: Personalize menus avançados para melhorar a navegação e exibir conteúdo complexo.</li>\n<li><strong>Fora da tela</strong>: Crie áreas fora da tela que deslizam para mostrar informações ou menus adicionais sem sobrecarregar o layout principal.</li>\n</ol>\n<p><strong>Widgets do Editor Pro para temas:</strong></p>\n<p>Crie e personalize todas as partes principais do seu site, incluindo cabeçalhos, rodapés, página 404, arquivos globais e muito mais…</p>\n<ol>\n<li><strong>Título do post</strong>: Personalize o título dos posts ou páginas individuais do blog.</li>\n<li><strong>Resumo do post</strong>: Exibe um breve resumo ou prévia dos seus posts do blog.</li>\n<li><strong>Conteúdo do post</strong>: Personalize a área de conteúdo principal dos posts ou páginas do seu blog.</li>\n<li><strong>Imagem destacada</strong>: Defina e personalize imagens destacadas para posts ou páginas do blog.</li>\n<li><strong>Caixa do autor</strong>: Exibe informações e biografias do autor nos posts do blog.</li>\n<li><strong>Comentários de posts</strong>: Personalize a aparência e a funcionalidade das seções de comentários no seu site.</li>\n<li><strong>Navegação em posts</strong>: Adicione links de navegação aos posts adjacentes para facilitar a navegação.</li>\n<li><strong>Informações do post</strong>: Exibe informações adicionais sobre os posts do blog, como autor e data.</li>\n<li><strong>Logo do site</strong>: Envie e personalize o logo do seu site para fins de marca.</li>\n<li><strong>Título do site</strong>: Personalize o título do seu site.</li>\n<li><strong>Título da página</strong>: Personalize o título de páginas individuais.</li>\n<li><strong>Barra de pesquisa</strong>: Adicione uma barra de pesquisa para permitir que os usuários pesquisem o conteúdo do seu site.</li>\n<li><strong>Caminhos de navegação (breadcrumbs)</strong>: Exiba caminhos de navegação hierárquicos para melhorar a navegação do usuário.</li>\n<li><strong>Sitemap</strong>: Gere um sitemap para melhorar a indexação nos mecanismos de pesquisa e a navegação do usuário.</li>\n<li><strong>Grade em loop</strong>: Crie e personalize layouts de grade para arquivos de posts de blogs ou listagens de produtos.</li>\n</ol>\n<p><strong>Widgets do Editor Pro para WooCommerce:</strong></p>\n<p>Crie e personalize uma experiência completa de compras on-line em todo o seu site.</p>\n<ol>\n<li><strong>Produto</strong>: Exiba produtos individuais com layouts e estilos personalizáveis.</li>\n<li><strong>Caminhos de navegação (breadcrumbs)</strong>: Exiba caminhos de navegação hierárquicos para melhorar a navegação do usuário na sua loja.</li>\n<li><strong>Título do produto</strong>: Personalize o título de produtos individuais.</li>\n<li><strong>Imagens de produtos</strong>: Defina e personalize imagens para listagens de produtos.</li>\n<li><strong>Preço do produto</strong>: Exibe o preço de produtos individuais.</li>\n<li><strong>Adicionar ao carrinho</strong>: Adicione botões personalizáveis de adicionar ao carrinho para facilitar a compra.</li>\n<li><strong>Classificação do produto</strong>: Exibe classificações e avaliações dos produtos.</li>\n<li><strong>Estoque do produto</strong>: Exibe a disponibilidade de estoque dos produtos.</li>\n<li><strong>Meta do produto</strong>: Exibe informações adicionais sobre produtos, como SKU e categorias.</li>\n<li><strong>Conteúdo do produto</strong>: Personalize a área de conteúdo principal das descrições dos produtos.</li>\n<li><strong>Descrição curta</strong>: Exibe breves resumos ou prévias de produtos.</li>\n<li><strong>Abas de dados do produto</strong>: Organize as informações do produto em seções com abas para melhorar a organização.</li>\n<li><strong>Informações adicionais</strong>: Exibe detalhes adicionais sobre os produtos, como dimensões e peso.</li>\n<li><strong>Produto relacionado</strong>: Exibe produtos relacionados para incentivar compras adicionais.</li>\n<li><strong>Vendas adicionais (upsells)</strong>: Promova a venda adicional de produtos para aumentar o valor médio do pedido.</li>\n<li><strong>Produtos</strong>: Exibe uma grade ou lista de produtos com configurações personalizáveis.</li>\n<li><strong>Adicionar ao carrinho personalizado</strong>: Personalize o botão adicionar ao carrinho para produtos específicos.</li>\n<li><strong>Páginas do WooCommerce</strong>: Crie e personalize páginas específicas do WooCommerce, como as páginas do carrinho e da finalização de compra.</li>\n<li><strong>Categorias de produtos</strong>: Exibe categorias de produtos para facilitar a navegação na sua loja.</li>\n<li><strong>Menu do carrinho</strong>: Exibe um ícone de carrinho no seu menu de navegação para facilitar o acesso ao carrinho de compras.</li>\n<li><strong>Carrinho</strong>: Personalize a aparência e a funcionalidade da página do carrinho de compras.</li>\n<li><strong>Finalização de compra</strong>: Personalize a aparência e a funcionalidade da página de finalização de compra.</li>\n<li><strong>Minha conta</strong>: Personalize a aparência e a funcionalidade da área da conta do cliente.</li>\n<li><strong>Resumo da compra</strong>: Exibe um resumo das compras durante o processo de finalização de compra.</li>\n<li><strong>Notificações do WooCommerce</strong>: Personalize a aparência e a funcionalidade das notificações do WooCommerce, como mensagens de confirmação de pedido.</li>\n</ol>\n<p>Crie sites profissionais com o <strong><a href=\"https://go.elementor.com/wp-repo-description-tab-elementor-pro-elementor-pro/\" rel=\"nofollow ugc\">Editor do Elementor Pro</a></strong>!</p>\n<h4>🔒 Segurança e conformidade</h4>\n<p>O Elementor coloca um foco primordial na segurança, evidente através de nossa aquisição de certificações do setor, como ISO/IEC 27001, ISO/IEC 27017, ISO/IEC 27018, ISO/IEC 27701 e SOC 2 Tipo II. Essas certificações ressaltam nosso compromisso com a implementação de medidas de segurança robustas e destacam nossa dedicação em aderir a padrões reconhecidos do setor.</p>\n<p>Incentivamos a pesquisa ética de segurança através do nosso <a href=\"https://go.elementor.com/wp-repo-description-tab-bug-crowd-bug-bounty-program/\" rel=\"nofollow ugc\">Programa de recompensa por erros</a>. Colaboramos com os principais serviços de recompensa por erros para oferecer oportunidades aos pesquisadores de relatar vulnerabilidades em nossos serviços. Nossos programas de recompensas incluem uma equipe de triagem disponível 24 horas por dia, 7 dias por semana, 365 dias por ano.</p>\n<p>For more information: <a href=\"https://go.elementor.com/trust-center/\" rel=\"nofollow ugc\">Central de confiança</a>.</p>\n<h4>♿ Melhores práticas de acessibilidade</h4>\n<p>O Elementor oferece ferramentas e melhorias de acessibilidade para ajudá-lo a proporcionar uma experiência melhor para todos os usuários. Incluindo HTML 5 semântico, menu de navegação com teclado completo, melhoria contínua dos recursos, widget e muito mais.</p>\n<h4>🌐 Traduzido para mais de 63 idiomas, inclui compatibilidade com RTL</h4>\n<p>O Elementor oferece suporte a vários idiomas, tipografias e RTL, com traduções do editor em <a href=\"https://go.elementor.com/wp-repo-description-tab-wordpress-plugin-translate/\" rel=\"nofollow ugc\">mais de 63 idiomas</a>.</p>\n<p>Também é compatível com o WPML, Polylang, TranslatePress, Weglot e outros. Para contribuir, adicione um novo idioma através do <a href=\"https://translate.wordpress.org/\" rel=\"nofollow ugc\">translate.wordpress.org</a>. Consulte o nosso guia sobre <a href=\"https://go.elementor.com/wp-repo-description-tab-help-center-translate/\" rel=\"nofollow ugc\">como traduzir e localizar o plugin</a>.</p>\n<h4>⏩ Uso de serviços de terceiros</h4>\n<p>Para melhorar a experiência do usuário, o Elementor pode usar os seguintes serviços de terceiros se o recurso exigido estiver ativado:</p>\n<ul>\n<li>As fontes do Google Fonts são carregadas, para adicionar fontes adicionais ao seu site. São aplicáveis os <a href=\"https://policies.google.com/terms\" rel=\"nofollow ugc\">Termos de serviço</a> e a <a href=\"https://policies.google.com/privacy\" rel=\"nofollow ugc\">Política de privacidade</a> do Google.</li>\n<li>Alguns recursos do Elementor exigem o carregamento de ativos do site Elementor.com. Esses ativos não são usados para rastreamento, a menos que seja explicitamente indicado, exigindo sua aprovação e aceitação manual. Saiba mais em nossos <a href=\"https://go.elementor.com/wp-repo-description-tab-elementor-plugin-terms/\" rel=\"nofollow ugc\">Termos de serviço</a> e <a href=\"https://go.elementor.com/wp-repo-description-tab-elementor-plugin-privacy/\" rel=\"nofollow ugc\">Política de privacidade</a>.</li>\n</ul>\n<h4>📧 Produtos relacionados do Elementor</h4>\n<p><strong><a href=\"https://go.elementor.com/wp-repo-description-tab-elementor-io/\" rel=\"nofollow ugc\">Image Optimizer</a></strong>: Compactação de imagens superior, para um desempenho mais rápido e de alta qualidade do site.</p>\n<p><strong><a href=\"https://go.elementor.com/wp-repo-description-tab-elementor-sm/\" rel=\"nofollow ugc\">Site Mailer</a></strong>: Gerenciamento de e-mails confiável sem plugins de SMTP, mantendo suas comunicações simplificadas e eficientes.</p>\n<p><strong><a href=\"http://go.elementor.com/editor-acc-wp-repo\" rel=\"nofollow ugc\">Acessibilidade na internet</a></strong>: Melhora a usabilidade do site para pessoas com necessidades especiais. O Ally foi desenvolvido para ajudar os criadores de sites a torná-los mais inclusivos. Ele examina, detecta e corrige as principais violações de acessibilidade, funcionando perfeitamente em todos os sites do WordPress e do Elementor.</p>\n<h4>📣 Veja o que nossos usuários têm a dizer</h4>\n<blockquote>\n<p>“O Elementor é, sem dúvida, o melhor construtor de páginas que existe” – ★★★★★ <em><a href=\"https://wordpress.org/support/topic/elementor-is-hands-down-the-best-page-builder-out-there/\" rel=\"ugc\">Graphicvision1</a></em></p>\n<p>“Um plugin incrivelmente fácil de usar” – ★★★★★ <em><a href=\"https://wordpress.org/support/topic/a-wonderful-experience/\" rel=\"ugc\">Hyeyoga</a></em></p>\n<p>“Sem dúvida, o plugin do WordPress que mais uso” –  …</p>\n</blockquote>\n\";s:12:\"installation\";s:2533:\"<h4>Requisitos mínimos</h4>\n<ul>\n<li>WordPress 6.8 or greater</li>\n<li>Versão do PHP 7.4 ou superior</li>\n<li>MySQL versão 5.6, ou MariaDB versão 10.5 ou superior</li>\n<li>Limite de memória do PHP de 256 MB ou superior</li>\n<li>Limite de memória do WordPress de 256 MB ou superior</li>\n</ul>\n<h4>Requisitos recomendados</h4>\n<ul>\n<li>WordPress 7.0 ou superior</li>\n<li>Versão 8.3 ou superior do PHP</li>\n<li>MySQL versão 8.0, ou MariaDB versão 10.6 ou superior</li>\n<li>Limite de memória do PHP de 512 MB (768 MB para melhor desempenho) ou superior</li>\n<li>Limite de memória do WordPress de 512 MB (768 MB para melhor desempenho) ou superior</li>\n</ul>\n<p><span class=\"embed-youtube\" style=\"text-align:center; display: block;\"><iframe loading=\"lazy\" class=\"youtube-player\" width=\"750\" height=\"422\" src=\"https://www.youtube.com/embed/9EZ159ryFNs?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=pt-BR&#038;autohide=2&#038;wmode=transparent\" allowfullscreen=\"true\" style=\"border:0;\" sandbox=\"allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox\"></iframe></span></p>\n<p><strong>Observação:</strong> Estes requisitos se aplicam apenas ao Elementor e ao Elementor Pro. Se você estiver usando plugins adicionais no seu site, que também tenham requisitos mínimos, como o WooCommerce, ou complementos do Elementor, talvez seja necessário aumentar o limite de memória do PHP e do WordPress, para ajudar a evitar problemas de carregamento. Consulte também a documentação a seguir <a href=\"https://elementor.com/help/elementor-widget-panel-not-loading/\" rel=\"nofollow ugc\">O painel de widgets do Elementor não está carregando</a>.</p>\n<h4>Instalação</h4>\n<ol>\n<li>Instale usando o instalador de plugin integrado do WordPress ou extraia o arquivo zip e coloque o conteúdo no diretório <code>wp-content/plugins/</code> da sua instalação do WordPress.</li>\n<li>Ative o plugin através do menu &#8220;Plugins&#8221; no WordPress.</li>\n<li>Vá para Páginas > Adicionar nova</li>\n<li>Pressione o botão &#8220;Editar com o Elementor&#8221;.</li>\n<li>Agora você pode arrastar e soltar widgets do painel esquerdo para a área de conteúdo, bem como adicionar novas seções e colunas que compõem a estrutura da página.</li>\n</ol>\n<p>Para documentação e tutoriais, acesse nossa <a href=\"https://elementor.com/help/?utm_source=wp-repo&amp;utm_medium=link&amp;utm_campaign=readme\" rel=\"nofollow ugc\">Base de conhecimento</a>.</p>\n\";s:3:\"faq\";s:5547:\"\n<dt id=\"how{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20do{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20install{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20elementor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20editor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nComo instalar o Editor do Elementor?\n</h4>\n<p>\n<p>Para instalar a versão gratuita do editor do Elementor, siga as etapas abaixo:<br />\nNo painel do WordPress -&gt; Acesse “Plugins” -&gt; Clique em “Adicionar novo” -&gt; No campo de pesquisa, digite “Elementor” e selecione “Elementor Website Builder”.<br />\nClique em “Instalar” -&gt; Após a instalação, clique em “Ativar”.</p>\n</p>\n<dt id=\"does{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20elementor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20editor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20work{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20with{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20all{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20the{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20themes{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nO Editor do Elementor funciona com todos os temas?\n</h4>\n<p>\n<p>O Editor do Elementor funciona com todos os temas que respeitam os padrões de codificação do WordPress estabelecidos pelo seu Codex. É recomendável usar o <a href=\"https://go.elementor.com/wp-repo-description-tab-hello-theme-hello-theme/\" rel=\"nofollow ugc\">Tema Hello</a> do Elementor, uma tela em branco leve, para aproveitar da total flexibilidade ao usar o Editor Elementor e otimizar sua experiência.</p>\n</p>\n<dt id=\"is{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20elementor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20editor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20compatible{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20with{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20gutenberg{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nO Editor do Elementor é compatível com o Gutenberg?\n</h4>\n<p>\n<p>O Editor do Elementor e o Gutenberg funcionam perfeitamente juntos. Como usuário, você pode decidir facilmente qual editor usar em cada ponto da edição do seu site.</p>\n</p>\n<dt id=\"can{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20create{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20an{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20online{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20store{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nPosso criar uma loja on-line?\n</h4>\n<p>\n<p>Sim, com o Editor do Elementor Pro WooCommerce Builder, você pode personalizar cada página da sua loja virtual para criar uma incrível experiência aos clientes que irá impulsionar as vendas.</p>\n</p>\n<dt id=\"does{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20it{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20work{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20with{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20other{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20wordpress{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20plugins{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nFunciona com outros plugins do WordPress?\n</h4>\n<p>\n<p>Ele funciona com quase todos os plugins. Se você encontrar um problema de incompatibilidade, nos informe e também ao plugin que está em conflito com o Editor do Elementor.</p>\n</p>\n<dt id=\"do{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20need{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20to{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20know{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20how{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20to{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20code{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nPreciso saber programar?\n</h4>\n<p>\n<p>Não! O Editor do Elementor fornece todos os widgets e recursos que você precisa para criar um site profissional sem usar código.</p>\n</p>\n<dt id=\"do{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20need{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20to{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20know{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20how{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20to{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20design{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nPreciso saber sobre design?\n</h4>\n<p>\n<p>Não, você pode escolher entre kits e modelos desenvolvidos profissionalmente, que se adaptam a todos os segmentos e têm tudo o que você precisa para criar seu próprio site profissional.</p>\n</p>\n<dt id=\"will{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20elementor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20editor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20slow{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20down{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20my{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20website{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nO Editor do Elementor vai deixar meu site mais lento?\n</h4>\n<p>\n<p>Como o Elementor prioriza velocidade e desempenho, você desfruta de um desempenho melhor e mais rápido a cada nova versão do Editor. Ao testar o mesmo layout de página em versões mais antigas, você pode ver uma melhoria significativa no desempenho, de uma pontuação de 82 no Google PageSpeed Insight na versão 3.1 para uma pontuação de 95 na versão 3.5.</p>\n</p>\n<dt id=\"is{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20my{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20site{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20secure{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20with{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20elementor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20editor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nMeu site é seguro com o Editor do Elementor?\n</h4>\n<p>\n<p>A segurança do seu site é extremamente importante para nós, e tomamos medidas proativas para garantir que seus sites sejam seguros. O Elementor é certificado pelo ISO 27001 e possui uma equipe dedicada de profissionais de segurança que implementa as melhores práticas do setor para máxima segurança e conformidade, 24 horas por dia, 7 dias por semana.</p>\n<p>Também há um programa gerenciado de segurança de recompensa por erros, utilizando o poder da comunidade ao ativar a detecção de vulnerabilidades 24 horas por dia, 7 dias por semana, durante todo o ano.</p>\n</p>\n<dt id=\"can{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20buy{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20templates{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20separately{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nPosso comprar modelos separadamente?\n</h4>\n<p>\n<p>Claro, você pode usar qualquer modelo compatível com o Editor do Elementor.</p>\n</p>\n<dt id=\"is{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20elementor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20editor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20compatible{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20with{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20post{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20and{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20custom{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20post{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20types{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nO Editor do Elementor, é compatível com posts e tipos de post personalizados?\n</h4>\n<p>\n<p>Claro que sim! Você pode definir quais tipos de post irão ativar o Elementor na página de configurações.</p>\n</p>\n<dt id=\"what{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20is{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20the{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20difference{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20between{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20elementor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}E2{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}99s{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20free{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20editor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20plugin{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20and{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20elementor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20editor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20pro{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nQual é a diferença entre o editor do plugin gratuito do Elementor, e o do Elementor Pro?\n</h4>\n<p>\n<p>A versão gratuita do Editor do Elementor permite que você explore nosso revolucionário editor ao vivo do tipo arrastar e soltar, widgets básicos e modelos. O Editor do Elementor Pro (Essential, Advanced, Expert, Studio e Agency) oferece ferramentas mais profissionais que aceleram seu fluxo de trabalho, dão acesso a suporte humano, ajudam a criar conteúdo mais avançado e convertem visitantes. Veja a comparação completa aqui.</p>\n</p>\n<dt id=\"how{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20can{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20become{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20a{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20contributor{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nComo posso me tornar um colaborador?\n</h4>\n<p>\n<p>Se você quiser contribuir, acesse nosso <a href=\"https://github.com/elementor/elementor\" rel=\"nofollow ugc\">repositório do Elementor no GitHub</a> e veja como pode ajudar. Você também pode adicionar um novo idioma através do site <a href=\"https://go.elementor.com/wp-repo-description-tab-wordpress-plugin-translate/\" rel=\"nofollow ugc\">translate.wordpress.org</a>. Criamos um pequeno guia explicando <a href=\"https://go.elementor.com/wp-repo-description-tab-wordpress-plugin-translate-faq/\" rel=\"nofollow ugc\">como traduzir e localizar o plugin</a>.</p>\n</p>\n\n\";s:9:\"changelog\";s:3999:\"<h4>4.1.4 &#8211; 21/06/2026</h4>\n<ul>\n<li>Correção: melhorada a aplicação das normas de segurança no código, para o processamento de consultas</li>\n</ul>\n<h4>4.1.3 &#8211; 10/06/2026</h4>\n<ul>\n<li>Correção: erros nas capturas de tela da biblioteca na nuvem que impediam os usuários de salvar modelos localmente</li>\n</ul>\n<h4>4.1.2 &#8211; 08/06/2026</h4>\n<ul>\n<li>Ajuste: melhorado o rastreamento do uso de classes globais para uma exclusão mais segura &#8211; Editor atômico</li>\n<li>Correção: a imagem com lightbox herdava os estilos padrão dos botões &#8211; Editor atômico</li>\n<li>Correção: as configurações da imagem não eram salvas ao usar a opção “Inserir a partir do URL” &#8211; Editor atômico</li>\n<li>Correção: os anexos de mídia eram solicitados muitas vezes no editor &#8211; Editor atômico</li>\n<li>Correção: as páginas que usavam classes globais não eram publicadas, ou mostravam estilos ausentes no site ativo &#8211; Editor atômico</li>\n<li>Correção: o contexto do editor não sincronizava corretamente ao alternar entre documentos</li>\n</ul>\n<h4>4.1.1 &#8211; 27/05/2026</h4>\n<ul>\n<li>Correção de segurança: melhorada a aplicação da segurança do código no processamento do conteúdo</li>\n<li>Correção de segurança: melhorada a aplicação da segurança do código no processamento de modelos</li>\n<li>Correção: ao ocultar um filtro, os outros filtros deixam de ser aplicados &#8211; Editor atômico</li>\n</ul>\n<h4>4.1.0 &#8211; 26/05/2026</h4>\n<ul>\n<li>Novo: apresentamos o painel “Sistema de design”, para gerenciar variáveis e classes em um único lugar &#8211; Editor atômico</li>\n<li>Novo: apresentamos o Angie no editor, para ajudar a gerar e modificar layouts, componentes, formulários, classes e variáveis atômicos &#8211; Editor atômico</li>\n<li>Novo: apresentamos a renderização em Markdown, como um experimento em fase alfa, para melhorar a forma como o conteúdo é estruturado para sistemas com IA</li>\n<li>Ajuste: adicionada a função de importação e exportação de variáveis e classes no painel do sistema de design &#8211; Editor atômico</li>\n<li>Ajuste: aumentado o limite de classes para 1000 &#8211; Editor atômico</li>\n<li>Ajuste: adicionada compatibilidade com duplicações de variáveis no gerenciador de variáveis &#8211; Editor atômico</li>\n<li>Ajuste: adicionada compatibilidade com duplicações de classes no campo “Classes” &#8211; Editor atômico</li>\n<li>Ajuste: adicionada compatibilidade com variáveis em controles de estilo adicionais, incluindo efeitos, filtros e sombra de caixa &#8211; Editor atômico</li>\n<li>Ajuste: adicionada compatibilidade com a seleção múltipla ao controle de direção nas interações &#8211; Editor atômico</li>\n<li>Ajuste: adicionadas ações de interação ao painel de histórico &#8211; Editor atômico</li>\n<li>Ajuste: adicionada compatibilidade com valores negativos para a sombra da caixa &#8211; Editor atômico</li>\n<li>Ajuste: melhorada a reordenação das propriedades dos componentes, com compatibilidade total com o recurso de arrastar e soltar &#8211; Editor atômico</li>\n<li>Ajuste: atualizadas a posição e o controle do Z-index, para visibilidade e comportamento &#8211; Editor atômico</li>\n<li>Ajuste: atualizada a versão mínima exigida do WordPress para 6.8</li>\n<li>Ajuste: adicionada a opção “URL externo” ao controle de imagens &#8211; Editor atômico</li>\n<li>Correção: as interações de deslizamento podiam ser aplicadas, sem selecionar uma direção &#8211; Editor atômico</li>\n<li>Correção: a função “Desfazer” não funcionava como o esperado em propriedades individuais de classes &#8211; Editor atômico</li>\n<li>Correção: os valores da família de fontes permanecem nas classes globais após a exclusão &#8211; Editor atômico</li>\n</ul>\n<p><a href=\"https://go.elementor.com/full-changelog/\" rel=\"nofollow ugc\">Consulte o registro de alterações para todas as versões.</a></p>\n\";s:11:\"screenshots\";s:3539:\"<ol><li><a href=\"https://ps.w.org/elementor/assets/screenshot-1.gif?rev=3005087\"><img src=\"https://ps.w.org/elementor/assets/screenshot-1.gif?rev=3005087\" alt=\"&lt;strong&gt;Editor visual de arrastar e soltar&lt;/strong&gt; - Projete e crie os layouts do seu site e coloque qualquer elemento em qualquer lugar da página para obter designs perfeitos em pixels.\"></a><p><strong>Editor visual de arrastar e soltar</strong> - Projete e crie os layouts do seu site e coloque qualquer elemento em qualquer lugar da página para obter designs perfeitos em pixels.</p></li><li><a href=\"https://ps.w.org/elementor/assets/screenshot-2.gif?rev=3005087\"><img src=\"https://ps.w.org/elementor/assets/screenshot-2.gif?rev=3005087\" alt=\"&lt;strong&gt;Sistema de design completo&lt;/strong&gt; - Tenha um fluxo de trabalho profissional e garanta consistência em todo o seu site. Defina suas configurações, use-as globalmente e ajuste-as instantaneamente a qualquer momento.\"></a><p><strong>Sistema de design completo</strong> - Tenha um fluxo de trabalho profissional e garanta consistência em todo o seu site. Defina suas configurações, use-as globalmente e ajuste-as instantaneamente a qualquer momento.</p></li><li><a href=\"https://ps.w.org/elementor/assets/screenshot-3.gif?rev=3005087\"><img src=\"https://ps.w.org/elementor/assets/screenshot-3.gif?rev=3005087\" alt=\"&lt;strong&gt;Design responsivo&lt;/strong&gt; - Edite totalmente o seu site e personalize o comportamento em desktop, tablet e dispositivos móveis para otimizar a experiência do visitante em todos os dispositivos.\"></a><p><strong>Design responsivo</strong> - Edite totalmente o seu site e personalize o comportamento em desktop, tablet e dispositivos móveis para otimizar a experiência do visitante em todos os dispositivos.</p></li><li><a href=\"https://ps.w.org/elementor/assets/screenshot-4.gif?rev=3005087\"><img src=\"https://ps.w.org/elementor/assets/screenshot-4.gif?rev=3005087\" alt=\"&lt;strong&gt;Kits e modelos&lt;/strong&gt; - Inicie rapidamente o seu processo de criação de sites ou se inspire com modelos projetados profissionalmente ou kits completos de sites disponíveis para personalização imediata.\"></a><p><strong>Kits e modelos</strong> - Inicie rapidamente o seu processo de criação de sites ou se inspire com modelos projetados profissionalmente ou kits completos de sites disponíveis para personalização imediata.</p></li><li><a href=\"https://ps.w.org/elementor/assets/screenshot-5.gif?rev=3005087\"><img src=\"https://ps.w.org/elementor/assets/screenshot-5.gif?rev=3005087\" alt=\"&lt;strong&gt;Elementos aninhados&lt;/strong&gt; Aproveite os widgets aninhados do Editor do Elementor para colocar qualquer widget dentro da área de conteúdo de outro widget, como abas e sanfonas, para ter total flexibilidade no design.\"></a><p><strong>Elementos aninhados</strong> Aproveite os widgets aninhados do Editor do Elementor para colocar qualquer widget dentro da área de conteúdo de outro widget, como abas e sanfonas, para ter total flexibilidade no design.</p></li><li><a href=\"https://ps.w.org/elementor/assets/screenshot-6.gif?rev=3005087\"><img src=\"https://ps.w.org/elementor/assets/screenshot-6.gif?rev=3005087\" alt=\"&lt;strong&gt;Efeitos de movimento&lt;/strong&gt; - Adicione animações de entrada e transições a qualquer elemento do seu site para cativar os visitantes.\"></a><p><strong>Efeitos de movimento</strong> - Adicione animações de entrada e transições a qualquer elemento do seu site para cativar os visitantes.</p></li></ol>\";s:7:\"reviews\";s:16863:\"<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">Where is Elementor heading?</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"1 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"1\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/updesignme/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/db41171f090c42c53b0d894a6f73ef286594be59f40900df9b4cd988858e7277?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/db41171f090c42c53b0d894a6f73ef286594be59f40900df9b4cd988858e7277?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/updesignme/\" class=\"reviewer-name\">updesignme</a> em <span class=\"review-date\">julho 3, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>I am very disappointed with Elementor. V4 is utterly unreliable and causing all kinds of erratic behaviour and difficulties. There is limited help resources available, and just don\'t try to contact support, because everything will your fault. I have already moved my hosting away. Seems it\'s time to look for a new page builder too. Not happy Elementor!</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">Editor is frustrating - Broken</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"1 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"1\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/ssiddiqi4/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/79f9621d8ac9c50db9dc0c996ce6210158879b5048dffaeb97b793e050fabccf?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/79f9621d8ac9c50db9dc0c996ce6210158879b5048dffaeb97b793e050fabccf?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/ssiddiqi4/\" class=\"reviewer-name\">ssiddiqi4</a> em <span class=\"review-date\">julho 2, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>I rolled-back to version 4.1.2 after wasting a few frustrating days with v 4.1.4. The Editor was horribly slow to load.  I kept troubleshooting plugins and other tweaks.  Nothing helped, after rolling back to v 4.1.2, I got a working Elementor again. With their ambitious new features, Elementor team did a very good job to make v 4.1.4 useless.</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">Beaucoup trop lourd</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"1 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"1\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/remyrivalis/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/54440a19403fbdef2d9aef49cb10ebf854172c9671df29e9bb1cff3b1c43f28f?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/54440a19403fbdef2d9aef49cb10ebf854172c9671df29e9bb1cff3b1c43f28f?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/remyrivalis/\" class=\"reviewer-name\">remyrivalis</a> em <span class=\"review-date\">julho 1, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>Tout dans ce plugin est trop lourd :</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul><!-- wp:list-item -->\n<li>Admin trop lourde, vous serez peut-être obligé d\'augmenter la mémoire disponible pour pouvoir éditer des pages.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Page en front trop lourde, ralenti le site et globalement mauvais coté SEO.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>Vu les possibilité qu\'offre Gutemberg qui s\'étoffe de plus en plus, je ne recommande vraiment pas ce plugin !</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">Constantly Breaking Customer Websites</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"1 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"1\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/retunes/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/d92391c4a983b3081b5732fbdb32184792777ef175a2c153268f44b2f9cc0174?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/d92391c4a983b3081b5732fbdb32184792777ef175a2c153268f44b2f9cc0174?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/retunes/\" class=\"reviewer-name\">retunes</a> em <span class=\"review-date\">junho 30, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>Best Client Experience</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">Not intuitive and hard to manage</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"2 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"2\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/strokehouse/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/aa5e9e5c93b173f9862f5be628d1cc9fc781b9238d31938a90cd9e69124ac1ac?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/aa5e9e5c93b173f9862f5be628d1cc9fc781b9238d31938a90cd9e69124ac1ac?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/strokehouse/\" class=\"reviewer-name\">strokehouse</a> em <span class=\"review-date\">junho 28, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>Some tasks such as finding my templates are impossible. Poorly designed from top to bottom. Unfortunately we\'re stuck using this product due to other product relying in this.</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">The most horrible update in Elementor&#039;s history.</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"1 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"1\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/hektor777/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/339bd3a59d9dcfa5228dff52f8ad3f88209f49914f3ed56768655046addc79e5?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/339bd3a59d9dcfa5228dff52f8ad3f88209f49914f3ed56768655046addc79e5?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/hektor777/\" class=\"reviewer-name\">hektor777</a> em <span class=\"review-date\">junho 26, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>Messy widgets, unfriendly menu bars, lack of customization of widgets, severe slowdown, etc. All these problems have catastrophically reduced Elementor\'s score after the 4.1.4 update. Please go back to version 4.1.2, guys.</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">excelente</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"5 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"5\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/dalbarracin/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/237e6522203622d543d7ef11aa2ec86cc2ccea61a9564890217ceb779db4a40e?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/237e6522203622d543d7ef11aa2ec86cc2ccea61a9564890217ceb779db4a40e?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/dalbarracin/\" class=\"reviewer-name\"> <small>(dalbarracin)</small></a> em <span class=\"review-date\">junho 25, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>Lo estoy usando y las prestaciones que tiene son geniales</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">No more updates for me</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"2 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"2\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/dimaspante/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/eb70e1d20f4b5b3a4ed029e702167f04468693d1128b18fad9aff59c6d269a87?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/eb70e1d20f4b5b3a4ed029e702167f04468693d1128b18fad9aff59c6d269a87?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/dimaspante/\" class=\"reviewer-name\">Dimas Pante <small>(dimaspante)</small></a> em <span class=\"review-date\">junho 23, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>The latest versions are extremely confusing and makes no sense. Containers are now full-width flexbox which... what, we have to resize one by one? And why in the world they are appended to the end of the document instead of where I added them? Grids don\'t do that - which means bugs ands more bugs.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>I love Elementor, but the v4 is a huge shot in the dark.</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">Bloatware and Update Nightmare</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"1 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"1\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/bruno05/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/85e0036c0c67ca42d681ea616f8392079347bb7d4c92c0b4c1d27068351203e8?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/85e0036c0c67ca42d681ea616f8392079347bb7d4c92c0b4c1d27068351203e8?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/bruno05/\" class=\"reviewer-name\">bruno05</a> em <span class=\"review-date\">junho 22, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>What\'s with the almost daily updates. Does your dev team not understand how product updates are done? We are a agency licensee for several years and have seen the demise of this great plugin to now a adware/bloatware, that a software like Malwarebytes may soon target. Constant nag, popups, and updates. We spend more time babysitting your product than its worth. Its likely we will not renew ang are looking at Bricks and other alternatives. Just unfortunate.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">Mi piace, ma la questione Atomic andrebbe rivista...</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"3 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"3\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/manuqbit/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/4aab289ffe49bc33cf1d3d4afaa475e8455bb39183774d0f2ddd83a00c76c18e?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/4aab289ffe49bc33cf1d3d4afaa475e8455bb39183774d0f2ddd83a00c76c18e?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/manuqbit/\" class=\"reviewer-name\">manuqbit</a> em <span class=\"review-date\">junho 20, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>Abituato alla versione classica mi trovo davvero in difficoltà ad utilizzare il sistema Atomic.. è complicato e macchinoso, sembra sia intenzionalmente articolato .. io continuo ad usarlo disattivando sempre la nuova funzione che trovo, ad oggi, un vero rompicapo. Semplificare, per favore, semplificare.. </p>\n<!-- /wp:paragraph --></div>\n</div>\n\";}s:17:\"short_description\";s:232:\"O Elementor Website Builder tem tudo: construtor de páginas com recurso de arrastar e soltar, editor atômico, design com precisão em pixels, sistemas de estilo globais e reutilizáveis, compatibilidade com dispositivos móveis…\";s:13:\"download_link\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.1.4.zip\";s:14:\"upgrade_notice\";a:0:{}s:11:\"screenshots\";a:6:{i:1;a:2:{s:3:\"src\";s:62:\"https://ps.w.org/elementor/assets/screenshot-1.gif?rev=3005087\";s:7:\"caption\";s:188:\"<strong>Editor visual de arrastar e soltar</strong> - Projete e crie os layouts do seu site e coloque qualquer elemento em qualquer lugar da página para obter designs perfeitos em pixels.\";}i:2;a:2:{s:3:\"src\";s:62:\"https://ps.w.org/elementor/assets/screenshot-2.gif?rev=3005087\";s:7:\"caption\";s:226:\"<strong>Sistema de design completo</strong> - Tenha um fluxo de trabalho profissional e garanta consistência em todo o seu site. Defina suas configurações, use-as globalmente e ajuste-as instantaneamente a qualquer momento.\";}i:3;a:2:{s:3:\"src\";s:62:\"https://ps.w.org/elementor/assets/screenshot-3.gif?rev=3005087\";s:7:\"caption\";s:204:\"<strong>Design responsivo</strong> - Edite totalmente o seu site e personalize o comportamento em desktop, tablet e dispositivos móveis para otimizar a experiência do visitante em todos os dispositivos.\";}i:4;a:2:{s:3:\"src\";s:62:\"https://ps.w.org/elementor/assets/screenshot-4.gif?rev=3005087\";s:7:\"caption\";s:216:\"<strong>Kits e modelos</strong> - Inicie rapidamente o seu processo de criação de sites ou se inspire com modelos projetados profissionalmente ou kits completos de sites disponíveis para personalização imediata.\";}i:5;a:2:{s:3:\"src\";s:62:\"https://ps.w.org/elementor/assets/screenshot-5.gif?rev=3005087\";s:7:\"caption\";s:227:\"<strong>Elementos aninhados</strong> Aproveite os widgets aninhados do Editor do Elementor para colocar qualquer widget dentro da área de conteúdo de outro widget, como abas e sanfonas, para ter total flexibilidade no design.\";}i:6;a:2:{s:3:\"src\";s:62:\"https://ps.w.org/elementor/assets/screenshot-6.gif?rev=3005087\";s:7:\"caption\";s:146:\"<strong>Efeitos de movimento</strong> - Adicione animações de entrada e transições a qualquer elemento do seu site para cativar os visitantes.\";}}s:4:\"tags\";a:5:{s:13:\"drag-and-drop\";s:13:\"drag-and-drop\";s:6:\"editor\";s:6:\"editor\";s:9:\"elementor\";s:9:\"elementor\";s:12:\"landing-page\";s:12:\"landing page\";s:12:\"page-builder\";s:12:\"page builder\";}s:8:\"versions\";a:441:{s:5:\"3.0.0\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.0.0.zip\";s:5:\"3.0.1\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.0.1.zip\";s:6:\"3.0.10\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.0.10.zip\";s:6:\"3.0.11\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.0.11.zip\";s:6:\"3.0.12\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.0.12.zip\";s:6:\"3.0.13\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.0.13.zip\";s:6:\"3.0.14\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.0.14.zip\";s:6:\"3.0.15\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.0.15.zip\";s:6:\"3.0.16\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.0.16.zip\";s:5:\"3.0.2\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.0.2.zip\";s:5:\"3.0.3\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.0.3.zip\";s:5:\"3.0.4\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.0.4.zip\";s:5:\"3.0.5\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.0.5.zip\";s:5:\"3.0.6\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.0.6.zip\";s:5:\"3.0.7\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.0.7.zip\";s:5:\"3.0.8\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.0.8.zip\";s:7:\"3.0.8.1\";s:60:\"https://downloads.wordpress.org/plugin/elementor.3.0.8.1.zip\";s:5:\"3.0.9\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.0.9.zip\";s:5:\"3.1.0\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.1.0.zip\";s:11:\"3.1.0-beta1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.1.0-beta1.zip\";s:11:\"3.1.0-beta2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.1.0-beta2.zip\";s:11:\"3.1.0-beta3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.1.0-beta3.zip\";s:11:\"3.1.0-beta4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.1.0-beta4.zip\";s:10:\"3.1.0-dev1\";s:63:\"https://downloads.wordpress.org/plugin/elementor.3.1.0-dev1.zip\";s:10:\"3.1.0-dev2\";s:63:\"https://downloads.wordpress.org/plugin/elementor.3.1.0-dev2.zip\";s:10:\"3.1.0-dev3\";s:63:\"https://downloads.wordpress.org/plugin/elementor.3.1.0-dev3.zip\";s:5:\"3.1.1\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.1.1.zip\";s:5:\"3.1.2\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.1.2.zip\";s:5:\"3.1.3\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.1.3.zip\";s:5:\"3.1.4\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.1.4.zip\";s:6:\"3.10.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.10.0.zip\";s:11:\"3.10.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.10.0-dev1.zip\";s:6:\"3.10.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.10.1.zip\";s:6:\"3.10.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.10.2.zip\";s:6:\"3.11.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.11.0.zip\";s:12:\"3.11.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.11.0-beta1.zip\";s:12:\"3.11.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.11.0-beta2.zip\";s:12:\"3.11.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.11.0-beta3.zip\";s:11:\"3.11.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.11.0-dev1.zip\";s:11:\"3.11.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.11.0-dev2.zip\";s:11:\"3.11.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.11.0-dev3.zip\";s:6:\"3.11.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.11.1.zip\";s:6:\"3.11.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.11.2.zip\";s:6:\"3.11.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.11.3.zip\";s:6:\"3.11.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.11.4.zip\";s:6:\"3.11.5\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.11.5.zip\";s:6:\"3.12.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.12.0.zip\";s:6:\"3.12.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.12.1.zip\";s:6:\"3.12.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.12.2.zip\";s:6:\"3.13.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.13.0.zip\";s:12:\"3.13.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.13.0-beta1.zip\";s:12:\"3.13.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.13.0-beta2.zip\";s:12:\"3.13.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.13.0-beta3.zip\";s:11:\"3.13.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.13.0-dev3.zip\";s:11:\"3.13.0-dev4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.13.0-dev4.zip\";s:6:\"3.13.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.13.1.zip\";s:6:\"3.13.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.13.2.zip\";s:6:\"3.13.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.13.3.zip\";s:6:\"3.13.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.13.4.zip\";s:6:\"3.14.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.14.0.zip\";s:12:\"3.14.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.14.0-beta1.zip\";s:12:\"3.14.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.14.0-beta2.zip\";s:12:\"3.14.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.14.0-beta3.zip\";s:12:\"3.14.0-beta4\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.14.0-beta4.zip\";s:12:\"3.14.0-beta5\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.14.0-beta5.zip\";s:6:\"3.14.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.14.1.zip\";s:6:\"3.15.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.15.0.zip\";s:6:\"3.15.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.15.1.zip\";s:6:\"3.15.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.15.2.zip\";s:6:\"3.15.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.15.3.zip\";s:6:\"3.16.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.16.0.zip\";s:12:\"3.16.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.16.0-beta3.zip\";s:12:\"3.16.0-beta4\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.16.0-beta4.zip\";s:11:\"3.16.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.16.0-dev1.zip\";s:11:\"3.16.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.16.0-dev2.zip\";s:6:\"3.16.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.16.1.zip\";s:6:\"3.16.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.16.2.zip\";s:6:\"3.16.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.16.3.zip\";s:6:\"3.16.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.16.4.zip\";s:6:\"3.16.5\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.16.5.zip\";s:6:\"3.16.6\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.16.6.zip\";s:6:\"3.17.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.17.0.zip\";s:11:\"3.17.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.17.0-dev2.zip\";s:11:\"3.17.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.17.0-dev3.zip\";s:11:\"3.17.0-dev4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.17.0-dev4.zip\";s:6:\"3.17.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.17.1.zip\";s:6:\"3.17.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.17.2.zip\";s:6:\"3.17.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.17.3.zip\";s:6:\"3.18.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.18.0.zip\";s:12:\"3.18.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.18.0-beta1.zip\";s:12:\"3.18.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.18.0-beta2.zip\";s:12:\"3.18.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.18.0-beta3.zip\";s:12:\"3.18.0-beta4\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.18.0-beta4.zip\";s:11:\"3.18.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.18.0-dev1.zip\";s:6:\"3.18.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.18.1.zip\";s:6:\"3.18.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.18.2.zip\";s:6:\"3.18.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.18.3.zip\";s:6:\"3.19.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.19.0.zip\";s:12:\"3.19.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.19.0-beta1.zip\";s:12:\"3.19.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.19.0-beta2.zip\";s:12:\"3.19.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.19.0-beta3.zip\";s:12:\"3.19.0-beta4\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.19.0-beta4.zip\";s:12:\"3.19.0-beta5\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.19.0-beta5.zip\";s:12:\"3.19.0-beta6\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.19.0-beta6.zip\";s:11:\"3.19.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.19.0-dev1.zip\";s:11:\"3.19.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.19.0-dev2.zip\";s:11:\"3.19.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.19.0-dev3.zip\";s:11:\"3.19.0-dev4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.19.0-dev4.zip\";s:11:\"3.19.0-dev5\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.19.0-dev5.zip\";s:11:\"3.19.0-dev6\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.19.0-dev6.zip\";s:6:\"3.19.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.19.1.zip\";s:6:\"3.19.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.19.2.zip\";s:6:\"3.19.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.19.3.zip\";s:6:\"3.19.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.19.4.zip\";s:5:\"3.2.0\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.2.0.zip\";s:5:\"3.2.1\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.2.1.zip\";s:5:\"3.2.2\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.2.2.zip\";s:5:\"3.2.3\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.2.3.zip\";s:5:\"3.2.4\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.2.4.zip\";s:5:\"3.2.5\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.2.5.zip\";s:6:\"3.20.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.20.0.zip\";s:12:\"3.20.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.20.0-beta1.zip\";s:12:\"3.20.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.20.0-beta2.zip\";s:12:\"3.20.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.20.0-beta3.zip\";s:12:\"3.20.0-beta4\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.20.0-beta4.zip\";s:11:\"3.20.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.20.0-dev1.zip\";s:11:\"3.20.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.20.0-dev2.zip\";s:11:\"3.20.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.20.0-dev3.zip\";s:11:\"3.20.0-dev4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.20.0-dev4.zip\";s:6:\"3.20.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.20.1.zip\";s:6:\"3.20.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.20.2.zip\";s:6:\"3.20.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.20.3.zip\";s:6:\"3.20.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.20.4.zip\";s:6:\"3.21.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.21.0.zip\";s:12:\"3.21.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.21.0-beta1.zip\";s:12:\"3.21.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.21.0-beta2.zip\";s:12:\"3.21.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.21.0-beta3.zip\";s:11:\"3.21.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.21.0-dev1.zip\";s:11:\"3.21.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.21.0-dev2.zip\";s:11:\"3.21.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.21.0-dev3.zip\";s:6:\"3.21.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.21.1.zip\";s:6:\"3.21.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.21.2.zip\";s:6:\"3.21.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.21.3.zip\";s:6:\"3.21.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.21.4.zip\";s:6:\"3.21.5\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.21.5.zip\";s:6:\"3.21.6\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.21.6.zip\";s:6:\"3.21.7\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.21.7.zip\";s:6:\"3.21.8\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.21.8.zip\";s:6:\"3.22.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.22.0.zip\";s:12:\"3.22.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.22.0-beta1.zip\";s:12:\"3.22.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.22.0-beta2.zip\";s:12:\"3.22.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.22.0-beta3.zip\";s:12:\"3.22.0-beta4\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.22.0-beta4.zip\";s:12:\"3.22.0-beta5\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.22.0-beta5.zip\";s:12:\"3.22.0-beta6\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.22.0-beta6.zip\";s:11:\"3.22.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.22.0-dev1.zip\";s:11:\"3.22.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.22.0-dev2.zip\";s:11:\"3.22.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.22.0-dev3.zip\";s:11:\"3.22.0-dev4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.22.0-dev4.zip\";s:11:\"3.22.0-dev5\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.22.0-dev5.zip\";s:11:\"3.22.0-dev6\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.22.0-dev6.zip\";s:6:\"3.22.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.22.1.zip\";s:6:\"3.22.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.22.2.zip\";s:6:\"3.22.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.22.3.zip\";s:6:\"3.23.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.23.0.zip\";s:12:\"3.23.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.23.0-beta1.zip\";s:12:\"3.23.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.23.0-beta2.zip\";s:12:\"3.23.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.23.0-beta3.zip\";s:12:\"3.23.0-beta4\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.23.0-beta4.zip\";s:12:\"3.23.0-beta5\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.23.0-beta5.zip\";s:12:\"3.23.0-beta6\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.23.0-beta6.zip\";s:11:\"3.23.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.23.0-dev1.zip\";s:11:\"3.23.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.23.0-dev2.zip\";s:11:\"3.23.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.23.0-dev3.zip\";s:11:\"3.23.0-dev4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.23.0-dev4.zip\";s:11:\"3.23.0-dev5\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.23.0-dev5.zip\";s:11:\"3.23.0-dev6\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.23.0-dev6.zip\";s:6:\"3.23.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.23.1.zip\";s:6:\"3.23.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.23.2.zip\";s:6:\"3.23.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.23.3.zip\";s:6:\"3.23.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.23.4.zip\";s:6:\"3.24.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.24.0.zip\";s:12:\"3.24.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.24.0-beta1.zip\";s:12:\"3.24.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.24.0-beta2.zip\";s:12:\"3.24.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.24.0-beta3.zip\";s:11:\"3.24.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.24.0-dev1.zip\";s:11:\"3.24.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.24.0-dev2.zip\";s:11:\"3.24.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.24.0-dev3.zip\";s:6:\"3.24.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.24.1.zip\";s:6:\"3.24.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.24.2.zip\";s:6:\"3.24.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.24.3.zip\";s:6:\"3.24.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.24.4.zip\";s:6:\"3.24.5\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.24.5.zip\";s:6:\"3.24.6\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.24.6.zip\";s:6:\"3.24.7\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.24.7.zip\";s:6:\"3.24.8\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.24.8.zip\";s:6:\"3.25.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.25.0.zip\";s:12:\"3.25.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.25.0-beta1.zip\";s:12:\"3.25.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.25.0-beta2.zip\";s:12:\"3.25.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.25.0-beta3.zip\";s:11:\"3.25.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.25.0-dev1.zip\";s:11:\"3.25.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.25.0-dev2.zip\";s:11:\"3.25.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.25.0-dev3.zip\";s:6:\"3.25.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.25.1.zip\";s:7:\"3.25.10\";s:60:\"https://downloads.wordpress.org/plugin/elementor.3.25.10.zip\";s:7:\"3.25.11\";s:60:\"https://downloads.wordpress.org/plugin/elementor.3.25.11.zip\";s:6:\"3.25.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.25.2.zip\";s:6:\"3.25.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.25.3.zip\";s:6:\"3.25.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.25.4.zip\";s:6:\"3.25.5\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.25.5.zip\";s:6:\"3.25.6\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.25.6.zip\";s:6:\"3.25.7\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.25.7.zip\";s:6:\"3.25.8\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.25.8.zip\";s:6:\"3.25.9\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.25.9.zip\";s:6:\"3.26.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.26.0.zip\";s:12:\"3.26.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.26.0-beta1.zip\";s:12:\"3.26.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.26.0-beta2.zip\";s:12:\"3.26.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.26.0-beta3.zip\";s:12:\"3.26.0-beta4\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.26.0-beta4.zip\";s:12:\"3.26.0-beta5\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.26.0-beta5.zip\";s:11:\"3.26.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.26.0-dev1.zip\";s:11:\"3.26.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.26.0-dev2.zip\";s:11:\"3.26.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.26.0-dev3.zip\";s:11:\"3.26.0-dev4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.26.0-dev4.zip\";s:11:\"3.26.0-dev5\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.26.0-dev5.zip\";s:6:\"3.26.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.26.1.zip\";s:6:\"3.26.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.26.2.zip\";s:6:\"3.26.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.26.3.zip\";s:6:\"3.26.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.26.4.zip\";s:6:\"3.26.5\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.26.5.zip\";s:6:\"3.27.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.27.0.zip\";s:12:\"3.27.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.27.0-beta1.zip\";s:12:\"3.27.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.27.0-beta2.zip\";s:11:\"3.27.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.27.0-dev1.zip\";s:11:\"3.27.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.27.0-dev2.zip\";s:6:\"3.27.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.27.1.zip\";s:6:\"3.27.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.27.2.zip\";s:6:\"3.27.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.27.3.zip\";s:6:\"3.27.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.27.4.zip\";s:6:\"3.27.5\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.27.5.zip\";s:6:\"3.27.6\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.27.6.zip\";s:6:\"3.27.7\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.27.7.zip\";s:6:\"3.28.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.28.0.zip\";s:12:\"3.28.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.28.0-beta1.zip\";s:12:\"3.28.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.28.0-beta2.zip\";s:12:\"3.28.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.28.0-beta3.zip\";s:11:\"3.28.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.28.0-dev1.zip\";s:11:\"3.28.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.28.0-dev2.zip\";s:11:\"3.28.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.28.0-dev3.zip\";s:6:\"3.28.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.28.1.zip\";s:6:\"3.28.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.28.2.zip\";s:6:\"3.28.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.28.3.zip\";s:6:\"3.28.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.28.4.zip\";s:6:\"3.29.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.29.0.zip\";s:12:\"3.29.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.29.0-beta1.zip\";s:12:\"3.29.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.29.0-beta2.zip\";s:12:\"3.29.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.29.0-beta3.zip\";s:12:\"3.29.0-beta4\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.29.0-beta4.zip\";s:11:\"3.29.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.29.0-dev1.zip\";s:11:\"3.29.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.29.0-dev2.zip\";s:11:\"3.29.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.29.0-dev3.zip\";s:11:\"3.29.0-dev4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.29.0-dev4.zip\";s:6:\"3.29.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.29.1.zip\";s:6:\"3.29.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.29.2.zip\";s:5:\"3.3.0\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.3.0.zip\";s:5:\"3.3.1\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.3.1.zip\";s:6:\"3.30.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.30.0.zip\";s:12:\"3.30.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.30.0-beta1.zip\";s:12:\"3.30.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.30.0-beta2.zip\";s:12:\"3.30.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.30.0-beta3.zip\";s:11:\"3.30.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.30.0-dev1.zip\";s:11:\"3.30.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.30.0-dev2.zip\";s:11:\"3.30.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.30.0-dev3.zip\";s:6:\"3.30.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.30.1.zip\";s:6:\"3.30.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.30.2.zip\";s:6:\"3.30.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.30.3.zip\";s:6:\"3.30.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.30.4.zip\";s:6:\"3.31.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.31.0.zip\";s:12:\"3.31.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.31.0-beta1.zip\";s:12:\"3.31.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.31.0-beta2.zip\";s:11:\"3.31.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.31.0-dev1.zip\";s:11:\"3.31.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.31.0-dev2.zip\";s:6:\"3.31.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.31.1.zip\";s:6:\"3.31.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.31.2.zip\";s:6:\"3.31.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.31.3.zip\";s:6:\"3.31.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.31.4.zip\";s:6:\"3.31.5\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.31.5.zip\";s:6:\"3.32.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.32.0.zip\";s:12:\"3.32.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.32.0-beta1.zip\";s:12:\"3.32.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.32.0-beta2.zip\";s:12:\"3.32.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.32.0-beta3.zip\";s:11:\"3.32.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.32.0-dev1.zip\";s:11:\"3.32.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.32.0-dev2.zip\";s:11:\"3.32.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.32.0-dev3.zip\";s:6:\"3.32.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.32.1.zip\";s:6:\"3.32.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.32.2.zip\";s:6:\"3.32.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.32.3.zip\";s:6:\"3.32.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.32.4.zip\";s:6:\"3.32.5\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.32.5.zip\";s:6:\"3.33.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.33.0.zip\";s:12:\"3.33.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.33.0-beta1.zip\";s:12:\"3.33.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.33.0-beta2.zip\";s:12:\"3.33.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.33.0-beta3.zip\";s:12:\"3.33.0-beta4\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.33.0-beta4.zip\";s:11:\"3.33.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.33.0-dev1.zip\";s:11:\"3.33.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.33.0-dev2.zip\";s:11:\"3.33.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.33.0-dev3.zip\";s:11:\"3.33.0-dev4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.33.0-dev4.zip\";s:6:\"3.33.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.33.1.zip\";s:6:\"3.33.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.33.2.zip\";s:6:\"3.33.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.33.3.zip\";s:6:\"3.33.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.33.4.zip\";s:6:\"3.33.5\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.33.5.zip\";s:6:\"3.33.6\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.33.6.zip\";s:6:\"3.34.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.34.0.zip\";s:12:\"3.34.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.34.0-beta1.zip\";s:12:\"3.34.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.34.0-beta2.zip\";s:12:\"3.34.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.34.0-beta3.zip\";s:11:\"3.34.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.34.0-dev1.zip\";s:11:\"3.34.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.34.0-dev2.zip\";s:6:\"3.34.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.34.1.zip\";s:6:\"3.34.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.34.2.zip\";s:6:\"3.34.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.34.3.zip\";s:6:\"3.34.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.34.4.zip\";s:6:\"3.35.0\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.35.0.zip\";s:12:\"3.35.0-beta1\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.35.0-beta1.zip\";s:12:\"3.35.0-beta2\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.35.0-beta2.zip\";s:12:\"3.35.0-beta3\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.35.0-beta3.zip\";s:12:\"3.35.0-beta4\";s:65:\"https://downloads.wordpress.org/plugin/elementor.3.35.0-beta4.zip\";s:11:\"3.35.0-dev1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.35.0-dev1.zip\";s:11:\"3.35.0-dev2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.35.0-dev2.zip\";s:11:\"3.35.0-dev3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.35.0-dev3.zip\";s:11:\"3.35.0-dev4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.35.0-dev4.zip\";s:6:\"3.35.1\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.35.1.zip\";s:6:\"3.35.2\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.35.2.zip\";s:6:\"3.35.3\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.35.3.zip\";s:6:\"3.35.4\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.35.4.zip\";s:6:\"3.35.5\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.35.5.zip\";s:6:\"3.35.6\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.35.6.zip\";s:6:\"3.35.7\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.35.7.zip\";s:6:\"3.35.8\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.35.8.zip\";s:6:\"3.35.9\";s:59:\"https://downloads.wordpress.org/plugin/elementor.3.35.9.zip\";s:5:\"3.4.0\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.4.0.zip\";s:10:\"3.4.0-dev7\";s:63:\"https://downloads.wordpress.org/plugin/elementor.3.4.0-dev7.zip\";s:10:\"3.4.0-dev8\";s:63:\"https://downloads.wordpress.org/plugin/elementor.3.4.0-dev8.zip\";s:10:\"3.4.0-dev9\";s:63:\"https://downloads.wordpress.org/plugin/elementor.3.4.0-dev9.zip\";s:5:\"3.4.1\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.4.1.zip\";s:5:\"3.4.2\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.4.2.zip\";s:5:\"3.4.3\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.4.3.zip\";s:5:\"3.4.4\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.4.4.zip\";s:5:\"3.4.5\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.4.5.zip\";s:5:\"3.4.6\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.4.6.zip\";s:5:\"3.4.7\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.4.7.zip\";s:5:\"3.4.8\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.4.8.zip\";s:5:\"3.5.0\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.5.0.zip\";s:11:\"3.5.0-beta1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.5.0-beta1.zip\";s:11:\"3.5.0-beta2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.5.0-beta2.zip\";s:11:\"3.5.0-beta3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.5.0-beta3.zip\";s:11:\"3.5.0-beta4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.5.0-beta4.zip\";s:11:\"3.5.0-beta5\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.5.0-beta5.zip\";s:11:\"3.5.0-beta7\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.5.0-beta7.zip\";s:11:\"3.5.0-beta8\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.5.0-beta8.zip\";s:10:\"3.5.0-dev8\";s:63:\"https://downloads.wordpress.org/plugin/elementor.3.5.0-dev8.zip\";s:10:\"3.5.0-dev9\";s:63:\"https://downloads.wordpress.org/plugin/elementor.3.5.0-dev9.zip\";s:5:\"3.5.1\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.5.1.zip\";s:5:\"3.5.2\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.5.2.zip\";s:5:\"3.5.3\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.5.3.zip\";s:5:\"3.5.4\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.5.4.zip\";s:5:\"3.5.5\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.5.5.zip\";s:5:\"3.5.6\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.5.6.zip\";s:5:\"3.6.0\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.6.0.zip\";s:11:\"3.6.0-beta1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.6.0-beta1.zip\";s:11:\"3.6.0-beta2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.6.0-beta2.zip\";s:11:\"3.6.0-beta3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.6.0-beta3.zip\";s:11:\"3.6.0-beta4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.6.0-beta4.zip\";s:11:\"3.6.0-beta5\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.6.0-beta5.zip\";s:10:\"3.6.0-dev1\";s:63:\"https://downloads.wordpress.org/plugin/elementor.3.6.0-dev1.zip\";s:11:\"3.6.0-dev10\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.6.0-dev10.zip\";s:5:\"3.6.1\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.6.1.zip\";s:5:\"3.6.2\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.6.2.zip\";s:5:\"3.6.3\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.6.3.zip\";s:5:\"3.6.4\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.6.4.zip\";s:5:\"3.6.5\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.6.5.zip\";s:5:\"3.6.6\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.6.6.zip\";s:5:\"3.6.7\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.6.7.zip\";s:5:\"3.6.8\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.6.8.zip\";s:5:\"3.7.0\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.7.0.zip\";s:11:\"3.7.0-beta1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.7.0-beta1.zip\";s:11:\"3.7.0-beta2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.7.0-beta2.zip\";s:11:\"3.7.0-beta3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.7.0-beta3.zip\";s:11:\"3.7.0-beta4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.7.0-beta4.zip\";s:10:\"3.7.0-dev1\";s:63:\"https://downloads.wordpress.org/plugin/elementor.3.7.0-dev1.zip\";s:5:\"3.7.1\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.7.1.zip\";s:5:\"3.7.2\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.7.2.zip\";s:5:\"3.7.3\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.7.3.zip\";s:5:\"3.7.4\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.7.4.zip\";s:5:\"3.7.5\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.7.5.zip\";s:5:\"3.7.6\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.7.6.zip\";s:5:\"3.7.7\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.7.7.zip\";s:5:\"3.7.8\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.7.8.zip\";s:5:\"3.8.0\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.8.0.zip\";s:11:\"3.8.0-beta1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.8.0-beta1.zip\";s:11:\"3.8.0-beta2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.8.0-beta2.zip\";s:11:\"3.8.0-beta3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.3.8.0-beta3.zip\";s:5:\"3.8.1\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.8.1.zip\";s:5:\"3.9.0\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.9.0.zip\";s:5:\"3.9.1\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.9.1.zip\";s:5:\"3.9.2\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.9.2.zip\";s:5:\"4.0.0\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.0.0.zip\";s:11:\"4.0.0-beta1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.4.0.0-beta1.zip\";s:11:\"4.0.0-beta2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.4.0.0-beta2.zip\";s:11:\"4.0.0-beta3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.4.0.0-beta3.zip\";s:11:\"4.0.0-beta4\";s:64:\"https://downloads.wordpress.org/plugin/elementor.4.0.0-beta4.zip\";s:11:\"4.0.0-beta5\";s:64:\"https://downloads.wordpress.org/plugin/elementor.4.0.0-beta5.zip\";s:10:\"4.0.0-dev1\";s:63:\"https://downloads.wordpress.org/plugin/elementor.4.0.0-dev1.zip\";s:10:\"4.0.0-dev2\";s:63:\"https://downloads.wordpress.org/plugin/elementor.4.0.0-dev2.zip\";s:10:\"4.0.0-dev3\";s:63:\"https://downloads.wordpress.org/plugin/elementor.4.0.0-dev3.zip\";s:10:\"4.0.0-dev4\";s:63:\"https://downloads.wordpress.org/plugin/elementor.4.0.0-dev4.zip\";s:10:\"4.0.0-dev5\";s:63:\"https://downloads.wordpress.org/plugin/elementor.4.0.0-dev5.zip\";s:5:\"4.0.1\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.0.1.zip\";s:5:\"4.0.2\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.0.2.zip\";s:5:\"4.0.3\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.0.3.zip\";s:5:\"4.0.4\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.0.4.zip\";s:5:\"4.0.5\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.0.5.zip\";s:5:\"4.0.6\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.0.6.zip\";s:5:\"4.0.7\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.0.7.zip\";s:5:\"4.0.8\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.0.8.zip\";s:5:\"4.0.9\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.0.9.zip\";s:5:\"4.1.0\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.1.0.zip\";s:11:\"4.1.0-beta1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.4.1.0-beta1.zip\";s:11:\"4.1.0-beta2\";s:64:\"https://downloads.wordpress.org/plugin/elementor.4.1.0-beta2.zip\";s:11:\"4.1.0-beta3\";s:64:\"https://downloads.wordpress.org/plugin/elementor.4.1.0-beta3.zip\";s:10:\"4.1.0-dev1\";s:63:\"https://downloads.wordpress.org/plugin/elementor.4.1.0-dev1.zip\";s:10:\"4.1.0-dev2\";s:63:\"https://downloads.wordpress.org/plugin/elementor.4.1.0-dev2.zip\";s:10:\"4.1.0-dev3\";s:63:\"https://downloads.wordpress.org/plugin/elementor.4.1.0-dev3.zip\";s:5:\"4.1.1\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.1.1.zip\";s:5:\"4.1.2\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.1.2.zip\";s:5:\"4.1.3\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.1.3.zip\";s:5:\"4.1.4\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.1.4.zip\";s:11:\"4.2.0-beta1\";s:64:\"https://downloads.wordpress.org/plugin/elementor.4.2.0-beta1.zip\";s:5:\"trunk\";s:52:\"https://downloads.wordpress.org/plugin/elementor.zip\";}s:14:\"business_model\";s:10:\"commercial\";s:14:\"repository_url\";s:0:\"\";s:22:\"commercial_support_url\";s:94:\"https://elementor.com/support/?utm_source=wp-repo&utm_medium=link&utm_campaign=premium-support\";s:11:\"donate_link\";s:0:\"\";s:7:\"banners\";a:2:{s:3:\"low\";s:64:\"https://ps.w.org/elementor/assets/banner-772x250.png?rev=3443226\";s:4:\"high\";s:65:\"https://ps.w.org/elementor/assets/banner-1544x500.png?rev=3443226\";}s:5:\"icons\";a:2:{s:2:\"1x\";s:62:\"https://ps.w.org/elementor/assets/icon-128x128.gif?rev=3444228\";s:2:\"2x\";s:62:\"https://ps.w.org/elementor/assets/icon-256x256.gif?rev=3444228\";}s:12:\"preview_link\";s:0:\"\";s:4:\"Name\";s:84:\"Elementor Website Builder &#8211; muito mais do que apenas um construtor de páginas\";}s:19:\"the-events-calendar\";a:35:{s:4:\"name\";s:19:\"The Events Calendar\";s:4:\"slug\";s:19:\"the-events-calendar\";s:7:\"version\";s:8:\"6.16.5.1\";s:6:\"author\";s:63:\"<a href=\"https://profiles.wordpress.org/stellarwp/\">Nexcess</a>\";s:14:\"author_profile\";s:41:\"https://profiles.wordpress.org/stellarwp/\";s:12:\"contributors\";a:13:{s:17:\"theeventscalendar\";a:3:{s:7:\"profile\";s:49:\"https://profiles.wordpress.org/theeventscalendar/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/435f23ee0f44cdd850b49b16431731ee9995dc2c3f66ce2da24fe11ba49e1dd5?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:19:\"The Events Calendar\";}s:7:\"nexcess\";a:3:{s:7:\"profile\";s:39:\"https://profiles.wordpress.org/nexcess/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/82dfe88cd0ecc6e1400be45554e48d6425e86085f1c0912364d0405b92d5848f?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:7:\"Nexcess\";}s:7:\"borkweb\";a:3:{s:7:\"profile\";s:39:\"https://profiles.wordpress.org/borkweb/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/cc19377aa23016d5b6429e2420f71c551032c4397647ec1d418582ed3a8414b5?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:18:\"Matthew Batchelder\";}s:7:\"bordoni\";a:3:{s:7:\"profile\";s:39:\"https://profiles.wordpress.org/bordoni/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/e3171496e198834c638911ad3c3220bec77871cdf6557eaa9e2a58d16600a1a1?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:15:\"Gustavo Bordoni\";}s:11:\"brianjessee\";a:3:{s:7:\"profile\";s:43:\"https://profiles.wordpress.org/brianjessee/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/a2a3ad9f38044cc01967b3ae4dbb250282d1f82076b7a6c8c8384dd51e005ec4?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:5:\"Brian\";}s:6:\"aguseo\";a:3:{s:7:\"profile\";s:38:\"https://profiles.wordpress.org/aguseo/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/82baf3d642475e757f36697b16e2229970a936b781f1c86cf8740f08a255ff0f?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:13:\"András Guseo\";}s:8:\"camwynsp\";a:3:{s:7:\"profile\";s:40:\"https://profiles.wordpress.org/camwynsp/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/d2eeae6347a2be79b3d224aa9fff25e5d0aca3d18026f96b4c531d2de5b8b790?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:12:\"Stephen Page\";}s:7:\"jentheo\";a:3:{s:7:\"profile\";s:39:\"https://profiles.wordpress.org/jentheo/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/d7c75e17cffe14f16e231a807e0beb7400863d124cca6ac83ea5fffcaec1ce80?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:8:\"Jennifer\";}s:11:\"leahkoerper\";a:3:{s:7:\"profile\";s:43:\"https://profiles.wordpress.org/leahkoerper/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/82a33306f8c3ca72179178253a54f45ab037699e2fef7602f81df5b83b680d6c?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:11:\"leahkoerper\";}s:8:\"lucatume\";a:3:{s:7:\"profile\";s:40:\"https://profiles.wordpress.org/lucatume/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/a4749105e66f40847bdffd6dc201f937280b9f54f4d348063a5728d17f5ca1dd?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:8:\"lucatume\";}s:11:\"neillmcshea\";a:3:{s:7:\"profile\";s:43:\"https://profiles.wordpress.org/neillmcshea/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/cf54e357ba7733d555025d50a854eac709957e900365460a686451419418b34f?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:11:\"neillmcshea\";}s:6:\"vicskf\";a:3:{s:7:\"profile\";s:38:\"https://profiles.wordpress.org/vicskf/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/2a6151d990b5a3c45f1bebb25685cf1845f89e82ce29e2ec14a4f82a9785c4e9?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:14:\"Victor Zarranz\";}s:9:\"zbtirrell\";a:3:{s:7:\"profile\";s:41:\"https://profiles.wordpress.org/zbtirrell/\";s:6:\"avatar\";s:120:\"https://secure.gravatar.com/avatar/9a7363c5cd50c59e5f55f1d528192c4dd240f37e69d6051265a6bbe2e5fbe773?s=96&d=monsterid&r=g\";s:12:\"display_name\";s:12:\"Zach Tirrell\";}}s:8:\"requires\";s:3:\"6.7\";s:6:\"tested\";s:3:\"7.0\";s:12:\"requires_php\";s:3:\"7.4\";s:16:\"requires_plugins\";a:0:{}s:6:\"rating\";i:84;s:7:\"ratings\";a:5:{i:5;i:1820;i:4;i:136;i:3;i:89;i:2;i:75;i:1;i:325;}s:11:\"num_ratings\";i:2445;s:11:\"support_url\";s:57:\"https://wordpress.org/support/plugin/the-events-calendar/\";s:15:\"support_threads\";i:53;s:24:\"support_threads_resolved\";i:44;s:15:\"active_installs\";i:700000;s:12:\"last_updated\";s:21:\"2026-07-01 4:42pm GMT\";s:5:\"added\";s:10:\"2010-01-19\";s:8:\"homepage\";s:0:\"\";s:8:\"sections\";a:6:{s:11:\"description\";s:6652:\"<p>Easily create and manage an events calendar on your WordPress site with <a href=\"https://evnt.is/mj\" rel=\"nofollow ugc\">The Events Calendar</a> free plugin. Whether your events are in-person or virtual events, this WordPress calendar plugin boasts professional features backed by our world-class team of developers and designers.</p>\n<p><iframe loading=\"lazy\" title=\"The Events Calendar\" src=\"https://player.vimeo.com/video/425323974?dnt=1&amp;app_id=122963\" width=\"750\" height=\"422\" frameborder=\"0\" allow=\"autoplay; fullscreen; picture-in-picture; clipboard-write\"></iframe></p>\n<p><a href=\"https://evnt.is/1b4-\" rel=\"nofollow ugc\">See more videos on our YouTube channel</a></p>\n<p>Packed with loads of features, The Events Calendar is ready to go out of the box. It’s also extensible, easy to use, and completely customizable.</p>\n<h4>📅 The #1 Calendar for WordPress</h4>\n<p>See the calendar in action on our <a href=\"https://evnt.is/1ajs\" rel=\"nofollow ugc\">demo experience</a>. Just getting started? Read through the <a href=\"https://evnt.is/2d\" rel=\"nofollow ugc\">New User Primer</a> to get set up.</p>\n<p>Looking for additional features like recurring events, ticket sales, user-submitted events, automatic imports, and more?</p>\n<p><strong>Check out <a href=\"https://evnt.is/mj\" rel=\"nofollow ugc\">Events Calendar Pro</a>, <a href=\"https://evnt.is/197u\" rel=\"nofollow ugc\">Event Aggregator</a>, and <a href=\"https://evnt.is/2a\" rel=\"nofollow ugc\">more add-ons</a>.</strong></p>\n<h4>🔌🎨 Plug and Play or Customize</h4>\n<p>The Events Calendar is built to work out of the box. Simply install the plugin, configure your settings, and start creating events in minutes.</p>\n<p>Want to add your personal touch? Use The Events Calendar as the foundation for customization. Personalize to your heart&#8217;s content with the help of a skeleton stylesheet, partial template overrides, template tags, hooks and filters, <a href=\"https://evnt.is/eu\" rel=\"nofollow ugc\">careful documentation</a>, and a <a href=\"https://evnt.is/1a0r\" rel=\"nofollow ugc\">library of free extensions</a>.</p>\n<p>Whether your vision is big or small, you&#8217;re in good company. Hundreds of thousands of small businesses, musicians, venues, restaurants, and non-profits are publishing and promoting their in-person and virtual events with The Events Calendar. Our plugins have also been scaled to work on large networks for Fortune 100 companies, universities, and government institutions.</p>\n<h4>✨ Features</h4>\n<p>Our feature-rich plugin comes with everything you need to create and manage your calendar.</p>\n<p>✔️ Rapidly create events<br />\n✔️ Saved venues &amp; organizers<br />\n✔️ Calendar month view with tooltips<br />\n✔️ Event List view<br />\n✔️ Day view<br />\n✔️ Block Editor support<br />\n✔️ Event search<br />\n✔️ Google maps<br />\n✔️ Widget: Upcoming events list<br />\n✔️ Events Taxonomies (Categories &amp; Tags)<br />\n✔️ Google Calendar and iCal exporting<br />\n✔️ WP REST API endpoints<br />\n✔️ Completely ajaxified for super smooth browsing<br />\n✔️ Completely responsive from mobile to tablet to desktop<br />\n✔️ Tested on the major theme frameworks such as Avada, Divi, Enfold, Genesis, and many more.<br />\n✔️ Increase your SEO with JSON-LD Structured Data<br />\n✔️ Internationalized &amp; translated<br />\n✔️ Multiple stylesheets to improve integration<br />\n✔️ Extensive template tags for customization<br />\n✔️ Hooks &amp; filters galore<br />\n✔️ Caching support<br />\n✔️ Debug mode for developers<br />\n✔️ <a href=\"https://evnt.is/1a0r\" rel=\"nofollow ugc\">Library of extensions</a></p>\n<h3>📃 Documentation</h3>\n<p>All of our documentation can be found in <a href=\"https://evnt.is/eu\" rel=\"nofollow ugc\">our Knowledgebase</a>.</p>\n<p>Additional helpful links:</p>\n<ul>\n<li><a href=\"https://evnt.is/2l\" rel=\"nofollow ugc\">The Events Calendar New User Primer</a></li>\n<li><a href=\"https://evnt.is/2m\" rel=\"nofollow ugc\">The Themer&#8217;s Guide to The Events Calendar</a></li>\n</ul>\n<p>If you have any questions about this plugin, you can post a thread in the <a href=\"https://wordpress.org/support/plugin/the-events-calendar\" rel=\"ugc\">WordPress.org forum</a>. Please search existing threads before starting a new one.</p>\n<h3>Complementos</h3>\n<p>Take your calendar to the next level by pairing it with our plugins for ticketing, crowdsourcing, email marketing, and more. Learn more about all our products on <a href=\"https://evnt.is/18wn\" rel=\"nofollow ugc\">our website</a>.</p>\n<p>Nossos plugins gratuitos:</p>\n<p>🎟️ <a href=\"https://wordpress.org/plugins/event-tickets/\" rel=\"ugc\">Event Tickets</a><br />\n📐 <a href=\"https://wordpress.org/plugins/advanced-post-manager/\" rel=\"ugc\">Advanced Post Manager</a></p>\n<p>Nossos plugins e serviços premium:</p>\n<p>⚡ <a href=\"https://evnt.is/18wi\" rel=\"nofollow ugc\">Events Calendar PRO</a><br />\n↪️ <a href=\"https://evnt.is/197u\" rel=\"nofollow ugc\">Event Aggregator</a> (service)<br />\n🎟️ <a href=\"https://evnt.is/18wk\" rel=\"nofollow ugc\">Event Tickets Plus</a><br />\n✉️ <a href=\"https://evnt.is/1ajt\" rel=\"nofollow ugc\">Promoter</a><br />\n👥 <a href=\"https://evnt.is/2g\" rel=\"nofollow ugc\">Community Events</a><br />\n✏️ <a href=\"https://evnt.is/fa\" rel=\"nofollow ugc\">Filter Bar</a><br />\n🗓️ <a href=\"https://evnt.is/2e\" rel=\"nofollow ugc\">Eventbrite Tickets</a></p>\n<h3>Ajuda</h3>\n<p>If you aren’t familiar with The Events Calendar, check out our <a href=\"https://evnt.is/2p\" rel=\"nofollow ugc\">New User Primer</a>. It will have you creating events in no time.</p>\n<p>Ready to dig deeper? Check out these resources:</p>\n<ul>\n<li><a href=\"https://evnt.is/2u\" rel=\"nofollow ugc\">Tutorials</a></li>\n<li><a href=\"https://theeventscalendar.com/release-schedule/\" rel=\"nofollow ugc\">Agenda de lançamentos</a></li>\n<li><a href=\"https://theeventscalendar.com/known-issues/\" rel=\"nofollow ugc\">Problemas conhecidos</a></li>\n<li><a href=\"https://evnt.is/eu\" rel=\"nofollow ugc\">Documentation</a></li>\n<li><a href=\"https://evnt.is/2t\" rel=\"nofollow ugc\">Help Videos</a></li>\n<li><a href=\"https://evnt.is/2v\" rel=\"nofollow ugc\">Release Notes</a></li>\n</ul>\n<p>We check in on the <a href=\"https://wordpress.org/support/plugin/the-events-calendar/\" rel=\"ugc\">The Events Calendar forum here on WordPress.org</a> about once a week to help users with basic troubleshooting and identifying bugs. If you’re looking for premium, personalized support, consider upgrading to Events Calendar Pro.</p>\n<p>Still have a question? Shoot us an email at support@theeventscalendar.com.</p>\n\";s:12:\"installation\";s:1350:\"<p>Installing the plugin is easy. Just follow one of the following methods:</p>\n<h4>Install The Events Calendar from within WordPress</h4>\n<ol>\n<li>Visit the plugins page within your dashboard and select ‘Add New’</li>\n<li>Search for &#8220;Events Calendar&#8221;</li>\n<li>Activate The Events Calendar from your Plugins page</li>\n<li>You&#8217;re done!</li>\n</ol>\n<h4>Install The Events Calendar Manually</h4>\n<ol>\n<li>No painel do seu site, vá até Plugins &#8211;&gt; Adicione novo.</li>\n<li>Selecione a opção de Upload e clique em &#8220;Escolher arquivo.&#8221;</li>\n<li>Quando o popup aparecer selecione o arquivo the-events-calendar-x.x.zip do seu desktop. (O &#8216;x.x&#8217; irá mudar dependendo do número da versão atual).</li>\n<li>Siga as instruções na tela e aguarde quando o upload estiver completo.</li>\n<li>Quando terminar, ative o plugin através do prompt. Uma mensagem irá mostrar a confirmação de que a activação foi bem sucedida. Um link para acessar o calendário diretamente na interface também será apresentado aqui.</li>\n</ol>\n<p>That&#8217;s it! Just configure your settings as you see fit, and you&#8217;re on your way to creating events in style. Need help getting things started? Check out our <a href=\"https://evnt.is/2l\" rel=\"nofollow ugc\">new user primer</a> for help with settings and features.</p>\n\";s:3:\"faq\";s:10364:\"\n<dt id=\"are{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20there{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20any{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20troubleshooting{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20steps{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20you{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}27d{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20suggest{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20try{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20that{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20might{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20resolve{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20my{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20issue{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20before{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20post{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20a{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20new{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20thread{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nExistem algumas etapas de solução de problemas, que vocês sugerem que eu tente para resolver o meu problema, antes de postar um novo tópico?\n</h4>\n<p>\n<p>First, make sure that you&#8217;re running the latest version of The Events Calendar. If you’re running Events Calendar PRO or  any other add-ons, make sure those are current / running the latest code as well.</p>\n<p>The most common issues we see are either plugin or theme conflicts. You can test if a plugin or theme is conflicting by manually deactivating other plugins until just The Events Calendar is running on your site. If the issue persists from there, revert to the default <a href=\"https://wordpress.org/themes/twentytwenty/\" rel=\"ugc\">Twenty Twenty</a> theme. If the issue is resolved after deactivating a specific plugin or your theme, you’ll know that is the source of the conflict.</p>\n<p>Note that we aren’t going to say “tough luck” if you identify a plugin/theme conflict. While we can’t guarantee 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} integration with any plugin or theme out there, we will do our best (and reach out the plugin/theme author as needed) to figure out a solution that benefits everyone.</p>\n</p>\n<dt id=\"i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}27m{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20still{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20stuck.{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20where{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20do{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20go{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20to{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20file{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20a{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20bug{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20or{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20ask{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20a{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20question{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nAinda estou travado. Onde eu vou para informar um erro ou fazer uma pergunta?\n</h4>\n<p>\n<p>Users of the free The Events Calendar should post their questions in the plugin&#8217;s <a href=\"https://wordpress.org/support/plugin/the-events-calendar/\" rel=\"ugc\">WordPress.org forum</a>, which we visit about once a week. Please make sure to read <a href=\"https://evnt.is/19oc\" rel=\"nofollow ugc\">our sticky post</a> providing an overview of the support we provide free users BEFORE posting. If you find you&#8217;re not getting support in as timely a fashion as you wish, you might want to consider purchasing a license for Events Calendar Pro.</p>\n<p>If you&#8217;re already an Events Calendar Pro user, you&#8217;re entitled access to our actively-monitored <a href=\"https://evnt.is/1aju\" rel=\"nofollow ugc\">Premium Support</a> on our website. We can provide a deeper level of support here and hit these forums on a daily basis during the work week. Generally, except in times of increased support loads, we reply to all tickets within 24-48 hours during the business week.</p>\n</p>\n<dt id=\"what{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}27s{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20the{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20difference{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20between{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20the{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20events{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20calendar{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20and{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20events{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20calendar{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20pro{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nWhat&#8217;s the difference between The Events Calendar and Events Calendar Pro?\n</h4>\n<p>\n<p>The Events Calendar is our cornerstone plugin, and it’s required in order to run any of our premium calendar add-ons, including Events Calendar Pro, Community Events, Filter Bar, and others.</p>\n<p>In other words, Events Calendar Pro runs alongside The Events Calendar and enhances it with extra features, including recurring events, additional calendar views, calendar shortcodes, advanced widgets, custom event fields and more.</p>\n</p>\n<dt id=\"what{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20add-ons{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20are{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20available{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20for{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20the{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20events{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20calendar{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20and{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20where{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20can{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20read{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20more{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20about{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20them{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nQue complementos estão disponíveis para o The Events Calendar, e onde posso ler mais sobre eles?\n</h4>\n<p>\n<p>Os seguintes complementos estão disponíveis para o The Events Calendar:</p>\n<ul>\n<li><a href=\"https://evnt.is/18wi\" rel=\"nofollow ugc\">Events Calendar Pro</a>, for adding premium calendar features like recurring events, advanced views, cool widgets, <a href=\"https://evnt.is/1ajw\" rel=\"nofollow ugc\">shortcodes</a>, additional fields, and more!</li>\n<li><a href=\"https://evnt.is/197u\" rel=\"nofollow ugc\">Event Aggregator</a>, a service that effortlessly fills your calendar with events from Meetup, Google Calendar, iCalendar, Eventbrite, CSV, and ICS.</li>\n<li><a href=\"https://wordpress.org/plugins/event-tickets/\" rel=\"ugc\">Event Tickets</a> (free), which allows you to sell tickets and collect RSVPs to events. It can run alongside The Events Calendar or as a standalone plugin that adds ticket and RSVP functionality to WordPress posts and pages.</li>\n<li><a href=\"https://evnt.is/18wk\" rel=\"nofollow ugc\">Event Tickets Plus</a>, which allows you to sell tickets for your events using your favorite e-commerce platform.</li>\n<li><a href=\"https://evnt.is/1ajt\" rel=\"nofollow ugc\">Promoter</a>, automated email communication made just for The Events Calendar and Event Tickets. Stay in touch with your attendees every step of the way.</li>\n<li><a href=\"https://evnt.is/2g\" rel=\"nofollow ugc\">Community Events</a>, for allowing frontend event submission from your readers.</li>\n<li><a href=\"https://evnt.is/fa\" rel=\"nofollow ugc\">Filter Bar</a>, for adding advanced frontend filtering capabilities to your events calendar.</li>\n<li><a href=\"https://evnt.is/2e\" rel=\"nofollow ugc\">Eventbrite Tickets</a>, for selling tickets to your event directly through Eventbrite.</li>\n</ul>\n</p>\n<dt id=\"can{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20import{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20events{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20to{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20my{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20calendar{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nCan I import events to my calendar?\n</h4>\n<p>\n<p>Yes! The Events Calendar has a built-in CSV import tool. If you want to step it up and automatically import events from Google Calendar, Meetup, Eventbrite and more, check out <a href=\"https://evnt.is/197u\" rel=\"nofollow ugc\">Event Aggregator</a>.</p>\n</p>\n<dt id=\"how{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20do{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20sell{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20tickets{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20to{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20events{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20on{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20my{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20calendar{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nHow do I sell tickets to events on my calendar?\n</h4>\n<p>\n<p>You&#8217;ll want to use our <a href=\"https://wordpress.org/plugins/event-tickets/\" rel=\"ugc\">Event Tickets</a> plugin for that. This free plugin works alongside The Events Calendar and lets you create RSVPs and tickets for events. Event Tickets integrates with PayPal so you can collect payments for tickets, while our premium solution, Event Tickets Plus fully integrates with WooCommerce or Easy Digital Downloads. If you want to include digital tickets like Apple Wallet passes and PDF tickets check out <a href=\"https://evnt.is/etwp\" rel=\"nofollow ugc\">Event Tickets Wallet Plus</a>.</p>\n</p>\n<dt id=\"can{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20have{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20more{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20than{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20one{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20calendar{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20on{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20my{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20site{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nCan I have more than one calendar on my site?\n</h4>\n<p>\n<p>Unfortunately, no. However, you can use <a href=\"https://evnt.is/1bay\" rel=\"nofollow ugc\">event categories</a> or tags to create calendar views that only display certain events. For example, you could create a direct link to a calendar view that only shows events categorized as “Fitness,” <a href=\"https://evnt.is/1ajv\" rel=\"nofollow ugc\">like this example from our demo site</a>.</p>\n<p>With <a href=\"https://evnt.is/18wi\" rel=\"nofollow ugc\">Events Calendar Pro</a>, you can use <a href=\"https://evnt.is/1ajw\" rel=\"nofollow ugc\">shortcodes</a> to embed your calendar on other WordPress pages and posts, then filter that calendar by category.</p>\n</p>\n<dt id=\"can{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20allow{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20people{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20to{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20submit{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20events{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20to{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20my{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20calendar{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nCan I allow people to submit events to my calendar?\n</h4>\n<p>\n<p>This is available with the <a href=\"https://evnt.is/2g\" rel=\"nofollow ugc\">Community Events</a> add-on to facilitate submissions. Install Community Events alongside The Events Calendar and a page will be added to your WordPress site with a form that visitors can use to submit events. As the calendar owner, you have full control over whether event submissions are published immediately or require moderation first.</p>\n<p>If you want to let users sell tickets for the events they submit, check out <a href=\"https://evnt.is/18wl\" rel=\"nofollow ugc\">Community Tickets</a>. It runs with The Events Calendar, Community Events, and Event Tickets and empowers visitors to create and sell tickets, splitting the profits with you.</p>\n</p>\n<dt id=\"what{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}E2{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}99s{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20the{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20difference{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20between{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20the{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20events{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20calendar{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20and{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20events{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20calendar{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20pro\">\nWhat’s the difference between The Events Calendar and Events Calendar Pro\n</h4>\n<p>\n<p>The Events Calendar is our cornerstone plugin, and it’s required in order to run any of our premium calendar add-ons, including <a href=\"https://evnt.is/18wi\" rel=\"nofollow ugc\">Events Calendar Pro</a>, <a href=\"https://evnt.is/1bax\" rel=\"nofollow ugc\">Community Events</a>, <a href=\"https://evnt.is/fa\" rel=\"nofollow ugc\">Filter Bar</a>, and others.</p>\n<p>In other words, Events Calendar Pro runs alongside The Events Calendar and enhances it with extra features, including recurring events and event Series, additional calendar views, calendar shortcodes, advanced widgets, custom event fields, a duplicate event tool, and more.</p>\n</p>\n<dt id=\"found{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20a{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20security{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20vulnerability{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nFound a security vulnerability?\n</h4>\n<p>\n<p>Make sure you are reporting in a safe and responsible way. We take security very seriously. If you discover a security issue, please bring it to our attention right away! Below you will find all the methods to report security vulnerabilities:</p>\n<ul>\n<li><a href=\"https://patchstack.com/database/vdp/the-events-calendar\" rel=\"nofollow ugc\">Report security bugs through the Patchstack Vulnerability Disclosure Program</a></li>\n<li>Check our <a href=\"https://www.liquidweb.com/policies/bug-bounty-program/\" rel=\"nofollow ugc\">Bug Bounty Program</a></li>\n<li>Reach out directly to us on <code>security [at] stellarwp.com</code>.</li>\n</ul>\n</p>\n<dt id=\"i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20have{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20a{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20feature{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20idea.{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20what{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}27s{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20the{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20best{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20way{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20to{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20tell{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20you{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20about{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20it{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nEu tenho uma idéia de recurso. Qual é a melhor maneira de contar pra vocês?\n</h4>\n<p>\n<p>We&#8217;ve got an <a href=\"https://app.loopedin.io/the-events-calendar-suite-roadmap#/ideas\" rel=\"nofollow ugc\">ideas page</a> where we&#8217;re actively watching for feature ideas from the community. Vote up existing feature requests or add your own, and help us shape <a href=\"https://app.loopedin.io/the-events-calendar-suite-roadmap#/roadmap\" rel=\"nofollow ugc\">our roadmap</a>.</p>\n</p>\n<dt id=\"i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}27ve{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20still{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20got{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20questions.{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20where{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20can{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20i{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20find{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}20answers{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}3F\">\nEu ainda tenho perguntas. Onde posso encontrar respostas?\n</h4>\n<p>\n<p>Check out our extensive <a href=\"https://evnt.is/18wm\" rel=\"nofollow ugc\">knowledgebase</a> for articles on using, tweaking, and troubleshooting our plugins.</p>\n</p>\n\n\";s:9:\"changelog\";s:13979:\"<h4>[6.16.5.1] 2026-07-01</h4>\n<ul>\n<li>Security &#8211; Expanded validation of Event Aggregator imports for all statuses.</li>\n<li>Language &#8211; 0 new strings added, 0 updated, 0 fuzzied, and 0 obsoleted.</li>\n</ul>\n<h4>[6.16.5] 2026-06-24</h4>\n<ul>\n<li>Feature &#8211; Added &#8220;SEO &amp; URL Handling&#8221; settings, allowing site owners to configure out-of-range URL behavior.</li>\n<li>Fix &#8211; Dated List view URLs carrying ?tribe-bar-date outside the known event range now return HTTP 404 by default, and can be configured to use a soft noindex response instead, helping prevent accumulation of low-value indexed pages in search engines.</li>\n<li>Fix &#8211; Removed bottom padding from &#8220;Event Venue&#8221; block to be compatible with WordPress 7 styles.</li>\n<li>Fix &#8211; URLs specifying a disabled view slug via ?eventDisplay now return HTTP 404 instead of 200.</li>\n<li>Language &#8211; 0 new strings added, 2 updated, 0 fuzzied, and 0 obsoleted.</li>\n<li>Language &#8211; 13 new strings added, 0 updated, 0 fuzzied, and 0 obsoleted.</li>\n</ul>\n<h4>[6.16.4.1] 2026-06-19</h4>\n<ul>\n<li>Security &#8211; Make the iCal export feed produce deterministic output and harden calendar header values against line-break injection.</li>\n</ul>\n<h4>[6.16.4] 2026-06-15</h4>\n<ul>\n<li>Tweak &#8211; Resolve license key validation server not available message on licenses screen. [CONS-478]</li>\n<li>Language &#8211; 0 new strings added, 0 updated, 0 fuzzied, and 0 obsoleted.</li>\n</ul>\n<h4>[6.16.3] 2026-05-28</h4>\n<ul>\n<li>Fix &#8211; Ensure no past Event dates are shown in the Title meta tag on Events archive and single views. [TEC-5759]</li>\n<li>Fix &#8211; Resolved an issue where the category legend superpowers filter would not apply in a day with multiple events from different categories. [ECP-2016]</li>\n<li>Language &#8211; 1 new strings added, 65 updated, 1 fuzzied, and 4 obsoleted.</li>\n</ul>\n<h4>[6.16.2] 2026-05-14</h4>\n<ul>\n<li>Tweak &#8211; Update Harbor to 1.2.0, removing the Liquid Web Products page when there are no premium plugins present.</li>\n</ul>\n<h4>[6.16.1] 2026-05-12</h4>\n<ul>\n<li>Tweak &#8211; Update Harbor to version 1.1.0 to remove the top level Liquid Web page added to the dashboard.</li>\n</ul>\n<h4>[6.16.0] 2026-05-11</h4>\n<ul>\n<li>Feature &#8211; Integrate with Nexcess Licensing and Portal.</li>\n<li>Tweak &#8211; Added filters: <code>tec_events_aggregator_harbor_took_over</code></li>\n<li>Tweak &#8211; Updated branding references from StellarWP to Nexcess.</li>\n</ul>\n<h4>[6.15.20] 2026-04-08</h4>\n<ul>\n<li>Fix &#8211; Make SSR respect AJAX pagination so direct page URLs no longer return 404s. [TEC-5754]</li>\n<li>Fix &#8211; Prevent 404 errors for paginated TEC list view requests on MariaDB. [TEC-5056]</li>\n<li>Fix &#8211; Rewrite the day view URL to query-param form and fall back to the default view when day view is disabled, preventing a 404 after a page refresh. [TEC-5765]</li>\n<li>Language &#8211; 0 new strings added, 13 updated, 0 fuzzied, and 0 obsoleted.</li>\n</ul>\n<h4>[6.15.19] 2026-04-07</h4>\n<ul>\n<li>Tweak &#8211; Added filters: <code>tec_events_views_v2_url_allowed_query_args</code></li>\n<li>Security &#8211; Ensure Venues and Organizers linked to an event, are still honoring their individual capabilities. [SVUL-61]</li>\n<li>Security &#8211; Strengthen capability checks for categories and terms. [SVUL-64]</li>\n<li>Security &#8211; Tighten capability checks and server-side validation for Event Aggregator scheduled import edits. [SVUL-63]</li>\n<li>Language &#8211; 2 new strings added, 20 updated, 0 fuzzied, and 0 obsoleted.</li>\n</ul>\n<h4>[6.15.18] 2026-03-25</h4>\n<ul>\n<li>Fix &#8211; Add <code>is_array</code> verification to guard against non-array values passed by Elementor in some contexts. [TEC-5762]</li>\n<li>Fix &#8211; Improve the URL compatibility with non-ASCII languages. [TEC-4848]</li>\n<li>Fix &#8211; Verify if Elementor CSS exists before adding it to avoid a 404 response. [TEC-5752]</li>\n<li>Language &#8211; 0 new strings added, 0 updated, 0 fuzzied, and 0 obsoleted.</li>\n</ul>\n<h4>[6.15.17.1] 2026-03-09</h4>\n<ul>\n<li>Security &#8211; Strengthen file type and location checks during aggregator imports. [SVUL-54]</li>\n</ul>\n<h4>[6.15.17] 2026-02-25</h4>\n<ul>\n<li>Tweak &#8211; Changed views: <code>modules/meta/organizer</code>, <code>v2/components/content-title</code>, <code>v2/components/header</code>, <code>v2/day/nav</code>, <code>v2/day/top-bar/nav</code>, <code>v2/month/calendar-body/day/cell-title</code>, <code>v2/month/calendar-body/day/date</code>, <code>v2/month/top-bar/nav</code></li>\n<li>Tweak &#8211; Custom SEO titles set in Yoast SEO for Event Categories and Event Tags are now correctly applied to both the page <code>&lt;title&gt;</code> tag and <code>og:title</code> meta tag. [TEC-4952]</li>\n<li>Tweak &#8211; Restore <code>post_tag</code> for events after <code>change_locale</code> action, which was being overwritten for fr_FR, causing the tags to not show with the block editor. [TEC-4996]</li>\n<li>Accessibility &#8211; Add an outline on hover for the datepicker. [TEC-5740]</li>\n<li>Accessibility &#8211; Increase contrast of text for past event times. [TEC-5741]</li>\n<li>Language &#8211; 0 new strings added, 109 updated, 0 fuzzied, and 0 obsoleted.</li>\n</ul>\n<h4>[6.15.16.1] 2026-02-24</h4>\n<ul>\n<li>Security &#8211; Strengthen user permission checks. [SVUL-48]</li>\n</ul>\n<h4>[6.15.16] 2026-02-11</h4>\n<ul>\n<li>Fix &#8211; Evaluate correctly whether the email and phone field of a non-password protected organizer should display and by default the organizer&#8217;s website opens in a new tab.[TEC-5744]</li>\n<li>Tweak &#8211; Add aria-label attribute to events navigation. [TEC-5732]</li>\n<li>Tweak &#8211; Changed views: <code>modules/meta/organizer</code>, <code>v2/components/content-title</code>, <code>v2/components/header</code>, <code>v2/day/nav</code>, <code>v2/day/top-bar/nav</code>, <code>v2/month/calendar-body/day/cell-title</code>, <code>v2/month/calendar-body/day/date</code>, <code>v2/month/top-bar/nav</code></li>\n<li>Tweak &#8211; Improve Day View content title to display contextual &#8220;Events for [Date]&#8221; format at the top of the view. [TEC-5733]</li>\n<li>Tweak &#8211; Improve heading hierarchy in month view by making date headings only when events are present. [TEC-5622]</li>\n<li>Tweak &#8211; Improve keyboard focus order in zoomed/mobile layouts to follow a more logical and predictable sequence, aligning with WCAG best practices. [TEC-5193]</li>\n<li>Tweak &#8211; Improve mini calendar accessibility by adding non-color indicators for past, current, and upcoming days. [TEC-5735]</li>\n<li>Language &#8211; 3 new strings added, 11 updated, 0 fuzzied, and 1 obsoleted.</li>\n</ul>\n<h4>[6.15.15] 2026-01-28</h4>\n<ul>\n<li>Tweak &#8211; Correct datepicker navigation to include icons on click. [TEC-5736]</li>\n<li>Language &#8211; 0 new strings added, 0 updated, 0 fuzzied, and 0 obsoleted.</li>\n</ul>\n<h4>[6.15.14] 2026-01-13</h4>\n<ul>\n<li>Version &#8211; The Events Calendar 6.15.14 is only compatible with Events Pro 7.7.12 or higher.</li>\n<li>Fix &#8211; Ensure that the Series post status is not changed during maintenance.</li>\n<li>Fix &#8211; Improve category table stability by preventing fatal errors when custom column data receives null values. [TEC-5712]</li>\n<li>Fix &#8211; Prevent category data from persisting between events when some have colored categories and others do not. Props to @deltragon. [TEC-5622]</li>\n<li>Tweak &#8211; Add a visual outline when a day is in focus in the datepicker for improved accessibility. [TEC-5646]</li>\n<li>Tweak &#8211; Change content template name to &#8216;embed-content&#8217; to avoid conflicts for Calendar Embeds. [TEC-5717]</li>\n<li>Tweak &#8211; Enhance Top Bar datepicker with semantic HTML, ARIA support, and reliable keyboard navigation. [TEC-5620]</li>\n<li>Tweak &#8211; Improve archive view content title to default to an H1 while allowing heading tag overrides via tec_events_views_v2_view_{$view_slug}_content_title_heading_tag filter. [TEC-5617]</li>\n<li>Tweak &#8211; Improve JavaScript namespace initialization by ensuring window.tribe is defined before category color scripts run. [TEC-5712]</li>\n<li>Tweak &#8211; Increase contrast for current day in the datepicker for improved accessibility. [TEC-5640]</li>\n<li>Tweak &#8211; Increase contrast in datepicker navigation arrows for improved accessibility. [TEC-5639]</li>\n<li>Tweak &#8211; Increase contrast of past events title for improved accessibility. [TEC-5642]</li>\n<li>Tweak &#8211; Increase contrast for month view past multiday events for improved accessibility. [TEC-5641]</li>\n<li>Tweak &#8211; Increase contrast on pagination arrows for improved accessibility. [TEC-5638]</li>\n<li>Tweak &#8211; Reorder event markup in archive and widget views so event titles precede their date and time for improved screen reader navigation. [TEC-5621]</li>\n<li>Language &#8211; 2 new strings added, 57 updated, 0 fuzzied, and 1 obsoleted.</li>\n</ul>\n<h4>[6.15.13.1] 2026-01-07</h4>\n<ul>\n<li>Fix &#8211; Corrective language fix for Category Colors. [TEC-36]</li>\n</ul>\n<h4>[6.15.13] 2025-12-18</h4>\n<ul>\n<li>Security &#8211; Strengthen the user access level in the system information opt-in functionality. [SVUL-35]</li>\n</ul>\n<h4>[6.15.12.2] 2025-11-20</h4>\n<ul>\n<li>Fix &#8211; Removes the  element as a wrapper in events related pages, avoiding the calendar page rendering issues for many themes. Adds a <code>role=\"main\"</code> to the first element printed by The Events Calendar on those pages to maintain accessibility. [TEC-5729]</li>\n</ul>\n<h4>[6.15.12.1] 2025-11-19</h4>\n<ul>\n<li>Fix &#8211; Provides context to a translatable placeholder which could result in an error when using existing translation. [TEC-5728]</li>\n<li>Language &#8211; 1 new strings added, 5 updated, 0 fuzzied, and 0 obsoleted.</li>\n</ul>\n<h4>[6.15.12] 2025-11-18</h4>\n<ul>\n<li>Version &#8211; The Events Calendar 6.15.12 is only compatible with Event Tickets 5.27.0 or higher.</li>\n<li>Version &#8211; The Events Calendar 6.15.12 is only compatible with Events Pro 7.7.11 or higher.</li>\n<li>Fix &#8211; Correct use of globals in admin scripts.</li>\n<li>Tweak &#8211; Added filters: <code>tec_events_rest_v1_events_read_params</code>, <code>tec_events_rest_v1_venues_read_params</code>, <code>tec_events_main_container_id</code></li>\n<li>Tweak &#8211; Removed filters: <code>tec_events_rest_v1_events_read_args</code>, <code>tec_events_rest_v1_venues_read_args</code></li>\n<li>Tweak &#8211; Changed views: <code>v2/components/content-title</code>, <code>v2/day/time-separator</code>, <code>v2/list/event/title</code>, <code>v2/list/month-separator</code>, <code>v2/month/calendar-body/day/date</code></li>\n<li>Tweak &#8211; Correct notice display on the troubleshooting page. [TEC-5724]</li>\n<li>Tweak &#8211; Updates Shepherd library to 0.0.9 from 0.0.6 including various improvements. Shepherd&#8217;s changelog can be found here https://github.com/stellarwp/shepherd/blob/0.0.9/CHANGELOG.md</li>\n<li>Tweak &#8211; Improve Day View accessibility by using semantic H2 headings for time separators to create a proper heading hierarchy. [TEC-5627]</li>\n<li>Tweak &#8211; Improve mini calendar accessibility by adding descriptive ARIA labels and clarifying focus indicators for color-based event markers. [TEC-5630]</li>\n<li>Tweak &#8211; Update heading levels for “Events at this venue” and “Events from this organizer” to improve accessibility and semantic hierarchy. [TEC-5636]</li>\n<li>Accessibility &#8211; Add filter to wrap event content in a main landmark if needed, which allows for the &#8216;Skip to Content&#8217; button to work. [TEC-5628]</li>\n<li>Compatibility &#8211; Make method signatures in Builder explicitly nullable to resolve PHP 8.4 deprecation warnings. [TEC-5725]</li>\n<li>Compatibility &#8211; Updates to support TEC v1 REST API Changes.</li>\n<li>Language &#8211; 3 new strings added, 75 updated, 0 fuzzied, and 1 obsoleted.</li>\n</ul>\n<h4>[6.15.11] 2025-11-04</h4>\n<ul>\n<li>Tweak &#8211; Add JavaScript logic to move keyboard focus to expanded date content and announce event counts for screen reader users in month view mobile calendar [TEC-5231]</li>\n<li>Tweak &#8211; Avoid logging a warning when bulk deleting events. [TEC-5721]</li>\n<li>Tweak &#8211; Changed views: <code>blocks/parts/details</code>, <code>blocks/parts/organizer</code>, <code>blocks/parts/venue</code>, <code>modules/meta/details</code>, <code>modules/meta/organizer</code>, <code>modules/meta/venue</code>, <code>v2/month</code>, <code>v2/month/calendar-body/day/date-extras</code>, <code>v2/month/calendar-body/day/date</code>, <code>v2/month/calendar-header</code></li>\n<li>Tweak &#8211; Improve accessibility in the mini calendar by replacing <em> elements used for event dots with semantic s and removing redundant aria-label and title attributes [TEC-5228]</em></li>\n<li>Accessibility &#8211; Improve screen reader accessibility for weekday headers in month view calendar. [TEC-5719]</li>\n<li>Accessibility &#8211; Remove the presentational role from the Month View table. [TEC-5719]</li>\n<li>Accessibility &#8211; Replace misuse of definition list (<code>&lt;dl&gt;/&lt;dt&gt;/&lt;dd&gt;</code>) tags with semantic unordered lists (<code>&lt;ul&gt;/&lt;li&gt;</code>) in event details, organizer, and venue meta sections to improve screen reader accessibility and reduce confusion.[TEC-5224]</li>\n<li>Language &#8211; 3 new strings added, 53 updated, 1 fuzzied, and 4 obsoleted.</li>\n</ul>\n<h4>[6.15.10] 2025-10-28</h4>\n<ul>\n<li>Security &#8211; Improve authorization checks in QR codes. [SVUL-28]</li>\n<li>Security &#8211; Improve <code>ORDER BY</code> clause validation. [SVUL-26]</li>\n</ul>\n<h3>For all versions, please see the full <a href=\"https://github.com/the-events-calendar/the-events-calendar/blob/main/changelog.md\" rel=\"nofollow ugc\">changelog</a> in our documentation.</h3>\n\";s:11:\"screenshots\";s:2209:\"<ol><li><a href=\"https://ps.w.org/the-events-calendar/assets/screenshot-1.png?rev=2755131\"><img src=\"https://ps.w.org/the-events-calendar/assets/screenshot-1.png?rev=2755131\" alt=\"Visualização por mês ao passar o mouse\"></a><p>Visualização por mês ao passar o mouse</p></li><li><a href=\"https://ps.w.org/the-events-calendar/assets/screenshot-2.png?rev=2755131\"><img src=\"https://ps.w.org/the-events-calendar/assets/screenshot-2.png?rev=2755131\" alt=\"Visuais para dispositivos móveis\"></a><p>Visuais para dispositivos móveis</p></li><li><a href=\"https://ps.w.org/the-events-calendar/assets/screenshot-3.png?rev=2755131\"><img src=\"https://ps.w.org/the-events-calendar/assets/screenshot-3.png?rev=2755131\" alt=\"Evento único\"></a><p>Evento único</p></li><li><a href=\"https://ps.w.org/the-events-calendar/assets/screenshot-4.png?rev=2755131\"><img src=\"https://ps.w.org/the-events-calendar/assets/screenshot-4.png?rev=2755131\" alt=\"Visualização em lista\"></a><p>Visualização em lista</p></li><li><a href=\"https://ps.w.org/the-events-calendar/assets/screenshot-5.png?rev=2755131\"><img src=\"https://ps.w.org/the-events-calendar/assets/screenshot-5.png?rev=2755131\" alt=\"Editor de Eventos\"></a><p>Editor de Eventos</p></li><li><a href=\"https://ps.w.org/the-events-calendar/assets/screenshot-6.png?rev=2755131\"><img src=\"https://ps.w.org/the-events-calendar/assets/screenshot-6.png?rev=2755131\" alt=\"Listagem da administração de eventos\"></a><p>Listagem da administração de eventos</p></li><li><a href=\"https://ps.w.org/the-events-calendar/assets/screenshot-7.png?rev=2755131\"><img src=\"https://ps.w.org/the-events-calendar/assets/screenshot-7.png?rev=2755131\" alt=\"Configurações gerais\"></a><p>Configurações gerais</p></li><li><a href=\"https://ps.w.org/the-events-calendar/assets/screenshot-8.png?rev=2755131\"><img src=\"https://ps.w.org/the-events-calendar/assets/screenshot-8.png?rev=2755131\" alt=\"Mostrar configurações\"></a><p>Mostrar configurações</p></li><li><a href=\"https://ps.w.org/the-events-calendar/assets/screenshot-9.png?rev=2755131\"><img src=\"https://ps.w.org/the-events-calendar/assets/screenshot-9.png?rev=2755131\" alt=\"Importador de CSV\"></a><p>Importador de CSV</p></li></ol>\";s:7:\"reviews\";s:18899:\"<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">The best calendar</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"5 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"5\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/jrslam/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/9c72a3a0ddcd300270b3a726273546fd6fe47eb371df848deac7624a6de73831?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/9c72a3a0ddcd300270b3a726273546fd6fe47eb371df848deac7624a6de73831?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/jrslam/\" class=\"reviewer-name\">jrslam</a> em <span class=\"review-date\">julho 2, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>I confess that after an upgrade that I was not aware of, the events calendar started behaving badly. Tech-support couldn’t quite figure out what was going on, so I shopped around for a different calendar program. I must honestly say nothing compared. So my solution was to contact Claude AI, and Claude solved the issue. The Events Calendar is awesome, and I could not find anything that was a close competitor. The problem I encountered was partly my own doing in customizing it, so it wasn’t surprising that tech-support couldn’t figure out what had happened, but it’s all resolved and I’m back very happy with it.</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">TEC: exppensive chaos, no support for paid subscription</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"1 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"1\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/buddhafoundation/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/83f0a976a29f6251041d969eda2d5151614cc8570d1a7cf3acb953e4abb937e0?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/83f0a976a29f6251041d969eda2d5151614cc8570d1a7cf3acb953e4abb937e0?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/buddhafoundation/\" class=\"reviewer-name\">Jochen Weber <small>(buddhafoundation)</small></a> em <span class=\"review-date\">junho 22, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>I wanted to switch from MEC to TEC: Full catastrophe: NO support for paid subscription, account is chaos, missing license keys not supported, overprized for the features provided. So I had to switch back...and lost my money</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">New Company does not respond to legacy customers.</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"1 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"1\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/eewhitejr/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/20c28e82ef3a3bc8b037a2b80c042aef8f017bfd56bbfad36b63bb37d28cd0ef?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/20c28e82ef3a3bc8b037a2b80c042aef8f017bfd56bbfad36b63bb37d28cd0ef?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/eewhitejr/\" class=\"reviewer-name\">Gene White Jr. <small>(eewhitejr)</small></a> em <span class=\"review-date\">junho 19, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>After Nexcess took over the plugin, I have now emailed them 3 times trying to renew the license I have for the plugin from the original makers of the product who were very good at responding to their customers and solving the support issues, but they have yet to respond to me. At this point I will NOT be renewing the license. For the following reasons. </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol><!-- wp:list-item -->\n<li>They do not respond to support and or billing questions. </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Their new pricing is ridiculously high. Over $140.00 more than the last license I purchased from them.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>I have been reading the reviews since Nexcess took over the plugin and none are happy with their response to email questions. Most having the same issue that I do. As in they do not respond to support questions or anything apparently. </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>They changed the code in the plugin to add a menu for pay plugins without notifying the customer that this would happen. This behaviour makes the entire plugin suspicious. If they are doing this on the front end what are they doing in the back end?</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>Stay away from this plugin. Stay away from this plugin provider. Their changes are not worth paying $140.00 more a year for a plugin that is adding things to your Wordpress menu that are not directly related to your current version of the calendar. There should never be an addition of a menu that does nothing more than advertise their pay versions. </p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">Zero response to support tickets</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"2 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"2\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/andrewtgh/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/30c93f4745f7b6dacc540494eaa46a9563978807cd0e8eeac1b2bd8bf26b1786?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/30c93f4745f7b6dacc540494eaa46a9563978807cd0e8eeac1b2bd8bf26b1786?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/andrewtgh/\" class=\"reviewer-name\">andrewtgh</a> em <span class=\"review-date\">junho 18, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>I\'d been using this software for years, with mostly positive experience. Until I tried reaching out for support for a billing/licencing issue under the \"new\" Liquid Web ownership. Absolutely no response to any of the three support tickets I\'ve raised - I get an acknowledgement, so I know it\'s not a spam filter problem. They just seem to have stopped responding. I would now recommend that potential customers avoid this software like the plague due to lack of support, which is a shame because it used to work very well for our needs. We\'re now starting a project to assess alternatives and switch over.</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">No Support with Premium</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"1 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"1\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/uniguide/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/787da57d1a47c79b9b8f5703f8524f5e8e510a9ff6df57f4a2818c2a0981b2bf?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/787da57d1a47c79b9b8f5703f8524f5e8e510a9ff6df57f4a2818c2a0981b2bf?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/uniguide/\" class=\"reviewer-name\">uniguide</a> em <span class=\"review-date\">junho 8, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>I paid for the premium version of the plugin and see its limitations. I was willing to upgrade, but they do not respond to support requests despite multiple attempts. Links don\'t take you to where they say they will. Looks like they are putting zero effort into this. Do not waster you money. Highway robbery.</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">Too Many Error Codes</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"5 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"5\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/southerngardener/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/d883dc59304db9e3328c3e6f41c0088854f79fe96967f7dc8e786aa2f3d4094c?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/d883dc59304db9e3328c3e6f41c0088854f79fe96967f7dc8e786aa2f3d4094c?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/southerngardener/\" class=\"reviewer-name\">April <small>(southerngardener)</small></a> em <span class=\"review-date\">maio 20, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>This plugin has caused too many error codes and issues for me since installing.  Now I am getting a huge list of errors when I first load the events page, so there is no telling what other kind of behind-the-scenes issues this is causing.  Uninstalling and trying to find something else.</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">Plugin-squatting at its worst - Run away</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"1 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"1\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/esquipulas/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/1981a3efc3e1c7e99fc181f4ae0170e0e47c685a8de494e18f8583fb272af1ac?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/1981a3efc3e1c7e99fc181f4ae0170e0e47c685a8de494e18f8583fb272af1ac?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/esquipulas/\" class=\"reviewer-name\">esquipulas</a> em <span class=\"review-date\">maio 17, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>Last update brings a full spam menu from an unknown company named Liquid Web / Nexcess: <strong>NO THANKS</strong>. This behavior is nothing more than plugin-squatting.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>A full advertising menu (« Liquid Web ») was injected into the WordPress admin sidebar without consent, pushing upsells for unrelated paid products (Essentials/Pro/Elite licenses). Unacceptable.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Immediately uninstalled it and alerting everybody to run away from this plugin!</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">No thanks</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"1 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"1\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/61pixels/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/ea5ebed2acb0eea03d772a84cce3b9419e406006b96e9af33ab9a7ad3ad4f443?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/ea5ebed2acb0eea03d772a84cce3b9419e406006b96e9af33ab9a7ad3ad4f443?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/61pixels/\" class=\"reviewer-name\">61pixels</a> em <span class=\"review-date\">maio 13, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>After this update shoving a menu that looks like Malware into dozens of my client sites, I will be moving all of them off of Events Calendar Pro into another Event system. I hope everyone else does the same. This type of action is absolutely not OK. many panicked clients and even myself thinking we got hacked when this random menu of weird crap shows up in our dashboards.</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">best event plugins on the market</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"5 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"5\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-filled\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/samicai/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/ca611d8609b0fcd55343c64a7f054d9d8a70ca90a1fe0b3c87424904836a4349?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/ca611d8609b0fcd55343c64a7f054d9d8a70ca90a1fe0b3c87424904836a4349?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/samicai/\" class=\"reviewer-name\">samicai</a> em <span class=\"review-date\">maio 12, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>The best event plugin on the market! Packed with great features. The support team is awesome , fast, helpful, and professional. Highly recommended!</p>\n<!-- /wp:paragraph --></div>\n</div>\n<div class=\"review\">\n	<div class=\"review-head\">\n		<div class=\"reviewer-info\">\n			<div class=\"review-title-section\">\n				<h4 class=\"review-title\">Unusable after 6.16.0</h4>\n				<div class=\"star-rating\">\n				<div class=\"wporg-ratings\" aria-label=\"1 de 5 estrelas\" data-title-template=\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s de 5 estrelas\" data-rating=\"1\" style=\"color:#ffb900;\"><span class=\"star dashicons dashicons-star-filled\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span><span class=\"star dashicons dashicons-star-empty\"></span></div>				</div>\n			</div>\n			<p class=\"reviewer\">\n				Por <a href=\"https://profiles.wordpress.org/jsm116/\"><img alt=\'\' src=\'https://secure.gravatar.com/avatar/cdeed4f044bd668e93b21e9f0d5194de5a9710088d9b1714e7298e5fa339bbad?s=16&#038;d=monsterid&#038;r=g\' srcset=\'https://secure.gravatar.com/avatar/cdeed4f044bd668e93b21e9f0d5194de5a9710088d9b1714e7298e5fa339bbad?s=32&#038;d=monsterid&#038;r=g 2x\' class=\'avatar avatar-16 photo\' height=\'16\' width=\'16\' loading=\'lazy\' decoding=\'async\'/></a><a href=\"https://profiles.wordpress.org/jsm116/\" class=\"reviewer-name\">jsm116</a> em <span class=\"review-date\">maio 12, 2026</span>			</p>\n		</div>\n	</div>\n	<div class=\"review-body\"><!-- wp:paragraph -->\n<p>The latest update 6.16.0 includes an unwanted Liquid Web software manager that you can\'t remove. This takes a decent plugin and makes it unusable.</p>\n<!-- /wp:paragraph --></div>\n</div>\n\";}s:17:\"short_description\";s:125:\"The Events Calendar: #1 calendar plugin for WordPress. Create/manage events (virtual too!) on your site with the free plugin.\";s:13:\"download_link\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.16.5.1.zip\";s:14:\"upgrade_notice\";a:1:{s:5:\"[6.0]\";s:242:\"<p>Please see the changelog for the complete list of changes in this release.\nPrevious versions of The Events Calendar are not cross-compatible with 6.X add-ons.\nRemember to always make a backup of your database and files before updating!</p>\";}s:11:\"screenshots\";a:9:{i:1;a:2:{s:3:\"src\";s:72:\"https://ps.w.org/the-events-calendar/assets/screenshot-1.png?rev=2755131\";s:7:\"caption\";s:41:\"Visualização por mês ao passar o mouse\";}i:2;a:2:{s:3:\"src\";s:72:\"https://ps.w.org/the-events-calendar/assets/screenshot-2.png?rev=2755131\";s:7:\"caption\";s:33:\"Visuais para dispositivos móveis\";}i:3;a:2:{s:3:\"src\";s:72:\"https://ps.w.org/the-events-calendar/assets/screenshot-3.png?rev=2755131\";s:7:\"caption\";s:13:\"Evento único\";}i:4;a:2:{s:3:\"src\";s:72:\"https://ps.w.org/the-events-calendar/assets/screenshot-4.png?rev=2755131\";s:7:\"caption\";s:23:\"Visualização em lista\";}i:5;a:2:{s:3:\"src\";s:72:\"https://ps.w.org/the-events-calendar/assets/screenshot-5.png?rev=2755131\";s:7:\"caption\";s:17:\"Editor de Eventos\";}i:6;a:2:{s:3:\"src\";s:72:\"https://ps.w.org/the-events-calendar/assets/screenshot-6.png?rev=2755131\";s:7:\"caption\";s:38:\"Listagem da administração de eventos\";}i:7;a:2:{s:3:\"src\";s:72:\"https://ps.w.org/the-events-calendar/assets/screenshot-7.png?rev=2755131\";s:7:\"caption\";s:22:\"Configurações gerais\";}i:8;a:2:{s:3:\"src\";s:72:\"https://ps.w.org/the-events-calendar/assets/screenshot-8.png?rev=2755131\";s:7:\"caption\";s:23:\"Mostrar configurações\";}i:9;a:2:{s:3:\"src\";s:72:\"https://ps.w.org/the-events-calendar/assets/screenshot-9.png?rev=2755131\";s:7:\"caption\";s:17:\"Importador de CSV\";}}s:4:\"tags\";a:5:{s:8:\"calendar\";s:8:\"calendar\";s:5:\"event\";s:5:\"Event\";s:6:\"events\";s:6:\"events\";s:9:\"organizer\";s:9:\"organizer\";s:8:\"schedule\";s:8:\"schedule\";}s:8:\"versions\";a:409:{s:3:\"1.5\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.1.5.zip\";s:5:\"1.5.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.1.5.1.zip\";s:5:\"1.5.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.1.5.2.zip\";s:5:\"1.5.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.1.5.3.zip\";s:5:\"1.5.4\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.1.5.4.zip\";s:5:\"1.5.5\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.1.5.5.zip\";s:5:\"1.5.6\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.1.5.6.zip\";s:3:\"1.6\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.1.6.zip\";s:5:\"1.6.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.1.6.1.zip\";s:5:\"1.6.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.1.6.2.zip\";s:5:\"1.6.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.1.6.3.zip\";s:5:\"1.6.4\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.1.6.4.zip\";s:5:\"1.6.5\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.1.6.5.zip\";s:3:\"2.0\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.2.0.zip\";s:5:\"2.0.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.2.0.1.zip\";s:6:\"2.0.10\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.2.0.10.zip\";s:6:\"2.0.11\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.2.0.11.zip\";s:5:\"2.0.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.2.0.2.zip\";s:5:\"2.0.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.2.0.3.zip\";s:5:\"2.0.4\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.2.0.4.zip\";s:5:\"2.0.5\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.2.0.5.zip\";s:5:\"2.0.6\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.2.0.6.zip\";s:5:\"2.0.7\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.2.0.7.zip\";s:5:\"2.0.8\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.2.0.8.zip\";s:5:\"2.0.9\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.2.0.9.zip\";s:3:\"3.0\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.0.zip\";s:5:\"3.0.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.0.1.zip\";s:5:\"3.0.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.0.2.zip\";s:5:\"3.0.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.0.3.zip\";s:3:\"3.1\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.1.zip\";s:4:\"3.10\";s:67:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.10.zip\";s:6:\"3.10.1\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.10.1.zip\";s:4:\"3.11\";s:67:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.11.zip\";s:6:\"3.11.1\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.11.1.zip\";s:6:\"3.11.2\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.11.2.zip\";s:4:\"3.12\";s:67:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.12.zip\";s:6:\"3.12.1\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.12.1.zip\";s:6:\"3.12.2\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.12.2.zip\";s:6:\"3.12.3\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.12.3.zip\";s:6:\"3.12.4\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.12.4.zip\";s:6:\"3.12.5\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.12.5.zip\";s:6:\"3.12.6\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.12.6.zip\";s:3:\"3.2\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.2.zip\";s:3:\"3.3\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.3.zip\";s:5:\"3.3.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.3.1.zip\";s:3:\"3.4\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.4.zip\";s:5:\"3.4.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.4.1.zip\";s:3:\"3.5\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.5.zip\";s:5:\"3.5.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.5.1.zip\";s:3:\"3.6\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.6.zip\";s:5:\"3.6.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.6.1.zip\";s:3:\"3.7\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.7.zip\";s:3:\"3.8\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.8.zip\";s:5:\"3.8.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.8.1.zip\";s:3:\"3.9\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.9.zip\";s:5:\"3.9.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.9.1.zip\";s:5:\"3.9.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.9.2.zip\";s:5:\"3.9.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.3.9.3.zip\";s:3:\"4.0\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.0.zip\";s:5:\"4.0.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.0.1.zip\";s:5:\"4.0.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.0.2.zip\";s:5:\"4.0.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.0.3.zip\";s:5:\"4.0.4\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.0.4.zip\";s:5:\"4.0.5\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.0.5.zip\";s:5:\"4.0.6\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.0.6.zip\";s:5:\"4.0.7\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.0.7.zip\";s:3:\"4.1\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.1.zip\";s:7:\"4.1.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.1.0.1.zip\";s:5:\"4.1.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.1.1.zip\";s:7:\"4.1.1.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.1.1.1.zip\";s:5:\"4.1.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.1.2.zip\";s:5:\"4.1.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.1.3.zip\";s:5:\"4.1.4\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.1.4.zip\";s:3:\"4.2\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.2.zip\";s:5:\"4.2.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.2.1.zip\";s:7:\"4.2.1.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.2.1.1.zip\";s:5:\"4.2.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.2.2.zip\";s:5:\"4.2.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.2.3.zip\";s:5:\"4.2.4\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.2.4.zip\";s:5:\"4.2.5\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.2.5.zip\";s:5:\"4.2.6\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.2.6.zip\";s:5:\"4.2.7\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.2.7.zip\";s:3:\"4.3\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.3.zip\";s:7:\"4.3.0.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.3.0.2.zip\";s:5:\"4.3.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.3.1.zip\";s:7:\"4.3.1.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.3.1.2.zip\";s:7:\"4.3.2.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.3.2.1.zip\";s:7:\"4.3.3.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.3.3.1.zip\";s:7:\"4.3.4.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.3.4.1.zip\";s:7:\"4.3.4.3\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.3.4.3.zip\";s:7:\"4.3.5.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.3.5.1.zip\";s:3:\"4.4\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.4.zip\";s:7:\"4.4.0.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.4.0.2.zip\";s:5:\"4.4.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.4.1.zip\";s:7:\"4.4.1.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.4.1.2.zip\";s:7:\"4.4.2.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.4.2.1.zip\";s:7:\"4.4.3.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.4.3.1.zip\";s:7:\"4.4.4.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.4.4.1.zip\";s:7:\"4.4.5.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.4.5.1.zip\";s:3:\"4.5\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.zip\";s:7:\"4.5.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.0.1.zip\";s:7:\"4.5.0.3\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.0.3.zip\";s:7:\"4.5.1.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.1.1.zip\";s:6:\"4.5.10\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.10.zip\";s:8:\"4.5.10.2\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.10.2.zip\";s:8:\"4.5.11.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.11.1.zip\";s:6:\"4.5.12\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.12.zip\";s:8:\"4.5.12.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.12.1.zip\";s:8:\"4.5.12.2\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.12.2.zip\";s:8:\"4.5.12.4\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.12.4.zip\";s:8:\"4.5.13.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.13.1.zip\";s:5:\"4.5.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.2.zip\";s:7:\"4.5.2.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.2.2.zip\";s:7:\"4.5.3.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.3.1.zip\";s:7:\"4.5.4.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.4.1.zip\";s:7:\"4.5.5.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.5.1.zip\";s:7:\"4.5.6.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.6.1.zip\";s:7:\"4.5.7.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.7.1.zip\";s:5:\"4.5.8\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.8.zip\";s:7:\"4.5.8.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.8.2.zip\";s:7:\"4.5.9.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.5.9.1.zip\";s:7:\"4.6.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.0.1.zip\";s:7:\"4.6.1.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.1.1.zip\";s:6:\"4.6.10\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.10.zip\";s:8:\"4.6.10.2\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.10.2.zip\";s:6:\"4.6.11\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.11.zip\";s:8:\"4.6.11.2\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.11.2.zip\";s:8:\"4.6.12.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.12.1.zip\";s:8:\"4.6.13.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.13.1.zip\";s:6:\"4.6.14\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.14.zip\";s:8:\"4.6.14.2\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.14.2.zip\";s:8:\"4.6.15.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.15.1.zip\";s:8:\"4.6.16.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.16.1.zip\";s:8:\"4.6.17.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.17.1.zip\";s:8:\"4.6.18.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.18.1.zip\";s:8:\"4.6.19.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.19.1.zip\";s:7:\"4.6.2.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.2.1.zip\";s:6:\"4.6.20\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.20.zip\";s:8:\"4.6.20.2\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.20.2.zip\";s:8:\"4.6.21.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.21.1.zip\";s:6:\"4.6.22\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.22.zip\";s:8:\"4.6.22.2\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.22.2.zip\";s:8:\"4.6.23.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.23.1.zip\";s:6:\"4.6.24\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.24.zip\";s:8:\"4.6.24.2\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.24.2.zip\";s:8:\"4.6.25.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.25.1.zip\";s:6:\"4.6.26\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.26.zip\";s:8:\"4.6.26.2\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.26.2.zip\";s:7:\"4.6.3.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.3.1.zip\";s:7:\"4.6.4.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.4.1.zip\";s:7:\"4.6.5.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.5.1.zip\";s:7:\"4.6.6.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.6.1.zip\";s:7:\"4.6.7.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.7.1.zip\";s:7:\"4.6.8.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.8.1.zip\";s:7:\"4.6.9.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.6.9.1.zip\";s:3:\"4.7\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.7.zip\";s:7:\"4.7.0.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.7.0.2.zip\";s:7:\"4.7.1.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.7.1.1.zip\";s:7:\"4.7.2.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.7.2.1.zip\";s:7:\"4.7.3.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.7.3.1.zip\";s:7:\"4.7.4.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.7.4.1.zip\";s:3:\"4.8\";s:66:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.8.zip\";s:7:\"4.8.0.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.8.0.2.zip\";s:7:\"4.8.1.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.8.1.1.zip\";s:7:\"4.8.2.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.8.2.1.zip\";s:7:\"4.9.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.0.1.zip\";s:7:\"4.9.0.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.0.2.zip\";s:7:\"4.9.0.4\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.0.4.zip\";s:5:\"4.9.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.1.zip\";s:7:\"4.9.1.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.1.2.zip\";s:8:\"4.9.10.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.10.1.zip\";s:8:\"4.9.11.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.11.1.zip\";s:8:\"4.9.12.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.12.1.zip\";s:8:\"4.9.13.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.13.1.zip\";s:8:\"4.9.14.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.14.1.zip\";s:7:\"4.9.2.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.2.1.zip\";s:5:\"4.9.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.3.zip\";s:7:\"4.9.3.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.3.1.zip\";s:7:\"4.9.3.3\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.3.3.zip\";s:7:\"4.9.4.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.4.1.zip\";s:7:\"4.9.5.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.5.1.zip\";s:7:\"4.9.6.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.6.1.zip\";s:7:\"4.9.7.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.7.1.zip\";s:7:\"4.9.8.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.8.1.zip\";s:7:\"4.9.9.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.4.9.9.1.zip\";s:5:\"5.0.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.0.0.zip\";s:7:\"5.0.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.0.0.1.zip\";s:7:\"5.0.0.3\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.0.0.3.zip\";s:7:\"5.0.1.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.0.1.1.zip\";s:7:\"5.0.1.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.0.1.2.zip\";s:5:\"5.0.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.0.2.zip\";s:7:\"5.0.2.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.0.2.2.zip\";s:7:\"5.0.2.3\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.0.2.3.zip\";s:5:\"5.0.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.0.3.zip\";s:7:\"5.0.3.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.0.3.2.zip\";s:7:\"5.0.3.3\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.0.3.3.zip\";s:7:\"5.1.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.1.0.1.zip\";s:7:\"5.1.0.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.1.0.2.zip\";s:7:\"5.1.1.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.1.1.1.zip\";s:7:\"5.1.1.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.1.1.2.zip\";s:7:\"5.1.2.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.1.2.1.zip\";s:7:\"5.1.2.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.1.2.2.zip\";s:5:\"5.1.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.1.3.zip\";s:7:\"5.1.3.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.1.3.1.zip\";s:5:\"5.1.4\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.1.4.zip\";s:7:\"5.1.4.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.1.4.1.zip\";s:5:\"5.1.5\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.1.5.zip\";s:7:\"5.1.5.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.1.5.1.zip\";s:5:\"5.1.6\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.1.6.zip\";s:7:\"5.1.6.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.1.6.1.zip\";s:6:\"5.10.0\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.10.0.zip\";s:6:\"5.10.1\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.10.1.zip\";s:6:\"5.11.0\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.11.0.zip\";s:6:\"5.12.0\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.12.0.zip\";s:6:\"5.12.1\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.12.1.zip\";s:6:\"5.12.2\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.12.2.zip\";s:6:\"5.12.3\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.12.3.zip\";s:6:\"5.12.4\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.12.4.zip\";s:6:\"5.13.0\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.13.0.zip\";s:6:\"5.14.0\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.14.0.zip\";s:8:\"5.14.0.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.14.0.1.zip\";s:8:\"5.14.0.2\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.14.0.2.zip\";s:8:\"5.14.0.3\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.14.0.3.zip\";s:8:\"5.14.0.4\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.14.0.4.zip\";s:6:\"5.14.1\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.14.1.zip\";s:6:\"5.14.2\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.14.2.zip\";s:8:\"5.14.2.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.14.2.1.zip\";s:6:\"5.15.0\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.15.0.zip\";s:8:\"5.15.0.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.15.0.1.zip\";s:6:\"5.16.0\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.16.0.zip\";s:6:\"5.16.1\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.16.1.zip\";s:8:\"5.16.1.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.16.1.1.zip\";s:6:\"5.16.2\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.16.2.zip\";s:8:\"5.16.2.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.16.2.1.zip\";s:6:\"5.16.3\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.16.3.zip\";s:8:\"5.16.3.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.16.3.1.zip\";s:6:\"5.16.4\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.16.4.zip\";s:8:\"5.16.4.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.16.4.1.zip\";s:5:\"5.2.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.2.0.zip\";s:7:\"5.2.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.2.0.1.zip\";s:5:\"5.2.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.2.1.zip\";s:7:\"5.2.1.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.2.1.1.zip\";s:7:\"5.2.1.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.2.1.2.zip\";s:5:\"5.3.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.3.0.zip\";s:7:\"5.3.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.3.0.1.zip\";s:5:\"5.3.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.3.1.zip\";s:7:\"5.3.1.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.3.1.1.zip\";s:7:\"5.3.1.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.3.1.2.zip\";s:5:\"5.3.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.3.2.zip\";s:7:\"5.3.2.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.3.2.1.zip\";s:7:\"5.3.2.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.3.2.2.zip\";s:5:\"5.4.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.4.0.zip\";s:7:\"5.4.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.4.0.1.zip\";s:7:\"5.4.0.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.4.0.2.zip\";s:7:\"5.4.0.3\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.4.0.3.zip\";s:5:\"5.5.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.5.0.zip\";s:7:\"5.5.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.5.0.1.zip\";s:7:\"5.5.0.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.5.0.2.zip\";s:5:\"5.6.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.6.0.zip\";s:5:\"5.7.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.7.0.zip\";s:5:\"5.7.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.7.1.zip\";s:5:\"5.8.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.8.0.zip\";s:5:\"5.8.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.8.1.zip\";s:5:\"5.8.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.8.2.zip\";s:5:\"5.9.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.9.0.zip\";s:5:\"5.9.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.9.1.zip\";s:5:\"5.9.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.5.9.2.zip\";s:5:\"6.0.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.0.zip\";s:7:\"6.0.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.0.1.zip\";s:5:\"6.0.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.1.zip\";s:7:\"6.0.1.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.1.1.zip\";s:6:\"6.0.10\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.10.zip\";s:6:\"6.0.11\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.11.zip\";s:6:\"6.0.12\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.12.zip\";s:6:\"6.0.13\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.13.zip\";s:8:\"6.0.13.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.13.1.zip\";s:5:\"6.0.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.2.zip\";s:5:\"6.0.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.3.zip\";s:7:\"6.0.3.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.3.1.zip\";s:5:\"6.0.4\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.4.zip\";s:5:\"6.0.5\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.5.zip\";s:5:\"6.0.6\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.6.zip\";s:7:\"6.0.6.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.6.1.zip\";s:7:\"6.0.6.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.6.2.zip\";s:5:\"6.0.7\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.7.zip\";s:7:\"6.0.7.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.7.1.zip\";s:5:\"6.0.8\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.8.zip\";s:5:\"6.0.9\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.0.9.zip\";s:5:\"6.1.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.1.0.zip\";s:7:\"6.1.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.1.0.1.zip\";s:7:\"6.1.0.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.1.0.2.zip\";s:5:\"6.1.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.1.1.zip\";s:5:\"6.1.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.1.2.zip\";s:7:\"6.1.2.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.1.2.1.zip\";s:7:\"6.1.2.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.1.2.2.zip\";s:5:\"6.1.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.1.3.zip\";s:5:\"6.1.4\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.1.4.zip\";s:6:\"6.10.0\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.10.0.zip\";s:6:\"6.10.1\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.10.1.zip\";s:8:\"6.10.1.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.10.1.1.zip\";s:6:\"6.10.2\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.10.2.zip\";s:6:\"6.10.3\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.10.3.zip\";s:6:\"6.11.0\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.11.0.zip\";s:8:\"6.11.0.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.11.0.1.zip\";s:6:\"6.11.1\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.11.1.zip\";s:6:\"6.11.2\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.11.2.zip\";s:8:\"6.11.2.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.11.2.1.zip\";s:6:\"6.12.0\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.12.0.zip\";s:8:\"6.12.0.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.12.0.1.zip\";s:6:\"6.13.0\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.13.0.zip\";s:6:\"6.13.1\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.13.1.zip\";s:6:\"6.13.2\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.13.2.zip\";s:8:\"6.13.2.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.13.2.1.zip\";s:6:\"6.14.0\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.14.0.zip\";s:6:\"6.14.1\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.14.1.zip\";s:6:\"6.14.2\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.14.2.zip\";s:6:\"6.15.0\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.0.zip\";s:8:\"6.15.0.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.0.1.zip\";s:6:\"6.15.1\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.1.zip\";s:8:\"6.15.1.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.1.1.zip\";s:7:\"6.15.10\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.10.zip\";s:7:\"6.15.11\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.11.zip\";s:7:\"6.15.12\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.12.zip\";s:9:\"6.15.12.1\";s:72:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.12.1.zip\";s:9:\"6.15.12.2\";s:72:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.12.2.zip\";s:7:\"6.15.13\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.13.zip\";s:9:\"6.15.13.1\";s:72:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.13.1.zip\";s:7:\"6.15.14\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.14.zip\";s:7:\"6.15.15\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.15.zip\";s:7:\"6.15.16\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.16.zip\";s:9:\"6.15.16.1\";s:72:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.16.1.zip\";s:7:\"6.15.17\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.17.zip\";s:9:\"6.15.17.1\";s:72:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.17.1.zip\";s:7:\"6.15.18\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.18.zip\";s:7:\"6.15.19\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.19.zip\";s:6:\"6.15.2\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.2.zip\";s:7:\"6.15.20\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.20.zip\";s:6:\"6.15.3\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.3.zip\";s:6:\"6.15.4\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.4.zip\";s:6:\"6.15.5\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.5.zip\";s:6:\"6.15.6\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.6.zip\";s:6:\"6.15.7\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.7.zip\";s:6:\"6.15.8\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.8.zip\";s:6:\"6.15.9\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.15.9.zip\";s:6:\"6.16.0\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.16.0.zip\";s:6:\"6.16.1\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.16.1.zip\";s:6:\"6.16.2\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.16.2.zip\";s:6:\"6.16.3\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.16.3.zip\";s:6:\"6.16.4\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.16.4.zip\";s:8:\"6.16.4.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.16.4.1.zip\";s:6:\"6.16.5\";s:69:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.16.5.zip\";s:8:\"6.16.5.1\";s:71:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.16.5.1.zip\";s:5:\"6.2.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.0.zip\";s:7:\"6.2.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.0.1.zip\";s:5:\"6.2.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.1.zip\";s:5:\"6.2.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.2.zip\";s:7:\"6.2.2.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.2.1.zip\";s:5:\"6.2.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.3.zip\";s:7:\"6.2.3.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.3.1.zip\";s:7:\"6.2.3.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.3.2.zip\";s:5:\"6.2.4\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.4.zip\";s:5:\"6.2.5\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.5.zip\";s:5:\"6.2.6\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.6.zip\";s:7:\"6.2.6.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.6.1.zip\";s:5:\"6.2.7\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.7.zip\";s:5:\"6.2.8\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.8.zip\";s:7:\"6.2.8.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.8.1.zip\";s:7:\"6.2.8.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.8.2.zip\";s:5:\"6.2.9\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.2.9.zip\";s:5:\"6.3.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.3.0.zip\";s:5:\"6.3.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.3.1.zip\";s:5:\"6.3.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.3.2.zip\";s:5:\"6.3.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.3.3.zip\";s:7:\"6.3.3.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.3.3.1.zip\";s:5:\"6.3.4\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.3.4.zip\";s:5:\"6.3.5\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.3.5.zip\";s:5:\"6.3.6\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.3.6.zip\";s:5:\"6.3.7\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.3.7.zip\";s:5:\"6.4.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.4.0.zip\";s:7:\"6.4.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.4.0.1.zip\";s:5:\"6.5.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.5.0.zip\";s:7:\"6.5.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.5.0.1.zip\";s:5:\"6.5.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.5.1.zip\";s:7:\"6.5.1.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.5.1.1.zip\";s:7:\"6.5.1.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.5.1.2.zip\";s:7:\"6.5.1.3\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.5.1.3.zip\";s:7:\"6.5.1.4\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.5.1.4.zip\";s:7:\"6.5.1.5\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.5.1.5.zip\";s:7:\"6.5.1.6\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.5.1.6.zip\";s:5:\"6.5.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.5.2.zip\";s:5:\"6.6.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.6.0.zip\";s:7:\"6.6.0.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.6.0.1.zip\";s:7:\"6.6.0.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.6.0.2.zip\";s:5:\"6.6.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.6.1.zip\";s:5:\"6.6.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.6.2.zip\";s:5:\"6.6.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.6.3.zip\";s:5:\"6.6.4\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.6.4.zip\";s:7:\"6.6.4.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.6.4.1.zip\";s:7:\"6.6.4.2\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.6.4.2.zip\";s:5:\"6.7.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.7.0.zip\";s:5:\"6.7.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.7.1.zip\";s:5:\"6.8.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.8.0.zip\";s:5:\"6.8.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.8.1.zip\";s:5:\"6.8.2\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.8.2.zip\";s:7:\"6.8.2.1\";s:70:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.8.2.1.zip\";s:5:\"6.8.3\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.8.3.zip\";s:5:\"6.9.0\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.9.0.zip\";s:5:\"6.9.1\";s:68:\"https://downloads.wordpress.org/plugin/the-events-calendar.6.9.1.zip\";s:5:\"trunk\";s:62:\"https://downloads.wordpress.org/plugin/the-events-calendar.zip\";}s:14:\"business_model\";b:0;s:14:\"repository_url\";s:0:\"\";s:22:\"commercial_support_url\";s:0:\"\";s:11:\"donate_link\";s:18:\"https://evnt.is/29\";s:7:\"banners\";a:2:{s:3:\"low\";s:74:\"https://ps.w.org/the-events-calendar/assets/banner-772x250.png?rev=2257622\";s:4:\"high\";s:75:\"https://ps.w.org/the-events-calendar/assets/banner-1544x500.png?rev=2257622\";}s:5:\"icons\";a:2:{s:2:\"1x\";s:72:\"https://ps.w.org/the-events-calendar/assets/icon-128x128.gif?rev=2516440\";s:2:\"2x\";s:72:\"https://ps.w.org/the-events-calendar/assets/icon-256x256.gif?rev=2516440\";}s:12:\"preview_link\";s:0:\"\";s:4:\"Name\";s:19:\"The Events Calendar\";}}', 'off');
INSERT INTO `wp_options` VALUES ('156', 'recently_activated', 'a:0:{}', 'off');
INSERT INTO `wp_options` VALUES ('159', 'finished_updating_comment_type', '1', 'auto');
INSERT INTO `wp_options` VALUES ('180', 'categoria-achadinho_children', 'a:0:{}', 'auto');
INSERT INTO `wp_options` VALUES ('214', '_transient_health-check-site-status-result', '{\"good\":16,\"recommended\":7,\"critical\":1}', 'on');
INSERT INTO `wp_options` VALUES ('222', 'auto_core_update_notified', 'a:4:{s:4:\"type\";s:7:\"success\";s:5:\"email\";s:20:\"pcyasuic@outlook.com\";s:7:\"version\";s:3:\"7.0\";s:9:\"timestamp\";i:1783151551;}', 'off');
INSERT INTO `wp_options` VALUES ('225', 'generate_dynamic_css_output', 'body{background-color:var(--base-2);color:var(--contrast);}a{color:var(--accent);}a{text-decoration:underline;}.entry-title a, .site-branding a, a.button, .wp-block-button__link, .main-navigation a{text-decoration:none;}a:hover, a:focus, a:active{color:var(--contrast);}.wp-block-group__inner-container{max-width:1200px;margin-left:auto;margin-right:auto;}:root{--contrast:#222222;--contrast-2:#575760;--contrast-3:#b2b2be;--base:#f0f0f0;--base-2:#f7f8f9;--base-3:#ffffff;--accent:#1e73be;}:root .has-contrast-color{color:var(--contrast);}:root .has-contrast-background-color{background-color:var(--contrast);}:root .has-contrast-2-color{color:var(--contrast-2);}:root .has-contrast-2-background-color{background-color:var(--contrast-2);}:root .has-contrast-3-color{color:var(--contrast-3);}:root .has-contrast-3-background-color{background-color:var(--contrast-3);}:root .has-base-color{color:var(--base);}:root .has-base-background-color{background-color:var(--base);}:root .has-base-2-color{color:var(--base-2);}:root .has-base-2-background-color{background-color:var(--base-2);}:root .has-base-3-color{color:var(--base-3);}:root .has-base-3-background-color{background-color:var(--base-3);}:root .has-accent-color{color:var(--accent);}:root .has-accent-background-color{background-color:var(--accent);}.top-bar{background-color:#636363;color:#ffffff;}.top-bar a{color:#ffffff;}.top-bar a:hover{color:#303030;}.site-header{background-color:var(--base-3);}.main-title a,.main-title a:hover{color:var(--contrast);}.site-description{color:var(--contrast-2);}.mobile-menu-control-wrapper .menu-toggle,.mobile-menu-control-wrapper .menu-toggle:hover,.mobile-menu-control-wrapper .menu-toggle:focus,.has-inline-mobile-toggle #site-navigation.toggled{background-color:rgba(0, 0, 0, 0.02);}.main-navigation,.main-navigation ul ul{background-color:var(--base-3);}.main-navigation .main-nav ul li a, .main-navigation .menu-toggle, .main-navigation .menu-bar-items{color:var(--contrast);}.main-navigation .main-nav ul li:not([class*=\"current-menu-\"]):hover > a, .main-navigation .main-nav ul li:not([class*=\"current-menu-\"]):focus > a, .main-navigation .main-nav ul li.sfHover:not([class*=\"current-menu-\"]) > a, .main-navigation .menu-bar-item:hover > a, .main-navigation .menu-bar-item.sfHover > a{color:var(--accent);}button.menu-toggle:hover,button.menu-toggle:focus{color:var(--contrast);}.main-navigation .main-nav ul li[class*=\"current-menu-\"] > a{color:var(--accent);}.navigation-search input[type=\"search\"],.navigation-search input[type=\"search\"]:active, .navigation-search input[type=\"search\"]:focus, .main-navigation .main-nav ul li.search-item.active > a, .main-navigation .menu-bar-items .search-item.active > a{color:var(--accent);}.main-navigation ul ul{background-color:var(--base);}.separate-containers .inside-article, .separate-containers .comments-area, .separate-containers .page-header, .one-container .container, .separate-containers .paging-navigation, .inside-page-header{background-color:var(--base-3);}.entry-title a{color:var(--contrast);}.entry-title a:hover{color:var(--contrast-2);}.entry-meta{color:var(--contrast-2);}.sidebar .widget{background-color:var(--base-3);}.footer-widgets{background-color:var(--base-3);}.site-info{background-color:var(--base-3);}input[type=\"text\"],input[type=\"email\"],input[type=\"url\"],input[type=\"password\"],input[type=\"search\"],input[type=\"tel\"],input[type=\"number\"],textarea,select{color:var(--contrast);background-color:var(--base-2);border-color:var(--base);}input[type=\"text\"]:focus,input[type=\"email\"]:focus,input[type=\"url\"]:focus,input[type=\"password\"]:focus,input[type=\"search\"]:focus,input[type=\"tel\"]:focus,input[type=\"number\"]:focus,textarea:focus,select:focus{color:var(--contrast);background-color:var(--base-2);border-color:var(--contrast-3);}button,html input[type=\"button\"],input[type=\"reset\"],input[type=\"submit\"],a.button,a.wp-block-button__link:not(.has-background){color:#ffffff;background-color:#55555e;}button:hover,html input[type=\"button\"]:hover,input[type=\"reset\"]:hover,input[type=\"submit\"]:hover,a.button:hover,button:focus,html input[type=\"button\"]:focus,input[type=\"reset\"]:focus,input[type=\"submit\"]:focus,a.button:focus,a.wp-block-button__link:not(.has-background):active,a.wp-block-button__link:not(.has-background):focus,a.wp-block-button__link:not(.has-background):hover{color:#ffffff;background-color:#3f4047;}a.generate-back-to-top{background-color:rgba( 0,0,0,0.4 );color:#ffffff;}a.generate-back-to-top:hover,a.generate-back-to-top:focus{background-color:rgba( 0,0,0,0.6 );color:#ffffff;}:root{--gp-search-modal-bg-color:var(--base-3);--gp-search-modal-text-color:var(--contrast);--gp-search-modal-overlay-bg-color:rgba(0,0,0,0.2);}@media (max-width:768px){.main-navigation .menu-bar-item:hover > a, .main-navigation .menu-bar-item.sfHover > a{background:none;color:var(--contrast);}}.nav-below-header .main-navigation .inside-navigation.grid-container, .nav-above-header .main-navigation .inside-navigation.grid-container{padding:0px 20px 0px 20px;}.site-main .wp-block-group__inner-container{padding:40px;}.separate-containers .paging-navigation{padding-top:20px;padding-bottom:20px;}.entry-content .alignwide, body:not(.no-sidebar) .entry-content .alignfull{margin-left:-40px;width:calc(100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} + 80px);max-width:calc(100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} + 80px);}.rtl .menu-item-has-children .dropdown-menu-toggle{padding-left:20px;}.rtl .main-navigation .main-nav ul li.menu-item-has-children > a{padding-right:20px;}@media (max-width:768px){.separate-containers .inside-article, .separate-containers .comments-area, .separate-containers .page-header, .separate-containers .paging-navigation, .one-container .site-content, .inside-page-header{padding:30px;}.site-main .wp-block-group__inner-container{padding:30px;}.inside-top-bar{padding-right:30px;padding-left:30px;}.inside-header{padding-right:30px;padding-left:30px;}.widget-area .widget{padding-top:30px;padding-right:30px;padding-bottom:30px;padding-left:30px;}.footer-widgets-container{padding-top:30px;padding-right:30px;padding-bottom:30px;padding-left:30px;}.inside-site-info{padding-right:30px;padding-left:30px;}.entry-content .alignwide, body:not(.no-sidebar) .entry-content .alignfull{margin-left:-30px;width:calc(100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} + 60px);max-width:calc(100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} + 60px);}.one-container .site-main .paging-navigation{margin-bottom:20px;}}', 'auto');
INSERT INTO `wp_options` VALUES ('245', 'wp_calendar_block_has_published_posts', '1', 'auto');
INSERT INTO `wp_options` VALUES ('257', 'elementor_landing_pages_activation', '0', 'auto');
INSERT INTO `wp_options` VALUES ('258', 'elementor_checklist', '{\"last_opened_timestamp\":null,\"first_closed_checklist_in_editor\":false,\"is_popup_minimized\":false,\"steps\":{\"add_logo\":{\"is_marked_completed\":false,\"is_immutable_completed\":false},\"set_fonts_and_colors\":{\"is_marked_completed\":false,\"is_immutable_completed\":false},\"create_pages\":{\"is_marked_completed\":false,\"is_immutable_completed\":false},\"setup_header\":{\"is_marked_completed\":false,\"is_immutable_completed\":false},\"assign_homepage\":{\"is_marked_completed\":false,\"is_immutable_completed\":false}},\"should_open_in_editor\":false}', 'auto');
INSERT INTO `wp_options` VALUES ('259', 'elementor_version', '4.1.4', 'auto');
INSERT INTO `wp_options` VALUES ('260', 'elementor_install_history', 'a:1:{s:5:\"4.1.4\";i:1783219375;}', 'auto');
INSERT INTO `wp_options` VALUES ('261', '_elementor_10th_bday_data', 'a:2:{s:7:\"timeout\";i:1783382203;s:5:\"value\";s:483:\"{\"header\":\"Celebrate 10 years of Elementor\",\"content\":\"Unlock more capabilities for less with limited-time savings on selected plans. Offer ends June 17.\",\"cta\":{\"label\":\"Get discounts\",\"url\":\"https:\\/\\/go.elementor.com\\/go-pro-editor-10bd-easter-egg\\/\"},\"time_frame\":{\"start\":\"6\\/15\\/2026T10:00:00Z\",\"end\":\"6\\/17\\/2026T03:59:59Z\"},\"hero\":\"https:\\/\\/assets.elementor.com\\/10th-bday\\/v1\\/images\\/hero.png\",\"lottie\":\"https:\\/\\/assets.elementor.com\\/10th-bday\\/v1\\/lotties\\/intro.json\"}\";}', 'off');
INSERT INTO `wp_options` VALUES ('270', 'astra-settings', 'a:3:{s:18:\"theme-auto-version\";s:6:\"4.12.6\";s:22:\"is_theme_queue_running\";b:0;s:23:\"footer-copyright-editor\";s:77:\"Copyright &copy; 2026 Blog voltado a informa&ccedil;&otilde;es de tecnologias\";}', 'auto');
INSERT INTO `wp_options` VALUES ('271', 'elementor_remote_info_feed_data', 'a:3:{i:0;a:5:{s:5:\"title\";s:43:\"Introducing Angie: Agentic AI for WordPress\";s:7:\"excerpt\";s:365:\"Meet Angie, agentic AI purpose-built for WordPress. Angie understands your site, connects to your tools, and takes real actions on your behalf. Its first capability, Angie Code, lets you describe any WordPress feature you can imagine and have it built for you in minutes. Production-ready, fully integrated with your site, and safe to test before it ever goes live.\";s:7:\"created\";i:1774270910;s:5:\"badge\";s:3:\"NEW\";s:3:\"url\";s:142:\"https://elementor.com/blog/introducing-angie-agentic-ai-for-wordpress/?utm_source=wp-overview-widget&utm_medium=wp-dash&utm_campaign=news-feed\";}i:1;a:5:{s:5:\"title\";s:59:\"The atomic foundation of version 4 is ready for real sites!\";s:7:\"excerpt\";s:296:\"The alpha phase is complete. Version 4 is now in beta, and the atomic foundation is ready to be used on real sites! This is the final step before the official release of version 4.0, activating the new features automatically on new sites, and becoming the default editing experience in Elementor.\";s:7:\"created\";i:1770651621;s:5:\"badge\";s:3:\"NEW\";s:3:\"url\";s:113:\"https://elementor.com/blog/editor-4-beta/?utm_source=wp-overview-widget&utm_medium=wp-dash&utm_campaign=news-feed\";}i:2;a:5:{s:5:\"title\";s:79:\"Introducing Elementor 3.33: Variables Manager, Custom CSS, Blend Modes, & more!\";s:7:\"excerpt\";s:340:\"Elementor 3.33 builds on the foundation of Editor V4, continuing our mission to create a faster, more scalable, and more intuitive design experience for Web Creators. With the addition of the Variables Manager, element-level Custom CSS, Background Clipping, and Blend Modes, designers have more creative precision and consistency than ever.\";s:7:\"created\";i:1762944115;s:5:\"badge\";s:3:\"NEW\";s:3:\"url\";s:145:\"https://elementor.com/blog/elementor-333-v4-variables-manager-custom-css/?utm_source=wp-overview-widget&utm_medium=wp-dash&utm_campaign=news-feed\";}}', 'off');
INSERT INTO `wp_options` VALUES ('277', 'elementor_events_db_version', '1.0.0', 'off');
INSERT INTO `wp_options` VALUES ('291', 'rewrite_rules', 'a:91:{s:11:\"^wp-json/?$\";s:22:\"index.php?rest_route=/\";s:14:\"^wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:21:\"^index.php/wp-json/?$\";s:22:\"index.php?rest_route=/\";s:24:\"^index.php/wp-json/(.*)?\";s:33:\"index.php?rest_route=/$matches[1]\";s:17:\"^wp-sitemap\\.xml$\";s:23:\"index.php?sitemap=index\";s:17:\"^wp-sitemap\\.xsl$\";s:36:\"index.php?sitemap-stylesheet=sitemap\";s:23:\"^wp-sitemap-index\\.xsl$\";s:34:\"index.php?sitemap-stylesheet=index\";s:48:\"^wp-sitemap-([a-z]+?)-([a-z\\d_-]+?)-(\\d+?)\\.xml$\";s:75:\"index.php?sitemap=$matches[1]&sitemap-subtype=$matches[2]&paged=$matches[3]\";s:34:\"^wp-sitemap-([a-z]+?)-(\\d+?)\\.xml$\";s:47:\"index.php?sitemap=$matches[1]&paged=$matches[2]\";s:47:\"category/(.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:42:\"category/(.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:52:\"index.php?category_name=$matches[1]&feed=$matches[2]\";s:23:\"category/(.+?)/embed/?$\";s:46:\"index.php?category_name=$matches[1]&embed=true\";s:35:\"category/(.+?)/page/?([0-9]{1,})/?$\";s:53:\"index.php?category_name=$matches[1]&paged=$matches[2]\";s:17:\"category/(.+?)/?$\";s:35:\"index.php?category_name=$matches[1]\";s:44:\"tag/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:39:\"tag/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?tag=$matches[1]&feed=$matches[2]\";s:20:\"tag/([^/]+)/embed/?$\";s:36:\"index.php?tag=$matches[1]&embed=true\";s:32:\"tag/([^/]+)/page/?([0-9]{1,})/?$\";s:43:\"index.php?tag=$matches[1]&paged=$matches[2]\";s:14:\"tag/([^/]+)/?$\";s:25:\"index.php?tag=$matches[1]\";s:45:\"type/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:40:\"type/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?post_format=$matches[1]&feed=$matches[2]\";s:21:\"type/([^/]+)/embed/?$\";s:44:\"index.php?post_format=$matches[1]&embed=true\";s:33:\"type/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?post_format=$matches[1]&paged=$matches[2]\";s:15:\"type/([^/]+)/?$\";s:33:\"index.php?post_format=$matches[1]\";s:48:\".*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\\.php$\";s:18:\"index.php?feed=old\";s:20:\".*wp-app\\.php(/.*)?$\";s:19:\"index.php?error=403\";s:18:\".*wp-register.php$\";s:23:\"index.php?register=true\";s:32:\"feed/(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:27:\"(feed|rdf|rss|rss2|atom)/?$\";s:27:\"index.php?&feed=$matches[1]\";s:8:\"embed/?$\";s:21:\"index.php?&embed=true\";s:20:\"page/?([0-9]{1,})/?$\";s:28:\"index.php?&paged=$matches[1]\";s:41:\"comments/feed/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:36:\"comments/(feed|rdf|rss|rss2|atom)/?$\";s:42:\"index.php?&feed=$matches[1]&withcomments=1\";s:17:\"comments/embed/?$\";s:21:\"index.php?&embed=true\";s:44:\"search/(.+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:39:\"search/(.+)/(feed|rdf|rss|rss2|atom)/?$\";s:40:\"index.php?s=$matches[1]&feed=$matches[2]\";s:20:\"search/(.+)/embed/?$\";s:34:\"index.php?s=$matches[1]&embed=true\";s:32:\"search/(.+)/page/?([0-9]{1,})/?$\";s:41:\"index.php?s=$matches[1]&paged=$matches[2]\";s:14:\"search/(.+)/?$\";s:23:\"index.php?s=$matches[1]\";s:47:\"author/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:42:\"author/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:50:\"index.php?author_name=$matches[1]&feed=$matches[2]\";s:23:\"author/([^/]+)/embed/?$\";s:44:\"index.php?author_name=$matches[1]&embed=true\";s:35:\"author/([^/]+)/page/?([0-9]{1,})/?$\";s:51:\"index.php?author_name=$matches[1]&paged=$matches[2]\";s:17:\"author/([^/]+)/?$\";s:33:\"index.php?author_name=$matches[1]\";s:69:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:64:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:80:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&feed=$matches[4]\";s:45:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/embed/?$\";s:74:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&embed=true\";s:57:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:81:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]\";s:39:\"([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$\";s:63:\"index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]\";s:56:\"([0-9]{4})/([0-9]{1,2})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:51:\"([0-9]{4})/([0-9]{1,2})/(feed|rdf|rss|rss2|atom)/?$\";s:64:\"index.php?year=$matches[1]&monthnum=$matches[2]&feed=$matches[3]\";s:32:\"([0-9]{4})/([0-9]{1,2})/embed/?$\";s:58:\"index.php?year=$matches[1]&monthnum=$matches[2]&embed=true\";s:44:\"([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$\";s:65:\"index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]\";s:26:\"([0-9]{4})/([0-9]{1,2})/?$\";s:47:\"index.php?year=$matches[1]&monthnum=$matches[2]\";s:43:\"([0-9]{4})/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:38:\"([0-9]{4})/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?year=$matches[1]&feed=$matches[2]\";s:19:\"([0-9]{4})/embed/?$\";s:37:\"index.php?year=$matches[1]&embed=true\";s:31:\"([0-9]{4})/page/?([0-9]{1,})/?$\";s:44:\"index.php?year=$matches[1]&paged=$matches[2]\";s:13:\"([0-9]{4})/?$\";s:26:\"index.php?year=$matches[1]\";s:27:\".?.+?/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\".?.+?/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\".?.+?/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\".?.+?/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\".?.+?/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"(.?.+?)/embed/?$\";s:41:\"index.php?pagename=$matches[1]&embed=true\";s:20:\"(.?.+?)/trackback/?$\";s:35:\"index.php?pagename=$matches[1]&tb=1\";s:40:\"(.?.+?)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:35:\"(.?.+?)/(feed|rdf|rss|rss2|atom)/?$\";s:47:\"index.php?pagename=$matches[1]&feed=$matches[2]\";s:28:\"(.?.+?)/page/?([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&paged=$matches[2]\";s:35:\"(.?.+?)/comment-page-([0-9]{1,})/?$\";s:48:\"index.php?pagename=$matches[1]&cpage=$matches[2]\";s:24:\"(.?.+?)(?:/([0-9]+))?/?$\";s:47:\"index.php?pagename=$matches[1]&page=$matches[2]\";s:27:\"[^/]+/attachment/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:37:\"[^/]+/attachment/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:57:\"[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:52:\"[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:33:\"[^/]+/attachment/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";s:16:\"([^/]+)/embed/?$\";s:37:\"index.php?name=$matches[1]&embed=true\";s:20:\"([^/]+)/trackback/?$\";s:31:\"index.php?name=$matches[1]&tb=1\";s:40:\"([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:35:\"([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:43:\"index.php?name=$matches[1]&feed=$matches[2]\";s:28:\"([^/]+)/page/?([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&paged=$matches[2]\";s:35:\"([^/]+)/comment-page-([0-9]{1,})/?$\";s:44:\"index.php?name=$matches[1]&cpage=$matches[2]\";s:24:\"([^/]+)(?:/([0-9]+))?/?$\";s:43:\"index.php?name=$matches[1]&page=$matches[2]\";s:16:\"[^/]+/([^/]+)/?$\";s:32:\"index.php?attachment=$matches[1]\";s:26:\"[^/]+/([^/]+)/trackback/?$\";s:37:\"index.php?attachment=$matches[1]&tb=1\";s:46:\"[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$\";s:49:\"index.php?attachment=$matches[1]&feed=$matches[2]\";s:41:\"[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$\";s:50:\"index.php?attachment=$matches[1]&cpage=$matches[2]\";s:22:\"[^/]+/([^/]+)/embed/?$\";s:43:\"index.php?attachment=$matches[1]&embed=true\";}', 'auto');
INSERT INTO `wp_options` VALUES ('294', 'theme_mods_astra', 'a:2:{s:18:\"custom_css_post_id\";i:-1;s:18:\"nav_menu_locations\";a:2:{s:7:\"primary\";i:17;s:11:\"footer_menu\";i:18;}}', 'auto');
INSERT INTO `wp_options` VALUES ('298', 'category_children', 'a:0:{}', 'auto');
INSERT INTO `wp_options` VALUES ('300', 'elementor_onboarded', '1', 'auto');
INSERT INTO `wp_options` VALUES ('301', 'elementor_active_kit', '280', 'auto');
INSERT INTO `wp_options` VALUES ('329', 'elementor_log', 'a:2:{s:32:\"bdd368de588070a9c5cfcd553cf1a747\";O:31:\"Elementor\\Core\\Logger\\Items\\PHP\":9:{s:7:\"\0*\0date\";s:19:\"2026-07-05 00:36:16\";s:7:\"\0*\0type\";s:5:\"error\";s:10:\"\0*\0message\";s:1179:\"Uncaught Exception: Access denied. in C:\\xampp\\htdocs\\ideiasti\\wp-content\\plugins\\elementor\\core\\settings\\page\\manager.php:105\nStack trace:\n#0 C:\\xampp\\htdocs\\ideiasti\\wp-content\\plugins\\elementor\\core\\base\\document.php(1811): Elementor\\Core\\Settings\\Page\\Manager-&gt;ajax_before_save_settings()\n#1 C:\\xampp\\htdocs\\ideiasti\\wp-content\\plugins\\elementor\\core\\base\\document.php(911): Elementor\\Core\\Base\\Document-&gt;save_settings()\n#2 C:\\xampp\\htdocs\\ideiasti\\wp-content\\plugins\\elementor\\core\\kits\\manager.php(315): Elementor\\Core\\Base\\Document-&gt;update_settings()\n#3 C:\\xampp\\htdocs\\ideiasti\\wp-content\\plugins\\elementor\\core\\kits\\manager.php(484): Elementor\\Core\\Kits\\Manager-&gt;update_kit_settings_based_on_option()\n#4 C:\\xampp\\htdocs\\ideiasti\\wp-includes\\class-wp-hook.php(343): Elementor\\Core\\Kits\\Manager-&gt;{closure:Elementor\\Core\\Kits\\Manager::__construct():483}()\n#5 C:\\xampp\\htdocs\\ideiasti\\wp-includes\\class-wp-hook.php(365): WP_Hook-&gt;apply_filters()\n#6 C:\\xampp\\htdocs\\ideiasti\\wp-includes\\plugin.php(522): WP_Hook-&gt;do_action()\n#7 C:\\xampp\\htdocs\\ideiasti\\wp-includes\\option.php(1017): do_action()\n#8 Command line code(5): update_option()\n#9 {main}\n  thrown\";s:7:\"\0*\0meta\";a:1:{s:5:\"trace\";a:1:{i:0;a:3:{s:8:\"function\";s:8:\"shutdown\";s:5:\"class\";s:29:\"Elementor\\Core\\Logger\\Manager\";s:4:\"type\";s:2:\"->\";}}}s:8:\"\0*\0times\";i:1;s:14:\"\0*\0times_dates\";a:1:{i:0;s:19:\"2026-07-05 00:36:16\";}s:7:\"\0*\0args\";a:5:{s:4:\"type\";s:5:\"error\";s:7:\"message\";s:1158:\"Uncaught Exception: Access denied. in C:\\xampp\\htdocs\\ideiasti\\wp-content\\plugins\\elementor\\core\\settings\\page\\manager.php:105\nStack trace:\n#0 C:\\xampp\\htdocs\\ideiasti\\wp-content\\plugins\\elementor\\core\\base\\document.php(1811): Elementor\\Core\\Settings\\Page\\Manager->ajax_before_save_settings()\n#1 C:\\xampp\\htdocs\\ideiasti\\wp-content\\plugins\\elementor\\core\\base\\document.php(911): Elementor\\Core\\Base\\Document->save_settings()\n#2 C:\\xampp\\htdocs\\ideiasti\\wp-content\\plugins\\elementor\\core\\kits\\manager.php(315): Elementor\\Core\\Base\\Document->update_settings()\n#3 C:\\xampp\\htdocs\\ideiasti\\wp-content\\plugins\\elementor\\core\\kits\\manager.php(484): Elementor\\Core\\Kits\\Manager->update_kit_settings_based_on_option()\n#4 C:\\xampp\\htdocs\\ideiasti\\wp-includes\\class-wp-hook.php(343): Elementor\\Core\\Kits\\Manager->{closure:Elementor\\Core\\Kits\\Manager::__construct():483}()\n#5 C:\\xampp\\htdocs\\ideiasti\\wp-includes\\class-wp-hook.php(365): WP_Hook->apply_filters()\n#6 C:\\xampp\\htdocs\\ideiasti\\wp-includes\\plugin.php(522): WP_Hook->do_action()\n#7 C:\\xampp\\htdocs\\ideiasti\\wp-includes\\option.php(1017): do_action()\n#8 Command line code(5): update_option()\n#9 {main}\n  thrown\";s:4:\"file\";s:84:\"C:\\xampp\\htdocs\\ideiasti\\wp-content\\plugins\\elementor\\core\\settings\\page\\manager.php\";s:4:\"line\";i:105;s:5:\"trace\";b:1;}s:7:\"\0*\0file\";s:84:\"C:\\xampp\\htdocs\\ideiasti\\wp-content\\plugins\\elementor\\core\\settings\\page\\manager.php\";s:7:\"\0*\0line\";i:105;}s:32:\"fa16de921296cabab515dcc967a46cd5\";O:30:\"Elementor\\Core\\Logger\\Items\\JS\":10:{s:7:\"\0*\0date\";s:19:\"2026-07-05 22:38:50\";s:7:\"\0*\0type\";s:5:\"error\";s:10:\"\0*\0message\";s:31:\"Element type already registered\";s:7:\"\0*\0meta\";a:0:{}s:8:\"\0*\0times\";i:1;s:14:\"\0*\0times_dates\";a:1:{i:0;s:19:\"2026-07-05 22:38:50\";}s:7:\"\0*\0args\";a:6:{s:4:\"type\";s:5:\"error\";s:9:\"timestamp\";s:10:\"1783291130\";s:7:\"message\";s:31:\"Element type already registered\";s:3:\"url\";s:93:\"http://localhost:8082/ideiasti/wp-content/plugins/elementor/assets/js/editor.min.js?ver=4.1.4\";s:4:\"line\";s:1:\"2\";s:6:\"column\";s:6:\"930509\";}s:7:\"\0*\0file\";s:93:\"http://localhost:8082/ideiasti/wp-content/plugins/elementor/assets/js/editor.min.js?ver=4.1.4\";s:7:\"\0*\0line\";s:1:\"2\";s:9:\"\0*\0column\";s:6:\"930509\";}}', 'off');
INSERT INTO `wp_options` VALUES ('397', 'theme_mods_ideiasti-tech', 'a:2:{s:18:\"custom_css_post_id\";i:-1;s:18:\"nav_menu_locations\";a:1:{s:7:\"primary\";i:17;}}', 'auto');
INSERT INTO `wp_options` VALUES ('413', 'wp_debug_php_deprecation', '0', 'auto');
INSERT INTO `wp_options` VALUES ('518', '_site_transient_update_core', 'O:8:\"stdClass\":4:{s:7:\"updates\";a:1:{i:0;O:8:\"stdClass\":10:{s:8:\"response\";s:6:\"latest\";s:8:\"download\";s:63:\"https://downloads.wordpress.org/release/pt_BR/wordpress-7.0.zip\";s:6:\"locale\";s:5:\"pt_BR\";s:8:\"packages\";O:8:\"stdClass\":5:{s:4:\"full\";s:63:\"https://downloads.wordpress.org/release/pt_BR/wordpress-7.0.zip\";s:10:\"no_content\";s:0:\"\";s:11:\"new_bundled\";s:0:\"\";s:7:\"partial\";s:0:\"\";s:8:\"rollback\";s:0:\"\";}s:7:\"current\";s:3:\"7.0\";s:7:\"version\";s:3:\"7.0\";s:11:\"php_version\";s:3:\"7.4\";s:13:\"mysql_version\";s:5:\"5.5.5\";s:11:\"new_bundled\";s:3:\"6.7\";s:15:\"partial_version\";s:0:\"\";}}s:12:\"last_checked\";i:1783382082;s:15:\"version_checked\";s:3:\"7.0\";s:12:\"translations\";a:0:{}}', 'off');
INSERT INTO `wp_options` VALUES ('520', '_site_transient_update_plugins', 'O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1783391118;s:8:\"response\";a:0:{}s:12:\"translations\";a:0:{}s:9:\"no_update\";a:10:{s:19:\"akismet/akismet.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:21:\"w.org/plugins/akismet\";s:4:\"slug\";s:7:\"akismet\";s:6:\"plugin\";s:19:\"akismet/akismet.php\";s:11:\"new_version\";s:3:\"5.7\";s:3:\"url\";s:38:\"https://wordpress.org/plugins/akismet/\";s:7:\"package\";s:54:\"https://downloads.wordpress.org/plugin/akismet.5.7.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:60:\"https://ps.w.org/akismet/assets/icon-256x256.png?rev=2818463\";s:2:\"1x\";s:60:\"https://ps.w.org/akismet/assets/icon-128x128.png?rev=2818463\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:63:\"https://ps.w.org/akismet/assets/banner-1544x500.png?rev=2900731\";s:2:\"1x\";s:62:\"https://ps.w.org/akismet/assets/banner-772x250.png?rev=2900731\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.8\";}s:35:\"cookie-law-info/cookie-law-info.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:29:\"w.org/plugins/cookie-law-info\";s:4:\"slug\";s:15:\"cookie-law-info\";s:6:\"plugin\";s:35:\"cookie-law-info/cookie-law-info.php\";s:11:\"new_version\";s:5:\"3.5.1\";s:3:\"url\";s:46:\"https://wordpress.org/plugins/cookie-law-info/\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/plugin/cookie-law-info.3.5.1.zip\";s:5:\"icons\";a:2:{s:2:\"1x\";s:60:\"https://ps.w.org/cookie-law-info/assets/icon.svg?rev=3007243\";s:3:\"svg\";s:60:\"https://ps.w.org/cookie-law-info/assets/icon.svg?rev=3007243\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:71:\"https://ps.w.org/cookie-law-info/assets/banner-1544x500.png?rev=3341409\";s:2:\"1x\";s:70:\"https://ps.w.org/cookie-law-info/assets/banner-772x250.png?rev=3341409\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:5:\"5.0.0\";}s:23:\"elementor/elementor.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:23:\"w.org/plugins/elementor\";s:4:\"slug\";s:9:\"elementor\";s:6:\"plugin\";s:23:\"elementor/elementor.php\";s:11:\"new_version\";s:5:\"4.1.4\";s:3:\"url\";s:40:\"https://wordpress.org/plugins/elementor/\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/plugin/elementor.4.1.4.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:62:\"https://ps.w.org/elementor/assets/icon-256x256.gif?rev=3444228\";s:2:\"1x\";s:62:\"https://ps.w.org/elementor/assets/icon-128x128.gif?rev=3444228\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:65:\"https://ps.w.org/elementor/assets/banner-1544x500.png?rev=3443226\";s:2:\"1x\";s:64:\"https://ps.w.org/elementor/assets/banner-772x250.png?rev=3443226\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"6.8\";}s:109:\"events-widgets-for-elementor-and-the-events-calendar/events-widgets-for-elementor-and-the-events-calendar.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:66:\"w.org/plugins/events-widgets-for-elementor-and-the-events-calendar\";s:4:\"slug\";s:52:\"events-widgets-for-elementor-and-the-events-calendar\";s:6:\"plugin\";s:109:\"events-widgets-for-elementor-and-the-events-calendar/events-widgets-for-elementor-and-the-events-calendar.php\";s:11:\"new_version\";s:5:\"1.8.1\";s:3:\"url\";s:83:\"https://wordpress.org/plugins/events-widgets-for-elementor-and-the-events-calendar/\";s:7:\"package\";s:101:\"https://downloads.wordpress.org/plugin/events-widgets-for-elementor-and-the-events-calendar.1.8.1.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:105:\"https://ps.w.org/events-widgets-for-elementor-and-the-events-calendar/assets/icon-256x256.gif?rev=3343973\";s:2:\"1x\";s:105:\"https://ps.w.org/events-widgets-for-elementor-and-the-events-calendar/assets/icon-128x128.gif?rev=3343973\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:108:\"https://ps.w.org/events-widgets-for-elementor-and-the-events-calendar/assets/banner-1544x500.png?rev=3321206\";s:2:\"1x\";s:107:\"https://ps.w.org/events-widgets-for-elementor-and-the-events-calendar/assets/banner-772x250.png?rev=3321206\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.0\";}s:25:\"formidable/formidable.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:24:\"w.org/plugins/formidable\";s:4:\"slug\";s:10:\"formidable\";s:6:\"plugin\";s:25:\"formidable/formidable.php\";s:11:\"new_version\";s:6:\"6.32.1\";s:3:\"url\";s:41:\"https://wordpress.org/plugins/formidable/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/plugin/formidable.6.32.1.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:63:\"https://ps.w.org/formidable/assets/icon-256x256.png?rev=2588749\";s:2:\"1x\";s:63:\"https://ps.w.org/formidable/assets/icon-128x128.png?rev=2588749\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:66:\"https://ps.w.org/formidable/assets/banner-1544x500.png?rev=3128202\";s:2:\"1x\";s:65:\"https://ps.w.org/formidable/assets/banner-772x250.png?rev=3128202\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"6.3\";}s:9:\"hello.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:25:\"w.org/plugins/hello-dolly\";s:4:\"slug\";s:11:\"hello-dolly\";s:6:\"plugin\";s:9:\"hello.php\";s:11:\"new_version\";s:5:\"1.7.2\";s:3:\"url\";s:42:\"https://wordpress.org/plugins/hello-dolly/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/plugin/hello-dolly.1.7.2.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:64:\"https://ps.w.org/hello-dolly/assets/icon-256x256.jpg?rev=2052855\";s:2:\"1x\";s:64:\"https://ps.w.org/hello-dolly/assets/icon-128x128.jpg?rev=2052855\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:67:\"https://ps.w.org/hello-dolly/assets/banner-1544x500.jpg?rev=2645582\";s:2:\"1x\";s:66:\"https://ps.w.org/hello-dolly/assets/banner-772x250.jpg?rev=2052855\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"4.6\";}s:49:\"markdown-comment-block/markdown-comment-block.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:36:\"w.org/plugins/markdown-comment-block\";s:4:\"slug\";s:22:\"markdown-comment-block\";s:6:\"plugin\";s:49:\"markdown-comment-block/markdown-comment-block.php\";s:11:\"new_version\";s:5:\"1.0.0\";s:3:\"url\";s:53:\"https://wordpress.org/plugins/markdown-comment-block/\";s:7:\"package\";s:71:\"https://downloads.wordpress.org/plugin/markdown-comment-block.1.0.0.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:75:\"https://ps.w.org/markdown-comment-block/assets/icon-256x256.png?rev=3117642\";s:2:\"1x\";s:75:\"https://ps.w.org/markdown-comment-block/assets/icon-128x128.png?rev=3117642\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:78:\"https://ps.w.org/markdown-comment-block/assets/banner-1544x500.png?rev=3117642\";s:2:\"1x\";s:77:\"https://ps.w.org/markdown-comment-block/assets/banner-772x250.png?rev=3117642\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.7\";}s:35:\"google-site-kit/google-site-kit.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:29:\"w.org/plugins/google-site-kit\";s:4:\"slug\";s:15:\"google-site-kit\";s:6:\"plugin\";s:35:\"google-site-kit/google-site-kit.php\";s:11:\"new_version\";s:7:\"1.182.0\";s:3:\"url\";s:46:\"https://wordpress.org/plugins/google-site-kit/\";s:7:\"package\";s:66:\"https://downloads.wordpress.org/plugin/google-site-kit.1.182.0.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:68:\"https://ps.w.org/google-site-kit/assets/icon-256x256.png?rev=3141863\";s:2:\"1x\";s:68:\"https://ps.w.org/google-site-kit/assets/icon-128x128.png?rev=3141863\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:71:\"https://ps.w.org/google-site-kit/assets/banner-1544x500.png?rev=3141863\";s:2:\"1x\";s:70:\"https://ps.w.org/google-site-kit/assets/banner-772x250.png?rev=3141863\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.2\";}s:27:\"simple-tags/simple-tags.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:25:\"w.org/plugins/simple-tags\";s:4:\"slug\";s:11:\"simple-tags\";s:6:\"plugin\";s:27:\"simple-tags/simple-tags.php\";s:11:\"new_version\";s:6:\"3.50.0\";s:3:\"url\";s:42:\"https://wordpress.org/plugins/simple-tags/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/plugin/simple-tags.3.50.0.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:64:\"https://ps.w.org/simple-tags/assets/icon-256x256.png?rev=2853049\";s:2:\"1x\";s:64:\"https://ps.w.org/simple-tags/assets/icon-128x128.png?rev=2853049\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:67:\"https://ps.w.org/simple-tags/assets/banner-1544x500.png?rev=2853049\";s:2:\"1x\";s:66:\"https://ps.w.org/simple-tags/assets/banner-772x250.png?rev=2853049\";}s:11:\"banners_rtl\";a:2:{s:2:\"2x\";s:71:\"https://ps.w.org/simple-tags/assets/banner-1544x500-rtl.png?rev=2580554\";s:2:\"1x\";s:70:\"https://ps.w.org/simple-tags/assets/banner-772x250-rtl.png?rev=2580554\";}s:8:\"requires\";s:3:\"5.0\";}s:41:\"wordpress-importer/wordpress-importer.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:32:\"w.org/plugins/wordpress-importer\";s:4:\"slug\";s:18:\"wordpress-importer\";s:6:\"plugin\";s:41:\"wordpress-importer/wordpress-importer.php\";s:11:\"new_version\";s:5:\"0.9.5\";s:3:\"url\";s:49:\"https://wordpress.org/plugins/wordpress-importer/\";s:7:\"package\";s:67:\"https://downloads.wordpress.org/plugin/wordpress-importer.0.9.5.zip\";s:5:\"icons\";a:2:{s:2:\"1x\";s:63:\"https://ps.w.org/wordpress-importer/assets/icon.svg?rev=2791650\";s:3:\"svg\";s:63:\"https://ps.w.org/wordpress-importer/assets/icon.svg?rev=2791650\";}s:7:\"banners\";a:1:{s:2:\"1x\";s:72:\"https://ps.w.org/wordpress-importer/assets/banner-772x250.png?rev=547654\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.2\";}}s:7:\"checked\";a:12:{s:33:\"akeebabackupwp/akeebabackupwp.php\";s:5:\"7.7.6\";s:19:\"akismet/akismet.php\";s:3:\"5.7\";s:35:\"cookie-law-info/cookie-law-info.php\";s:5:\"3.5.1\";s:23:\"elementor/elementor.php\";s:5:\"4.1.4\";s:109:\"events-widgets-for-elementor-and-the-events-calendar/events-widgets-for-elementor-and-the-events-calendar.php\";s:5:\"1.8.1\";s:25:\"formidable/formidable.php\";s:6:\"6.32.1\";s:9:\"hello.php\";s:5:\"1.7.2\";s:47:\"ideiasti-md-publisher/ideiasti-md-publisher.php\";s:5:\"1.0.0\";s:49:\"markdown-comment-block/markdown-comment-block.php\";s:5:\"1.0.0\";s:35:\"google-site-kit/google-site-kit.php\";s:7:\"1.182.0\";s:27:\"simple-tags/simple-tags.php\";s:6:\"3.50.0\";s:41:\"wordpress-importer/wordpress-importer.php\";s:5:\"0.9.5\";}}', 'off');
INSERT INTO `wp_options` VALUES ('530', '_elementor_pro_free_trial_data', 'a:2:{s:7:\"timeout\";i:1783382805;s:5:\"value\";s:575:\"[{\"status\":\"inactive\",\"heading\":\"You\\u2019ve come this far. Why stop here?\",\"subheading\":\"Elementor Pro Free Trial\",\"introduction\":\"Take your site beyond the basics with a free 7-day Elementor Pro trial with no strings attached:\",\"listItems\":[\"100+ widgets\",\"Theme Builder\",\"Advanced design controls\",\"Custom CSS for pixel-perfect sites - and more\"],\"ctaText\":\"Unlock my free trial\",\"ctaUrl\":\"https:\\/\\/go.elementor.com\\/go-pro-free-trial-popup\\/\",\"secondaryAction\":\"Not now\",\"image\":\"https:\\/\\/assets.elementor.com\\/pro-free-trial-popup\\/v1\\/images\\/free_trial_banner.png\"}]\";}', 'off');
INSERT INTO `wp_options` VALUES ('531', 'elementor_atomic_widgets_db_version', '1', 'auto');
INSERT INTO `wp_options` VALUES ('532', 'elementor_global_classes_db_version', '3', 'auto');
INSERT INTO `wp_options` VALUES ('533', '_elementor_installed_time', '1783281483', 'auto');
INSERT INTO `wp_options` VALUES ('534', '_site_transient_timeout_community-events-d41d8cd98f00b204e9800998ecf8427e', '1783434307', 'off');
INSERT INTO `wp_options` VALUES ('535', '_site_transient_community-events-d41d8cd98f00b204e9800998ecf8427e', 'a:4:{s:9:\"sandboxed\";b:0;s:5:\"error\";N;s:8:\"location\";a:1:{s:2:\"ip\";b:0;}s:6:\"events\";a:1:{i:0;a:10:{s:4:\"type\";s:8:\"wordcamp\";s:5:\"title\";s:11:\"WordCamp US\";s:3:\"url\";s:29:\"https://us.wordcamp.org/2026/\";s:6:\"meetup\";s:0:\"\";s:10:\"meetup_url\";s:0:\"\";s:4:\"date\";s:19:\"2026-08-16 09:00:00\";s:8:\"end_date\";s:19:\"2026-08-19 17:00:00\";s:20:\"start_unix_timestamp\";i:1786896000;s:18:\"end_unix_timestamp\";i:1787184000;s:8:\"location\";a:4:{s:8:\"location\";s:16:\"Phoenix, Arizona\";s:7:\"country\";s:2:\"US\";s:8:\"latitude\";d:33.4483771;s:9:\"longitude\";d:-112.0740373;}}}}', 'off');
INSERT INTO `wp_options` VALUES ('538', '_site_transient_timeout_feed_mod_b85365aa61afaf3d4189819a6f57c4c4', '1783425994', 'off');
INSERT INTO `wp_options` VALUES ('539', '_site_transient_feed_mod_b85365aa61afaf3d4189819a6f57c4c4', '1783382794', 'off');
INSERT INTO `wp_options` VALUES ('542', '_site_transient_timeout_feed_mod_d117b5738fbd35bd8c0391cda1f2b5d9', '1783425996', 'off');
INSERT INTO `wp_options` VALUES ('543', '_site_transient_feed_mod_d117b5738fbd35bd8c0391cda1f2b5d9', '1783382796', 'off');
INSERT INTO `wp_options` VALUES ('657', 'elementor_one_welcome_screen_completed', '1', 'auto');
INSERT INTO `wp_options` VALUES ('658', 'e_editor_counter', '1', 'auto');
INSERT INTO `wp_options` VALUES ('659', '_elementor_free_to_pro_upsell', 'a:2:{s:7:\"timeout\";i:1783283924;s:5:\"value\";s:723:\"[{\"id\":\"animated_headline\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/free-to-pro-upsell\\/v1\\/images\\/animated_headline.jpg\"},{\"id\":\"video_playlist\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/free-to-pro-upsell\\/v1\\/images\\/video_playlist.jpg\"},{\"id\":\"cta\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/free-to-pro-upsell\\/v1\\/images\\/cta.jpg\"},{\"id\":\"testimonial_widget\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/free-to-pro-upsell\\/v1\\/images\\/testimonial_widget.jpg\"},{\"id\":\"image_carousel\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/free-to-pro-upsell\\/v1\\/images\\/image_carousel.jpg\"},{\"id\":\"connect-pro-upgrade\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/free-to-pro-upsell\\/v1\\/images\\/connect-pro-upgrade.jpg\"}]\";}', 'off');
INSERT INTO `wp_options` VALUES ('660', '_elementor_notifications_data', 'a:2:{s:7:\"timeout\";i:1783323525;s:5:\"value\";s:12640:\"[{\"id\":\"angie-super-community\",\"title\":\"Angie Community Library\",\"description\":\"Browse a library of snippets and widgets built by other Angie users, import any of them into your site, without consuming any credits or remix them with a prompt to match your brief. Every snippet is vetted by the Elementor team. You can also submit your own work for the community to discover.\",\"topic\":\"Angie\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/angie-community.png\",\"chipTags\":[\"Angie\"],\"link\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-angie-community\\/\",\"readMoreText\":\"Browse library\"},{\"id\":\"4.1-atomic-form\",\"title\":\"Generate Atomic Forms\",\"description\":\"Ask Angie to generate forms for lead generation, contact, bookings, promotions and more. Use the new atomic form elements like date picker, radio button, and file upoad.\",\"topic\":\"Atomic Editor\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/41-atomic-form-angie.png\",\"chipTags\":[\"Angie\"],\"link\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-4.1-blog\\/\",\"readMoreText\":\"Learn More\",\"conditions\":[[{\"type\":\"plugin\",\"plugin\":\"elementor-pro\\/elementor-pro.php\"}]]},{\"id\":\"4.1-atomic-form\",\"title\":\"Generate Atomic Forms\",\"description\":\"Ask Angie to generate forms for lead generation, contact, bookings, promotions and more. Use the new atomic form elements like date picker, radio button, and file upoad.\",\"topic\":\"Atomic Editor\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/41-atomic-form-angie.png\",\"chipPlan\":\"Pro\",\"chipTags\":[\"Angie\"],\"link\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-4.1-blog\\/\",\"readMoreText\":\"Learn more\",\"cta\":\"Upgrade now\",\"ctaLink\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-4.1-atomic-form\\/\"},{\"id\":\"cookie-consent-launch\",\"title\":\"Introducing Cookie Consent\",\"description\":\"Add a cookie consent banner to your site in minutes. Scan for cookies, manage scripts based on visitor consent, and customize the banner to match your site, or design it in the Editor with Elementor Popups. Free to get started, with more features in Elementor One.\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/cookie-launch.png\",\"chipTags\":[\"New feature\"],\"cta\":\"Get Cookie Consent\",\"ctaLink\":\"https:\\/\\/go.elementor.com\\/cookie-consent-in-editor-whats-new\",\"conditions\":[[{\"type\":\"plugin\",\"plugin\":\"cookiez\\/cookiez.php\",\"operator\":\"!=\"}]]},{\"id\":\"angie-super-admin\",\"title\":\"Super Admin Mode\",\"description\":\"Revolutionize your WordPress workflow with Super Admin Mode. Perform root-level WordPress operations through natural language - bulk post and product updates, PHP error diagnosis, and more.\",\"topic\":\"Angie\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/angie-super-admin.png\",\"chipTags\":[\"Angie\"],\"link\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-angie-super-admin\\/\",\"readMoreText\":\"Learn More\"},{\"id\":\"4.0-default\",\"title\":\"The new default\",\"description\":\"New sites now start with version 4.0 and atomic features enabled by default. Existing sites can choose to manually activate. Nothing happens to your existing layouts and sites.\",\"topic\":\"Version 4.0\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/4.0-default.png\",\"chipTags\":[\"Atomic Editor\"],\"link\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-4.0-blog\\/\",\"readMoreText\":\"Learn More\"},{\"id\":\"angie-revisions\",\"title\":\"Restore snippets precisely with Revisions\",\"description\":\"Restore any previous version of your snippets to its exact saved state. Each time you revise, Angie preserves a complete snapshot of the snippet\'s code, structure, and configuration. Open version history, select any saved state, and return to it in one click.\",\"topic\":\"Angie\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/angie-notification-revision.png\",\"chipTags\":[\"Angie\"],\"link\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-angie-revisions\\/\",\"readMoreText\":\"Learn More\"},{\"id\":\"4.0-atomic-forms\",\"title\":\"Atomic Forms\",\"description\":\"Build forms as part of your layout, not separate widgets. Create flexible, multi-column designs, nest elements freely, and maintain full control with the same atomic system and styling logic.\",\"topic\":\"Version 4.0\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/4.0-atomic-form.png\",\"chipPlan\":\"Pro\",\"chipTags\":[\"Atomic Editor\"],\"link\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-4.0-blog\\/\",\"readMoreText\":\"Learn More\",\"conditions\":[[{\"type\":\"plugin\",\"plugin\":\"elementor-pro\\/elementor-pro.php\"}]]},{\"id\":\"4.0-atomic-forms\",\"title\":\"Atomic Forms\",\"description\":\"Build forms as part of your layout, not separate widgets. Create flexible, multi-column designs, nest elements freely, and maintain full control with the same atomic system and styling logic.\",\"topic\":\"Version 4.0\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/3.33-custom-css.png\",\"chipTags\":[\"Atomic Editor\"],\"cta\":\"Upgrade\",\"ctaLink\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-4.0-atomic-forms\\/\"},{\"id\":\"angie-cloud-library\",\"title\":\"Introducing Angie Cloud Library\",\"description\":\"Your Angie snippets are now available across every site you manage. Save any asset you build to your account and pull it into a new project in a few clicks, fully editable and ready to adapt. Available to all users with free daily credits.\",\"topic\":\"Angie\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/angie-cloud-library.png\",\"chipTags\":[\"Angie\"],\"link\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-angie-cloud-library\\/\",\"readMoreText\":\"Learn More\"},{\"id\":\"4.0-interactions\",\"title\":\"Pro Interactions\",\"description\":\"Create advanced, lightweight motion inside the Editor. Define behavior visually, keep everything system-based, and deliver engaging experiences without bloated scripts or external tools.\",\"topic\":\"Version 4.0\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/4.0-interactions.png\",\"chipPlan\":\"Pro\",\"chipTags\":[\"Atomic Editor\"],\"link\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-4.0-blog\\/\",\"readMoreText\":\"Learn More\",\"conditions\":[[{\"type\":\"plugin\",\"plugin\":\"elementor-pro\\/elementor-pro.php\"}]]},{\"id\":\"4.0-interactions\",\"title\":\"Pro Interactions\",\"description\":\"Create advanced, lightweight motion inside the Editor. Define behavior visually, keep everything system-based, and deliver engaging experiences without bloated scripts or external tools.\",\"topic\":\"Version 4.0\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/4.0-interactions.png\",\"chipTags\":[\"Atomic Editor\"],\"cta\":\"Upgrade\",\"ctaLink\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-4.0-interactions\\/\"},{\"id\":\"4.0-sync-design-system\",\"title\":\"Sync and share design systems\",\"description\":\"Export and import Variables and Classes between sites, and sync them with v3 Global Styles. Maintain a consistent design system across projects and across versions.\",\"topic\":\"Version 4.0\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/4.0-sync-design-system.png\",\"chipTags\":[\"Atomic Editor\"],\"link\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-4.0-blog\\/\",\"readMoreText\":\"Learn More\"},{\"id\":\"angie-launch\",\"title\":\"Introducing Angie Code.\",\"description\":\"Create custom Elementor widgets, and snippets for custom site functionality from a simple description. Built natively for WordPress, and Elementor. Preview safely, refine through conversation, and publish when ready.\",\"topic\":\"Angie Code\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/angie-launch.png\",\"chipTags\":[\"New launch\"],\"link\":\"https:\\/\\/go.elementor.com\\/ai-notification-angie-launch\\/\",\"readMoreText\":\"Learn More\"},{\"id\":\"partner-program\",\"title\":\"Partner with Elementor. Grow your business.\",\"description\":\"Join to unlock exclusive access, secure visibility, benefit from marketing opportunities, and create additional revenue from the work you have already done. Join for free and start benefiting!\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/notification-partner.png\",\"chipTags\":[\"Partner Program\"],\"cta\":\"Apply now\",\"ctaLink\":\"https:\\/\\/my.elementor.com\\/agency\\/\"},{\"id\":\"manage-launch\",\"title\":\"Introducing Manage\",\"description\":\"Monitor, optimize and maintain all your sites from one centralized dashboard. Track performance, perform bulk updates and detect security risks to stay ahead of issues.\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/manage.png\",\"chipTags\":[\"New Launch\"],\"cta\":\"Start free\",\"ctaLink\":\"https:\\/\\/go.elementor.com\\/manage\\/whatsnew\"},{\"id\":\"components-3.35\",\"title\":\"Components\",\"description\":\"Build modular, reusable sections that update everywhere and decide how much control to give away to your team or clients.\",\"topic\":\"Version 4.0\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/components-3-35.png\",\"chipTags\":[\"Atomic Editor\"],\"link\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-components-3.35-blog\",\"readMoreText\":\"Learn More\"},{\"id\":\"one-launch\",\"title\":\"Introducing Elementor One\",\"description\":\"The complete website building experience. All the tools to create, optimize, and manage websites, unified under one roof.\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/one-launch.png\",\"chipTags\":[\"New Launch\"],\"cta\":\"Explore Elementor One\",\"ctaLink\":\"https:\\/\\/go.elementor.com\\/launch-whats-new\"},{\"id\":\"atomic-tabs-3.34\",\"title\":\"Atomic Tabs\",\"description\":\"Nest any type of content inside tab triggers or content panels, unlocking a truly atomic way of design.\",\"topic\":\"Version 4.0\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/tabs-3.34.png\",\"chipTags\":[\"Atomic Editor\"],\"link\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-3.34-blog\\/\",\"readMoreText\":\"Learn More\"},{\"id\":\"variables-manager-3.33\",\"title\":\"Variables Manager\",\"description\":\"Centralize and control all your color, typography, and size tokens for consistent, scalable design systems.\",\"topic\":\"Version 4.0\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/3.33-variables-manager.png\",\"chipTags\":[\"Atomic Editor\"],\"link\":\"https:\\/\\/go.elementor.com\\/go-pro-notification-3.33-blog\\/\",\"readMoreText\":\"Learn More\"},{\"id\":\"ally-assistant\",\"title\":\"New! Fix accessibility issues with Ally Assistant\",\"description\":\"Scan any page for accessibility issues and fix them in one click. From color contrast to missing alt text, Ally Assistant provides guided steps or AI-powered fixes to make your site more inclusive.\",\"topic\":\"Ally by Elementor\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/ally-assistant.png\",\"chipTags\":[\"New Feature\"],\"cta\":\"Scan for free\",\"ctaLink\":\"http:\\/\\/go.elementor.com\\/acc-assistant-launch-whats-new\",\"conditions\":[[{\"type\":\"plugin\",\"operator\":\"!=\",\"plugin\":\"pojo-accessibility\\/pojo-accessibility.php\"}]]},{\"id\":\"image-optimizer-3.19\",\"title\":\"Effortlessly optimize images for a stunning, high-speed website with the Image Optimizer plugin.\",\"description\":\"Image Optimizer perfectly balances between image quality and performance to boost your website.  Resize, compress, and convert images to WebP, for faster loading times and and better user experience.\",\"topic\":\"Image Optimizer Plugin by Elementor\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/image-optimizer-3.19.png\",\"chipTags\":[\"New plugin\"],\"cta\":\"Get the Image Optimizer\",\"ctaLink\":\"https:\\/\\/go.elementor.com\\/io-notification-wp-dash-learn-more\\/\",\"conditions\":[[{\"type\":\"plugin\",\"operator\":\"!=\",\"plugin\":\"image-optimization\\/image-optimization.php\"}]]},{\"id\":\"5-star-rating-prompt\",\"title\":\"Love the New Features? Let Us Know with 5 Stars!\",\"description\":\"Help spread the word by telling the world what you love about Elementor.\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/5-star-rating-prompt.png\",\"cta\":\"Leave a Review\",\"ctaLink\":\"https:\\/\\/go.elementor.com\\/wp-dash-notification-five-stars\\/\"},{\"id\":\"site-mailer-introducing\",\"title\":\"Introducing Site Mailer\",\"description\":\"Keep your WordPress emails out of the spam folder with improved deliverability and an easy setup\\u2014no need for an SMTP plugin or complicated configurations.\",\"topic\":\"Site Mailer Plugin by Elementor\",\"imageSrc\":\"https:\\/\\/assets.elementor.com\\/notifications\\/v1\\/images\\/Site-mailer.png\",\"chipTags\":[\"New plugin\"],\"cta\":\"Start Free Trial\",\"ctaLink\":\"https:\\/\\/go.elementor.com\\/sm-wp-dash-whatsnew\\/\",\"conditions\":[[{\"type\":\"plugin\",\"operator\":\"!=\",\"plugin\":\"site-mailer\\/site-mailer.php\"}]]}]\";}', 'off');
INSERT INTO `wp_options` VALUES ('663', '_transient_timeout_elementor_migrations_manifest', '1783334326', 'off');
INSERT INTO `wp_options` VALUES ('664', '_transient_elementor_migrations_manifest', 'a:2:{s:7:\"version\";s:5:\"4.1.4\";s:8:\"manifest\";a:2:{s:10:\"widgetKeys\";a:2:{s:20:\"e-form-submit-button\";a:1:{i:0;a:2:{s:4:\"from\";s:5:\"label\";s:2:\"to\";s:4:\"text\";}}s:15:\"e-form-textarea\";a:1:{i:0;a:2:{s:4:\"from\";s:9:\"maxlength\";s:2:\"to\";s:6:\"length\";}}}s:9:\"propTypes\";a:9:{s:14:\"string-to-html\";a:3:{s:8:\"fromType\";s:6:\"string\";s:6:\"toType\";s:4:\"html\";s:4:\"path\";s:30:\"operations/string-to-html.json\";}s:14:\"number-to-size\";a:3:{s:8:\"fromType\";s:6:\"number\";s:6:\"toType\";s:4:\"size\";s:4:\"path\";s:30:\"operations/number-to-size.json\";}s:22:\"number-to-number-range\";a:3:{s:8:\"fromType\";s:6:\"number\";s:6:\"toType\";s:12:\"number-range\";s:4:\"path\";s:38:\"operations/number-to-number-range.json\";}s:15:\"html-to-html-v2\";a:3:{s:8:\"fromType\";s:4:\"html\";s:6:\"toType\";s:7:\"html-v2\";s:4:\"path\";s:31:\"operations/html-to-html-v2.json\";}s:18:\"html-v2-to-html-v3\";a:3:{s:8:\"fromType\";s:7:\"html-v2\";s:6:\"toType\";s:7:\"html-v3\";s:4:\"path\";s:34:\"operations/html-v2-to-html-v3.json\";}s:20:\"image-src-to-svg-src\";a:3:{s:8:\"fromType\";s:9:\"image-src\";s:6:\"toType\";s:7:\"svg-src\";s:4:\"path\";s:36:\"operations/image-src-to-svg-src.json\";}s:19:\"config-to-config-v2\";a:3:{s:8:\"fromType\";s:6:\"config\";s:6:\"toType\";s:9:\"config-v2\";s:4:\"path\";s:35:\"operations/config-to-config-v2.json\";}s:15:\"email-to-emails\";a:3:{s:8:\"fromType\";s:5:\"email\";s:6:\"toType\";s:6:\"emails\";s:4:\"path\";s:31:\"operations/email-to-emails.json\";}s:21:\"string-to-font-family\";a:3:{s:8:\"fromType\";s:6:\"string\";s:6:\"toType\";s:11:\"font-family\";s:4:\"path\";s:37:\"operations/string-to-font-family.json\";}}}}', 'off');
INSERT INTO `wp_options` VALUES ('665', '_elementor_v4_promotions', 'a:2:{s:7:\"timeout\";i:1783283928;s:5:\"value\";s:3523:\"[{\"customCss\":{\"title\":\"Custom CSS\",\"content\":\"Add custom CSS to refine and enrich the appearance of any element on your site.\",\"ctaUrl\":\"https:\\/\\/go.elementor.com\\/go-pro-style-custom-css\\/\",\"image\":\"https:\\/\\/assets.elementor.com\\/packages\\/v1\\/images\\/custom_css_promotion.png\"},\"displayConditions\":{\"title\":\"Display conditions\",\"content\":\"Control when and where elements are shown across your site.\",\"ctaUrl\":\"https:\\/\\/go.elementor.com\\/go-pro-display-conditions-modal\\/\",\"image\":\"https:\\/\\/assets.elementor.com\\/packages\\/v1\\/images\\/display_conditions_promotion.png\"},\"attributes\":{\"title\":\"Attributes\",\"content\":\"Add custom attributes when you need deeper customization and better accessibility.\",\"ctaUrl\":\"https:\\/\\/go.elementor.com\\/go-pro-attributes-modal\\/\",\"image\":\"https:\\/\\/assets.elementor.com\\/packages\\/v1\\/images\\/attributes_promotion.png\"},\"Portfolio\":{\"title\":\"Portfolio\",\"content\":\"Upgrade to build dynamic portfolio grids featuring interactive category filtering and engaging hover effects designed to captivate your site visitors.\",\"image\":\"https:\\/\\/assets.elementor.com\\/packages\\/v1\\/images\\/Portfolio_promotion.png\"},\"Form\":{\"title\":\"Form\",\"content\":\"Upgrade to build advanced forms featuring custom fields, multi-step layouts, automated email notifications, and direct CRM integrations.\",\"image\":\"https:\\/\\/assets.elementor.com\\/packages\\/v1\\/images\\/Form_promotion.png\"},\"PriceList\":{\"title\":\"Price list\",\"content\":\"Upgrade to present items, descriptions, and pricing within a cohesive structure that aligned perfectly with your site.\",\"image\":\"https:\\/\\/assets.elementor.com\\/packages\\/v1\\/images\\/Price_list_promotion.png\"},\"PriceTable\":{\"title\":\"Price table\",\"content\":\"Upgrade to build pricing matrices featuring highlighted columns, interactive check mark lists, and integrated action buttons.\",\"image\":\"https:\\/\\/assets.elementor.com\\/packages\\/v1\\/images\\/Price_table_promotion.png\"},\"LoopGrid\":{\"title\":\"Loop Grid\",\"content\":\"Upgrade to connect custom layouts directly to your site database, seamlessly rendering dynamic content queries that engage your site visitors.\",\"image\":\"https:\\/\\/assets.elementor.com\\/packages\\/v1\\/images\\/Loop_grid_promotion.png\"},\"CallToAction\":{\"title\":\"Call to Action\",\"content\":\"Upgrade to build Call to Action blocks with image overlays, custom hover animations, and promotional layout control across your site.\",\"image\":\"https:\\/\\/assets.elementor.com\\/packages\\/v1\\/images\\/CTA_promotion.png\"},\"Template\":{\"title\":\"Template\",\"content\":\"Upgrade to embed saved templates that sync automatically across your entire site, preserving layout integrity and accelerating your production speed.\",\"image\":\"https:\\/\\/assets.elementor.com\\/packages\\/v1\\/images\\/Template_promotion.png\"},\"Gallery\":{\"title\":\"Gallery pro\",\"content\":\"Upgrade to build gallery with dynamic categorization and custom layout control across your site.\",\"image\":\"https:\\/\\/assets.elementor.com\\/packages\\/v1\\/images\\/Gallery_pro_promotion.png\"},\"MediaCarousel\":{\"title\":\"Media carousel\",\"content\":\"Upgrade to build advanced Media Carousel with dynamic video elements into your sliders to better engage your site visitors.\",\"image\":\"https:\\/\\/assets.elementor.com\\/packages\\/v1\\/images\\/Media_carousel_promotion.png\"},\"LoopCarousel\":{\"title\":\"Loop carousel\",\"content\":\"Upgrade to build advanced Loop Carousel with dynamic posts, custom layouts seamlessly to better engage your site visitors.\",\"image\":\"https:\\/\\/assets.elementor.com\\/packages\\/v1\\/images\\/Loop_carousel_promotion.png\"}}]\";}', 'off');
INSERT INTO `wp_options` VALUES ('854', 'googlesitekit_db_version', '1.177.0', 'auto');
INSERT INTO `wp_options` VALUES ('860', 'googlesitekit_has_connected_admins', '0', 'auto');
INSERT INTO `wp_options` VALUES ('861', '_transient_timeout_googlesitekit_number_of_administrators', '1783903420', 'off');
INSERT INTO `wp_options` VALUES ('862', '_transient_googlesitekit_number_of_administrators', '1', 'off');
INSERT INTO `wp_options` VALUES ('866', '_transient_googlesitekit_verification_meta_tags', 'a:0:{}', 'on');
INSERT INTO `wp_options` VALUES ('882', '_site_transient_timeout_wp_remote_block_patterns_a96b04b6058ed551f02aca25c3d0159a', '1783311304', 'off');
INSERT INTO `wp_options` VALUES ('883', '_site_transient_wp_remote_block_patterns_a96b04b6058ed551f02aca25c3d0159a', 'a:52:{i:0;O:8:\"stdClass\":7:{s:2:\"id\";i:1211548;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:33:\"Intro area with heading and image\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1727:\"\n<div class=\"wp-block-group alignfull is-content-justification-center is-layout-constrained wp-block-group-is-layout-constrained\" style=\"margin-top:0;margin-bottom:0\">\n<div style=\"height:var(--wp--preset--spacing--20)\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-group alignwide is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-columns alignwide are-vertically-aligned-top is-layout-flex wp-container-core-columns-is-layout-f40d6e23 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-top is-content-justification-left is-layout-constrained wp-container-core-column-is-layout-b7e24cf4 wp-block-column-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">Uncover a realm of opportunities.</h2>\n</div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<p class=\"wp-block-paragraph\">Exploring life&#8217;s complex tapestry, options reveal routes to the exceptional, requiring innovation, inquisitiveness, and bravery for a deeply satisfying voyage.</p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\">Comece agora</a></div>\n</div>\n</div>\n</div>\n\n\n\n<div style=\"height:var(--wp--preset--spacing--20)\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https://pd.w.org/2023/07/44364b18862589f06.53436652.jpg\" alt=\"\" style=\"aspect-ratio:16/9;object-fit:cover\" /></figure>\n</div>\n\n\n\n<div style=\"height:var(--wp--preset--spacing--20)\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:4:\"hero\";s:16:\"wpop_description\";s:93:\"Two columns of text, left with a heading and right with a paragraph, with a wide image below.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:1:{i:0;s:0:\"\";}s:11:\"wpop_locale\";s:5:\"pt_BR\";s:15:\"wpop_wp_version\";s:3:\"6.5\";s:25:\"wpop_contains_block_types\";s:111:\"core/button,core/buttons,core/column,core/columns,core/group,core/heading,core/image,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:5:\"about\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2423:\"<!-- wp:group {\"metadata\":{\"name\":\"Intro\"},\"align\":\"full\",\"style\":{\"spacing\":{\"margin\":{\"top\":\"0\",\"bottom\":\"0\"}}},\"className\":\"alignfull\",\"layout\":{\"type\":\"constrained\",\"justifyContent\":\"center\"}} -->\n<div class=\"wp-block-group alignfull\" style=\"margin-top:0;margin-bottom:0\"><!-- wp:spacer {\"height\":\"var:preset|spacing|20\"} -->\n<div style=\"height:var(--wp--preset--spacing--20)\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:group {\"metadata\":{\"name\":\"Contents\"},\"align\":\"wide\",\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:columns {\"verticalAlignment\":\"top\",\"align\":\"wide\",\"style\":{\"spacing\":{\"blockGap\":{\"top\":\"var:preset|spacing|30\"}}}} -->\n<div class=\"wp-block-columns alignwide are-vertically-aligned-top\"><!-- wp:column {\"verticalAlignment\":\"top\",\"width\":\"\",\"layout\":{\"type\":\"constrained\",\"justifyContent\":\"left\",\"contentSize\":\"450px\"}} -->\n<div class=\"wp-block-column is-vertically-aligned-top\"><!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Uncover a realm of opportunities.</h2>\n<!-- /wp:heading --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"verticalAlignment\":\"top\",\"width\":\"40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column is-vertically-aligned-top\" style=\"flex-basis:40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:paragraph -->\n<p>Exploring life\'s complex tapestry, options reveal routes to the exceptional, requiring innovation, inquisitiveness, and bravery for a deeply satisfying voyage.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:buttons -->\n<div class=\"wp-block-buttons\"><!-- wp:button -->\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\">Comece agora</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\n\n<!-- wp:spacer {\"height\":\"var:preset|spacing|20\"} -->\n<div style=\"height:var(--wp--preset--spacing--20)\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:image {\"aspectRatio\":\"16/9\",\"scale\":\"cover\",\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://pd.w.org/2023/07/44364b18862589f06.53436652.jpg\" alt=\"\" style=\"aspect-ratio:16/9;object-fit:cover\" /></figure>\n<!-- /wp:image --></div>\n<!-- /wp:group -->\n\n<!-- wp:spacer {\"height\":\"var:preset|spacing|20\"} -->\n<div style=\"height:var(--wp--preset--spacing--20)\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:group -->\";}i:1;O:8:\"stdClass\":7:{s:2:\"id\";i:623804;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:72:\"Fullwidth, vertically aligned headline on right with description on left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2291:\"\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;padding-top:5vw;padding-right:5vw;padding-bottom:5vw;padding-left:5vw\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#e68b14\"></span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group is-layout-flex wp-container-core-group-is-layout-bbbc119a wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group wp-container-content-8eb0bdf3 is-layout-flow wp-container-core-group-is-layout-bf4059b8 wp-block-group-is-layout-flow\">\n<p class=\"wp-container-content-aeb25491 wp-block-paragraph\" style=\"font-size:17px;font-style:normal;font-weight:300;letter-spacing:0px;line-height:1.4;text-decoration:none;text-transform:none\">Let &#8216;em Roll is an album by American organist Big John Patton recorded in 1965 and released on the Blue Note label.</p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-font-size\" style=\"font-size:17px;font-style:normal;font-weight:700;letter-spacing:0px;text-decoration:none;text-transform:uppercase\"><a class=\"wp-block-button__link has-white-color has-black-background-color has-text-color has-background wp-element-button\" style=\"border-radius:0px;border-top-style:none;border-top-width:0px;border-right-style:none;border-right-width:0px;border-bottom-style:none;border-bottom-width:0px;border-left-style:none;border-left-width:0px;padding-top:14px;padding-right:36px;padding-bottom:14px;padding-left:36px\">Comprar agora</a></div>\n</div>\n</div>\n\n\n\n<div class=\"wp-block-group wp-container-content-9cfa9a5a is-layout-flow wp-container-core-group-is-layout-a806e4b5 wp-block-group-is-layout-flow\">\n<p class=\"has-text-align-right has-black-color has-text-color wp-block-paragraph\" style=\"font-size:148px;font-style:normal;font-weight:700;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">Let<br>&#8216;EM<br>Roll</p>\n\n\n\n<p class=\"has-text-align-right has-white-color has-text-color wp-block-paragraph\" style=\"font-size:148px;font-style:normal;font-weight:700;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">Big<br>John<br>Patton</p>\n</div>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:60:\"vertically, bold, jazz, shop, store, headline, hero, product\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:0:\"\";}s:11:\"wpop_locale\";s:5:\"pt_BR\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:61:\"core/button,core/buttons,core/cover,core/group,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3731:\"<!-- wp:cover {\"customOverlayColor\":\"#e68b14\",\"isDark\":false,\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"5vw\",\"right\":\"5vw\",\"bottom\":\"5vw\",\"left\":\"5vw\"},\"margin\":{\"top\":\"0\"}}}} -->\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;padding-top:5vw;padding-right:5vw;padding-bottom:5vw;padding-left:5vw\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#e68b14\"></span><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"layout\":{\"type\":\"flex\",\"flexWrap\":\"wrap\",\"verticalAlignment\":\"top\"}} -->\n<div class=\"wp-block-group\"><!-- wp:group {\"style\":{\"layout\":{\"selfStretch\":\"fixed\",\"flexSize\":\"320px\"},\"spacing\":{\"blockGap\":\"24px\"}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"style\":{\"layout\":{\"selfStretch\":\"fixed\",\"flexSize\":\"330px\"},\"typography\":{\"fontSize\":\"17px\",\"fontStyle\":\"normal\",\"fontWeight\":\"300\",\"lineHeight\":\"1.4\",\"textTransform\":\"none\",\"textDecoration\":\"none\",\"letterSpacing\":\"0px\"}}} -->\n<p style=\"font-size:17px;font-style:normal;font-weight:300;letter-spacing:0px;line-height:1.4;text-decoration:none;text-transform:none\">Let \'em Roll is an album by American organist Big John Patton recorded in 1965 and released on the Blue Note label.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:buttons -->\n<div class=\"wp-block-buttons\"><!-- wp:button {\"backgroundColor\":\"black\",\"textColor\":\"white\",\"style\":{\"typography\":{\"fontSize\":\"17px\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"textDecoration\":\"none\",\"textTransform\":\"uppercase\",\"letterSpacing\":\"0px\"},\"spacing\":{\"padding\":{\"top\":\"14px\",\"bottom\":\"14px\",\"left\":\"36px\",\"right\":\"36px\"}},\"border\":{\"radius\":\"0px\",\"top\":{\"radius\":\"0px\",\"width\":\"0px\",\"style\":\"none\"},\"right\":{\"radius\":\"0px\",\"width\":\"0px\",\"style\":\"none\"},\"bottom\":{\"radius\":\"0px\",\"width\":\"0px\",\"style\":\"none\"},\"left\":{\"radius\":\"0px\",\"width\":\"0px\",\"style\":\"none\"}}}} -->\n<div class=\"wp-block-button has-custom-font-size\" style=\"font-size:17px;font-style:normal;font-weight:700;letter-spacing:0px;text-decoration:none;text-transform:uppercase\"><a class=\"wp-block-button__link has-white-color has-black-background-color has-text-color has-background wp-element-button\" style=\"border-radius:0px;border-top-style:none;border-top-width:0px;border-right-style:none;border-right-width:0px;border-bottom-style:none;border-bottom-width:0px;border-left-style:none;border-left-width:0px;padding-top:14px;padding-right:36px;padding-bottom:14px;padding-left:36px\">Comprar agora</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"0px\"},\"layout\":{\"selfStretch\":\"fill\",\"flexSize\":null}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"right\",\"style\":{\"typography\":{\"fontSize\":\"148px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"0.8\",\"letterSpacing\":\"-4px\"}},\"textColor\":\"black\"} -->\n<p class=\"has-text-align-right has-black-color has-text-color\" style=\"font-size:148px;font-style:normal;font-weight:700;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">Let<br>\'EM<br>Roll</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"right\",\"style\":{\"typography\":{\"fontSize\":\"148px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"0.8\",\"letterSpacing\":\"-4px\"}},\"textColor\":\"white\"} -->\n<p class=\"has-text-align-right has-white-color has-text-color\" style=\"font-size:148px;font-style:normal;font-weight:700;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">Big<br>John<br>Patton</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group --></div></div>\n<!-- /wp:cover -->\";}i:2;O:8:\"stdClass\":7:{s:2:\"id\";i:623810;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:42:\"Bold sale banner with geometric background\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1781:\"\n<div class=\"wp-block-cover alignfull wp-duotone-rgb4448102-ffb23d-1\" style=\"margin-top:0;padding-top:4vw;padding-right:4vw;padding-bottom:4vw;padding-left:4vw;min-height:50vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-90 has-background-dim\" style=\"background-color:#2c3066\"></span><img decoding=\"async\" class=\"wp-block-cover__image-background wp-image-334\" alt=\"\" src=\"https://pd.w.org/2022/01/2661f82cd1ba9172.16386413.jpg\" data-object-fit=\"cover\" /><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group is-layout-flow wp-container-core-group-is-layout-a806e4b5 wp-block-group-is-layout-flow\">\n<p class=\"has-text-align-center has-text-color wp-block-paragraph\" style=\"color:#ffb23d;font-size:160px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:0.9;text-transform:uppercase\">Enjoy</p>\n\n\n\n<p class=\"has-text-align-center has-text-color wp-block-paragraph\" style=\"color:#ffb23d;font-size:160px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:0.9;text-transform:uppercase\">20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} Off</p>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-36078703 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-font-size\" style=\"font-size:20px;font-style:normal;font-weight:700;letter-spacing:1px;text-transform:uppercase\"><a class=\"wp-block-button__link has-text-color has-background wp-element-button\" style=\"color:#2c3066;background-color:#ffb23d;padding-top:32px;padding-right:48px;padding-bottom:32px;padding-left:48px\">Comprar agora</a></div>\n</div>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:43:\"store, shop, coupon, jazz, background image\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:0:\"\";}s:11:\"wpop_locale\";s:5:\"pt_BR\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:73:\"core/button,core/buttons,core/cover,core/group,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2824:\"<!-- wp:cover {\"url\":\"https://pd.w.org/2022/01/2661f82cd1ba9172.16386413.jpg\",\"id\":334,\"dimRatio\":90,\"customOverlayColor\":\"#2c3066\",\"minHeight\":50,\"minHeightUnit\":\"vh\",\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"4vw\",\"right\":\"4vw\",\"bottom\":\"4vw\",\"left\":\"4vw\"},\"margin\":{\"top\":\"0\"}},\"color\":{\"duotone\":[\"rgb(44, 48, 102)\",\"#ffb23d\"]}}} -->\n<div class=\"wp-block-cover alignfull\" style=\"margin-top:0;padding-top:4vw;padding-right:4vw;padding-bottom:4vw;padding-left:4vw;min-height:50vh\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-90 has-background-dim\" style=\"background-color:#2c3066\"></span><img class=\"wp-block-cover__image-background wp-image-334\" alt=\"\" src=\"https://pd.w.org/2022/01/2661f82cd1ba9172.16386413.jpg\" data-object-fit=\"cover\" /><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"0px\"}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"center\",\"style\":{\"typography\":{\"fontSize\":\"160px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"0.9\",\"letterSpacing\":\"-2px\"},\"color\":{\"text\":\"#ffb23d\"}}} -->\n<p class=\"has-text-align-center has-text-color\" style=\"color:#ffb23d;font-size:160px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:0.9;text-transform:uppercase\">Enjoy</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"center\",\"style\":{\"typography\":{\"fontSize\":\"160px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"0.9\",\"letterSpacing\":\"-2px\"},\"color\":{\"text\":\"#ffb23d\"}}} -->\n<p class=\"has-text-align-center has-text-color\" style=\"color:#ffb23d;font-size:160px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:0.9;text-transform:uppercase\">20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} Off</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:spacer {\"height\":\"48px\"} -->\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:buttons {\"layout\":{\"type\":\"flex\",\"justifyContent\":\"center\"}} -->\n<div class=\"wp-block-buttons\"><!-- wp:button {\"style\":{\"color\":{\"background\":\"#ffb23d\",\"text\":\"#2c3066\"},\"spacing\":{\"padding\":{\"top\":\"32px\",\"right\":\"48px\",\"bottom\":\"32px\",\"left\":\"48px\"}},\"typography\":{\"fontSize\":\"20px\",\"textTransform\":\"uppercase\",\"letterSpacing\":\"1px\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\"}}} -->\n<div class=\"wp-block-button has-custom-font-size\" style=\"font-size:20px;font-style:normal;font-weight:700;letter-spacing:1px;text-transform:uppercase\"><a class=\"wp-block-button__link has-text-color has-background wp-element-button\" style=\"color:#2c3066;background-color:#ffb23d;padding-top:32px;padding-right:48px;padding-bottom:32px;padding-left:48px\">Comprar agora</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:group --></div></div>\n<!-- /wp:cover -->\";}i:3;O:8:\"stdClass\":7:{s:2:\"id\";i:623818;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:30:\"Fullscreen cover image gallery\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:942:\"\n<div class=\"wp-block-cover alignfull\" style=\"padding-top:4vw;padding-right:4vw;padding-bottom:4vw;padding-left:4vw;min-height:66vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-black-background-color has-background-dim-100 has-background-dim\"></span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-73e98c27 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https://thato.test/?page_id=28\"><img decoding=\"async\" src=\"https://pd.w.org/2022/01/84661f60659149cc8.02053291.jpg\" alt=\"\" /></a></figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://thato.test/?page_id=28\"><img decoding=\"async\" src=\"https://pd.w.org/2022/01/21261f60ba46147b0.97888240.jpg\" alt=\"\" /></a></figure>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:43:\"gallery, images, colunas, background, cover\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:0:\"\";}s:11:\"wpop_locale\";s:5:\"pt_BR\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:32:\"core/cover,core/group,core/image\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:7:\"gallery\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1259:\"<!-- wp:cover {\"overlayColor\":\"black\",\"minHeight\":66,\"minHeightUnit\":\"vh\",\"contentPosition\":\"center center\",\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"4vw\",\"right\":\"4vw\",\"bottom\":\"4vw\",\"left\":\"4vw\"}}}} -->\n<div class=\"wp-block-cover alignfull\" style=\"padding-top:4vw;padding-right:4vw;padding-bottom:4vw;padding-left:4vw;min-height:66vh\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-black-background-color has-background-dim-100 has-background-dim\"></span><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"4vw\"}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\",\"justifyContent\":\"center\"}} -->\n<div class=\"wp-block-group\"><!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"custom\"} -->\n<figure class=\"wp-block-image size-large\"><a href=\"https://thato.test/?page_id=28\"><img src=\"https://pd.w.org/2022/01/84661f60659149cc8.02053291.jpg\" alt=\"\" /></a></figure>\n<!-- /wp:image -->\n\n<!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"custom\"} -->\n<figure class=\"wp-block-image size-large\"><a href=\"https://thato.test/?page_id=28\"><img src=\"https://pd.w.org/2022/01/21261f60ba46147b0.97888240.jpg\" alt=\"\" /></a></figure>\n<!-- /wp:image --></div>\n<!-- /wp:group --></div></div>\n<!-- /wp:cover -->\";}i:4;O:8:\"stdClass\":7:{s:2:\"id\";i:622161;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:47:\"Footer with search, site title, and credit line\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3284:\"\n<div class=\"wp-block-group alignfull has-background is-layout-constrained wp-container-core-group-is-layout-6cf33c04 wp-block-group-is-layout-constrained\" style=\"background-color:#00000008;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--40)\">\n<div class=\"wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-b572c875 wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group wp-container-content-9cfa9a5a is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-b4f291b5 wp-block-group-is-layout-constrained\">\n<p class=\"has-text-align-left wp-block-paragraph\" style=\"font-size:0.9rem;font-style:normal;font-weight:600;letter-spacing:1px;text-transform:uppercase\">busca</p>\n\n\n<form role=\"search\" method=\"get\" action=\"https://wordpress.org/patterns/\" class=\"wp-block-search__button-outside wp-block-search__icon-button wp-block-search\" ><label class=\"wp-block-search__label screen-reader-text\" for=\"wp-block-search__input-2\" >Search</label><div class=\"wp-block-search__inside-wrapper\"  style=\"width: 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><input class=\"wp-block-search__input\" id=\"wp-block-search__input-2\" placeholder=\"\" value=\"\" type=\"search\" name=\"s\" required  style=\"border-width: 1px\"/><button aria-label=\"Search\" class=\"wp-block-search__button has-icon wp-element-button\" type=\"submit\"  style=\"border-width: 1px\"><svg class=\"search-icon\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\">\n					<path d=\"M13 5c-3.3 0-6 2.7-6 6 0 1.4.5 2.7 1.3 3.7l-3.8 3.8 1.1 1.1 3.8-3.8c1 .8 2.3 1.3 3.7 1.3 3.3 0 6-2.7 6-6S16.3 5 13 5zm0 10.5c-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5-2 4.5-4.5 4.5z\"></path>\n				</svg></button></div></form></div>\n\n\n\n<div class=\"wp-block-group is-content-justification-right is-nowrap is-layout-flex wp-container-core-group-is-layout-8f3b73a3 wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-bd946717 wp-block-group-is-layout-flex\">\n<p class=\"has-text-align-left wp-block-paragraph\" style=\"font-size:0.9rem;font-style:normal;font-weight:600;letter-spacing:1px;text-transform:uppercase\">social</p>\n\n\n\n<div class=\"wp-block-group has-small-font-size is-vertical is-content-justification-left is-layout-flex wp-container-core-group-is-layout-53054535 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\"><a href=\"#\">Facebook</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"#\">Instagram</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"#\">Twitter</a></p>\n</div>\n</div>\n</div>\n</div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-eb8a1b9b wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-layout-flex wp-block-group-is-layout-flex\"><h1 class=\"wp-block-site-title has-small-font-size\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1></div>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"> Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:88:\"Footer with search field and site title on the left, and small credit line on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"pt_BR\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:65:\"core/group,core/paragraph,core/search,core/site-title,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:3253:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"right\":\"var:preset|spacing|40\",\"left\":\"var:preset|spacing|40\",\"top\":\"var:preset|spacing|50\",\"bottom\":\"var:preset|spacing|50\"}},\"color\":{\"background\":\"#00000008\"}},\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group alignfull has-background\" style=\"background-color:#00000008;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--40)\"><!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"blockGap\":\"var:preset|spacing|60\"}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"wrap\",\"justifyContent\":\"space-between\",\"verticalAlignment\":\"top\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:group {\"style\":{\"layout\":{\"selfStretch\":\"fill\",\"flexSize\":null}},\"layout\":{\"type\":\"constrained\",\"justifyContent\":\"left\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"left\",\"style\":{\"typography\":{\"textTransform\":\"uppercase\",\"fontSize\":\"0.9rem\",\"letterSpacing\":\"1px\",\"fontStyle\":\"normal\",\"fontWeight\":\"600\"}}} -->\n<p class=\"has-text-align-left\" style=\"font-size:0.9rem;font-style:normal;font-weight:600;letter-spacing:1px;text-transform:uppercase\">busca</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:search {\"label\":\"Search\",\"showLabel\":false,\"width\":100,\"widthUnit\":\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\",\"buttonText\":\"Search\",\"buttonUseIcon\":true,\"style\":{\"border\":{\"width\":\"1px\"}}} /--></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"style\":{\"spacing\":[]},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\",\"justifyContent\":\"right\",\"verticalAlignment\":\"top\"}} -->\n<div class=\"wp-block-group\"><!-- wp:group {\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"left\",\"style\":{\"typography\":{\"textTransform\":\"uppercase\",\"fontSize\":\"0.9rem\",\"letterSpacing\":\"1px\",\"fontStyle\":\"normal\",\"fontWeight\":\"600\"}}} -->\n<p class=\"has-text-align-left\" style=\"font-size:0.9rem;font-style:normal;font-weight:600;letter-spacing:1px;text-transform:uppercase\">social</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"8px\"}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"justifyContent\":\"left\"},\"fontSize\":\"small\"} -->\n<div class=\"wp-block-group has-small-font-size\"><!-- wp:paragraph -->\n<p><a href=\"#\">Facebook</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"#\">Instagram</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"#\">Twitter</a></p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\n\n<!-- wp:spacer {\"height\":\"48px\"} -->\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:group {\"align\":\"wide\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\",\"flexWrap\":\"wrap\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:group {\"layout\":{\"type\":\"flex\"}} -->\n<div class=\"wp-block-group\"><!-- wp:site-title {\"fontSize\":\"small\"} /--></div>\n<!-- /wp:group -->\n\n<!-- wp:paragraph {\"fontSize\":\"small\"} -->\n<p class=\"has-small-font-size\"> Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:5;O:8:\"stdClass\":7:{s:2:\"id\";i:622165;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:19:\"Left-aligned footer\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3031:\"\n<div class=\"wp-block-group alignfull is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-ea752118 wp-block-group-is-layout-flex\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group wp-container-content-9cfa9a5a is-vertical is-layout-flex wp-container-core-group-is-layout-79ad9e6d wp-block-group-is-layout-flex\"><h1 class=\"wp-block-site-title has-medium-font-size\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1>\n\n\n<p class=\"has-text-align-left wp-block-paragraph\">2020 Lomita Blvd,&nbsp;<br>Torrance, CA 90101<br>United States</p>\n\n\n\n<p class=\"has-text-align-left has-small-font-size wp-block-paragraph\">Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n\n\n\n<div class=\"wp-block-group is-content-justification-right is-layout-flex wp-container-core-group-is-layout-735f15fc wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-bd946717 wp-block-group-is-layout-flex\">\n<p class=\"has-text-align-left wp-block-paragraph\">Pages</p>\n\n\n<nav class=\"has-small-font-size items-justified-left is-vertical no-wrap wp-block-navigation is-content-justification-left is-nowrap is-layout-flex wp-container-core-navigation-is-layout-4d6072d6 wp-block-navigation-is-layout-flex\"><ul class=\"wp-block-navigation__container has-small-font-size items-justified-left is-vertical no-wrap wp-block-navigation\"><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Home</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">About</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Contact</span></a></li></ul></nav>\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-bd946717 wp-block-group-is-layout-flex\">\n<p class=\"has-text-align-left wp-block-paragraph\">social</p>\n\n\n\n<div class=\"wp-block-group is-vertical is-content-justification-left is-layout-flex wp-container-core-group-is-layout-53054535 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\"><a href=\"#\">Facebook</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"#\">Instagram</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"#\">Twitter</a></p>\n</div>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:44:\"Left-aligned footer with just a credit line.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"pt_BR\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:69:\"core/group,core/navigation,core/paragraph,core/site-title,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2939:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"margin\":{\"top\":\"0\",\"bottom\":\"0\"},\"padding\":{\"top\":\"var:preset|spacing|50\",\"right\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|50\",\"left\":\"var:preset|spacing|30\"}}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"wrap\",\"justifyContent\":\"space-between\",\"verticalAlignment\":\"top\"}} -->\n<div class=\"wp-block-group alignfull\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:group {\"style\":{\"layout\":{\"selfStretch\":\"fill\",\"flexSize\":null}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"verticalAlignment\":\"top\"}} -->\n<div class=\"wp-block-group\"><!-- wp:site-title {\"fontSize\":\"medium\"} /-->\n\n<!-- wp:paragraph {\"align\":\"left\"} -->\n<p class=\"has-text-align-left\">2020 Lomita Blvd,&nbsp;<br>Torrance, CA 90101<br>United States</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"left\",\"fontSize\":\"small\"} -->\n<p class=\"has-text-align-left has-small-font-size\">Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:spacer {\"height\":\"24px\"} -->\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"var:preset|spacing|50\"}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"wrap\",\"justifyContent\":\"right\",\"verticalAlignment\":\"top\"}} -->\n<div class=\"wp-block-group\"><!-- wp:group {\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"left\"} -->\n<p class=\"has-text-align-left\">Pages</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:navigation {\"overlayMenu\":\"never\",\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"justifyContent\":\"left\",\"flexWrap\":\"nowrap\"},\"style\":{\"spacing\":{\"blockGap\":\"8px\"}},\"fontSize\":\"small\"} /-->\n\n<!-- wp:spacer {\"height\":\"24px\"} -->\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"left\"} -->\n<p class=\"has-text-align-left\">social</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"8px\"}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"justifyContent\":\"left\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph -->\n<p><a href=\"#\">Facebook</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"#\">Instagram</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"#\">Twitter</a></p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group -->\n\n<!-- wp:spacer {\"height\":\"24px\"} -->\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:6;O:8:\"stdClass\":7:{s:2:\"id\";i:623257;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:41:\"Media and text in a full height container\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1484:\"\n<div class=\"wp-block-cover alignfull is-light\" style=\"min-height:100vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#ffffff\"></span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile is-vertically-aligned-center is-image-fill\" style=\"grid-template-columns:56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} auto\"><figure class=\"wp-block-media-text__media\" style=\"background-image:url(https://s.w.org/images/core/5.8/soil.jpg);background-position:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/soil.jpg\" alt=\"Close-up of dried, cracked earth.\" /></figure><div class=\"wp-block-media-text__content\">\n<h2 class=\"wp-block-heading has-text-color\" style=\"color:#000000;font-size:32px\"><strong>What&#8217;s the problem?</strong></h2>\n\n\n\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#000000;font-size:17px\">Trees are more important today than ever before. More than 10,000 products are reportedly made from trees. Through chemistry, the humble woodpile is yielding chemicals, plastics and fabrics that were beyond comprehension when an axe first felled a Texas tree.</p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-fill\"><a class=\"wp-block-button__link wp-element-button\">Saiba mais</a></div>\n</div>\n</div></div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:77:\"Media and text block with image to the left and text and button to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:1:{i:0;s:0:\"\";}s:11:\"wpop_locale\";s:5:\"pt_BR\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:79:\"core/button,core/buttons,core/cover,core/heading,core/media-text,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2015:\"<!-- wp:cover {\"customOverlayColor\":\"#ffffff\",\"minHeight\":100,\"minHeightUnit\":\"vh\",\"contentPosition\":\"center center\",\"isDark\":false,\"align\":\"full\"} -->\n<div class=\"wp-block-cover alignfull is-light\" style=\"min-height:100vh\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#ffffff\"></span><div class=\"wp-block-cover__inner-container\"><!-- wp:media-text {\"mediaLink\":\"https://s.w.org/images/core/5.8/soil.jpg\",\"mediaType\":\"image\",\"mediaWidth\":56,\"verticalAlignment\":\"center\",\"imageFill\":true} -->\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile is-vertically-aligned-center is-image-fill\" style=\"grid-template-columns:56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} auto\"><figure class=\"wp-block-media-text__media\" style=\"background-image:url(https://s.w.org/images/core/5.8/soil.jpg);background-position:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><img src=\"https://s.w.org/images/core/5.8/soil.jpg\" alt=\"Close-up of dried, cracked earth.\" /></figure><div class=\"wp-block-media-text__content\"><!-- wp:heading {\"style\":{\"typography\":{\"fontSize\":\"32px\"},\"color\":{\"text\":\"#000000\"}}} -->\n<h2 class=\"wp-block-heading has-text-color\" style=\"color:#000000;font-size:32px\"><strong>What\'s the problem?</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"style\":{\"typography\":{\"fontSize\":\"17px\"},\"color\":{\"text\":\"#000000\"}}} -->\n<p class=\"has-text-color\" style=\"color:#000000;font-size:17px\">Trees are more important today than ever before. More than 10,000 products are reportedly made from trees. Through chemistry, the humble woodpile is yielding chemicals, plastics and fabrics that were beyond comprehension when an axe first felled a Texas tree.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:buttons -->\n<div class=\"wp-block-buttons\"><!-- wp:button {\"className\":\"is-style-fill\"} -->\n<div class=\"wp-block-button is-style-fill\"><a class=\"wp-block-button__link wp-element-button\">Saiba mais</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div></div>\n<!-- /wp:media-text --></div></div>\n<!-- /wp:cover -->\";}i:7;O:8:\"stdClass\":7:{s:2:\"id\";i:623261;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:10:\"cabeçalho\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:526:\"\n<h2 class=\"alignwide wp-block-heading\" id=\"we-re-a-studio-in-berlin-with-an-international-practice-in-architecture-urban-planning-and-interior-design-we-believe-in-sharing-knowledge-and-promoting-dialogue-to-increase-the-creative-potential-of-collaboration\" style=\"font-size:48px;line-height:1.1\">We&#8217;re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.</h2>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:17:\"large text, title\";s:16:\"wpop_description\";s:12:\"Heading text\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:1:{i:0;s:12:\"core/heading\";}s:11:\"wpop_locale\";s:5:\"pt_BR\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:12:\"core/heading\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:621:\"<!-- wp:heading {\"align\":\"wide\",\"style\":{\"typography\":{\"fontSize\":\"48px\",\"lineHeight\":\"1.1\"}}} -->\n<h2 class=\"alignwide\" id=\"we-re-a-studio-in-berlin-with-an-international-practice-in-architecture-urban-planning-and-interior-design-we-believe-in-sharing-knowledge-and-promoting-dialogue-to-increase-the-creative-potential-of-collaboration\" style=\"font-size:48px;line-height:1.1\">We\'re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.</h2>\n<!-- /wp:heading -->\";}i:8;O:8:\"stdClass\":7:{s:2:\"id\";i:514958;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:33:\"Intro area with heading and image\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1726:\"\n<div class=\"wp-block-group alignfull is-content-justification-center is-layout-constrained wp-block-group-is-layout-constrained\" style=\"margin-top:0;margin-bottom:0\">\n<div style=\"height:var(--wp--preset--spacing--20)\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-group alignwide is-layout-flow wp-block-group-is-layout-flow\">\n<div class=\"wp-block-columns alignwide are-vertically-aligned-top is-layout-flex wp-container-core-columns-is-layout-f40d6e23 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-top is-content-justification-left is-layout-constrained wp-container-core-column-is-layout-b7e24cf4 wp-block-column-is-layout-constrained\">\n<h2 class=\"wp-block-heading\">Uncover a realm of opportunities.</h2>\n</div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<p class=\"wp-block-paragraph\">Exploring life&#8217;s complex tapestry, options reveal routes to the exceptional, requiring innovation, inquisitiveness, and bravery for a deeply satisfying voyage.</p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\">Get Started</a></div>\n</div>\n</div>\n</div>\n\n\n\n<div style=\"height:var(--wp--preset--spacing--20)\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https://pd.w.org/2023/07/44364b18862589f06.53436652.jpg\" alt=\"\" style=\"aspect-ratio:16/9;object-fit:cover\" /></figure>\n</div>\n\n\n\n<div style=\"height:var(--wp--preset--spacing--20)\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:4:\"hero\";s:16:\"wpop_description\";s:93:\"Two columns of text, left with a heading and right with a paragraph, with a wide image below.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.5\";s:25:\"wpop_contains_block_types\";s:111:\"core/button,core/buttons,core/column,core/columns,core/group,core/heading,core/image,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:5:\"about\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2422:\"<!-- wp:group {\"metadata\":{\"name\":\"Intro\"},\"align\":\"full\",\"style\":{\"spacing\":{\"margin\":{\"top\":\"0\",\"bottom\":\"0\"}}},\"className\":\"alignfull\",\"layout\":{\"type\":\"constrained\",\"justifyContent\":\"center\"}} -->\n<div class=\"wp-block-group alignfull\" style=\"margin-top:0;margin-bottom:0\"><!-- wp:spacer {\"height\":\"var:preset|spacing|20\"} -->\n<div style=\"height:var(--wp--preset--spacing--20)\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:group {\"metadata\":{\"name\":\"Contents\"},\"align\":\"wide\",\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:columns {\"verticalAlignment\":\"top\",\"align\":\"wide\",\"style\":{\"spacing\":{\"blockGap\":{\"top\":\"var:preset|spacing|30\"}}}} -->\n<div class=\"wp-block-columns alignwide are-vertically-aligned-top\"><!-- wp:column {\"verticalAlignment\":\"top\",\"width\":\"\",\"layout\":{\"type\":\"constrained\",\"justifyContent\":\"left\",\"contentSize\":\"450px\"}} -->\n<div class=\"wp-block-column is-vertically-aligned-top\"><!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Uncover a realm of opportunities.</h2>\n<!-- /wp:heading --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"verticalAlignment\":\"top\",\"width\":\"40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column is-vertically-aligned-top\" style=\"flex-basis:40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:paragraph -->\n<p>Exploring life\'s complex tapestry, options reveal routes to the exceptional, requiring innovation, inquisitiveness, and bravery for a deeply satisfying voyage.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:buttons -->\n<div class=\"wp-block-buttons\"><!-- wp:button -->\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\">Get Started</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\n\n<!-- wp:spacer {\"height\":\"var:preset|spacing|20\"} -->\n<div style=\"height:var(--wp--preset--spacing--20)\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:image {\"aspectRatio\":\"16/9\",\"scale\":\"cover\",\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://pd.w.org/2023/07/44364b18862589f06.53436652.jpg\" alt=\"\" style=\"aspect-ratio:16/9;object-fit:cover\" /></figure>\n<!-- /wp:image --></div>\n<!-- /wp:group -->\n\n<!-- wp:spacer {\"height\":\"var:preset|spacing|20\"} -->\n<div style=\"height:var(--wp--preset--spacing--20)\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:group -->\";}i:9;O:8:\"stdClass\":7:{s:2:\"id\";i:309935;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:45:\"Centered image with two-tone background color\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1330:\"\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;padding-top:5vw;padding-right:5vw;padding-bottom:5vw;padding-left:5vw;min-height:66vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim has-background-gradient\" style=\"background:linear-gradient(90deg,rgb(35,74,20) 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442},rgb(225,137,116) 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\"></span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group wp-container-content-9cfa9a5a is-layout-constrained wp-container-core-group-is-layout-50c52e0b wp-block-group-is-layout-constrained\">\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default wp-duotone-000000-ffffff-3\"><img decoding=\"async\" src=\"https://pd.w.org/2022/03/3866241b433db4ee2.96648572.jpeg\" alt=\"\" /></figure>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<h2 class=\"wp-block-heading alignwide has-text-align-center has-white-color has-text-color\" style=\"padding-left:32px;font-size:50px;font-style:normal;font-weight:400;letter-spacing:32px;line-height:1;text-transform:uppercase\">Etcetera</h2>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:18:\"Gradient, Two-Tone\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:57:\"core/cover,core/group,core/heading,core/image,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:3:{i:0;s:6:\"banner\";i:1;s:6:\"images\";i:2;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2134:\"<!-- wp:cover {\"minHeight\":66,\"minHeightUnit\":\"vh\",\"customGradient\":\"linear-gradient(90deg,rgb(35,74,20) 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442},rgb(225,137,116) 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\",\"isDark\":false,\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"5vw\",\"right\":\"5vw\",\"bottom\":\"5vw\",\"left\":\"5vw\"},\"margin\":{\"top\":\"0\"}}}} -->\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;padding-top:5vw;padding-right:5vw;padding-bottom:5vw;padding-left:5vw;min-height:66vh\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim has-background-gradient\" style=\"background:linear-gradient(90deg,rgb(35,74,20) 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442},rgb(225,137,116) 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\"></span><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"0px\"},\"layout\":{\"selfStretch\":\"fill\",\"flexSize\":null}},\"layout\":{\"type\":\"constrained\",\"contentSize\":\"600px\",\"wideSize\":\"1200px\"}} -->\n<div class=\"wp-block-group\"><!-- wp:spacer -->\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:image {\"sizeSlug\":\"large\",\"style\":{\"color\":{\"duotone\":[\"#000000\",\"#ffffff\"]}},\"className\":\"is-style-default\"} -->\n<figure class=\"wp-block-image size-large is-style-default\"><img src=\"https://pd.w.org/2022/03/3866241b433db4ee2.96648572.jpeg\" alt=\"\" /></figure>\n<!-- /wp:image -->\n\n<!-- wp:spacer {\"height\":\"48px\"} -->\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:heading {\"textAlign\":\"center\",\"align\":\"wide\",\"style\":{\"typography\":{\"fontSize\":\"50px\",\"fontStyle\":\"normal\",\"fontWeight\":\"400\",\"textTransform\":\"uppercase\",\"letterSpacing\":\"32px\",\"lineHeight\":\"1\"},\"spacing\":{\"padding\":{\"left\":\"32px\"}}},\"textColor\":\"white\"} -->\n<h2 class=\"wp-block-heading alignwide has-text-align-center has-white-color has-text-color\" style=\"padding-left:32px;font-size:50px;font-style:normal;font-weight:400;letter-spacing:32px;line-height:1;text-transform:uppercase\">Etcetera</h2>\n<!-- /wp:heading -->\n\n<!-- wp:spacer -->\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:group --></div></div>\n<!-- /wp:cover -->\";}i:10;O:8:\"stdClass\":7:{s:2:\"id\";i:309925;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:43:\"Fullwidth Dark Banner with Heading Top Left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1103:\"\n<div class=\"wp-block-cover alignfull has-custom-content-position is-position-top-left\" style=\"margin-top:0;padding-top:5vw;padding-right:5vw;padding-bottom:5vw;padding-left:5vw;min-height:50vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-90 has-background-dim\" style=\"background-color:#141414\"></span><img decoding=\"async\" class=\"wp-block-cover__image-background wp-image-333\" alt=\"\" src=\"https://pd.w.org/2022/07/87262c92d42acd1c3.73206444.jpg\" style=\"object-position:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 0{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" data-object-fit=\"cover\" data-object-position=\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 0{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" /><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group wp-container-content-9cfa9a5a is-vertical is-nowrap is-layout-flex wp-container-core-group-is-layout-9dc1a525 wp-block-group-is-layout-flex\">\n<p class=\"has-text-align-left has-text-color has-source-serif-pro-font-family wp-block-paragraph\" style=\"color:#d8a557;font-size:160px;font-style:italic;font-weight:900;letter-spacing:-4px;line-height:0.8;text-transform:none\">bud!</p>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:16:\"Jazz, Fulllwidth\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:36:\"core/cover,core/group,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1697:\"<!-- wp:cover {\"url\":\"https://pd.w.org/2022/07/87262c92d42acd1c3.73206444.jpg\",\"id\":333,\"dimRatio\":90,\"customOverlayColor\":\"#141414\",\"focalPoint\":{\"x\":0.5,\"y\":0},\"minHeight\":50,\"minHeightUnit\":\"vh\",\"contentPosition\":\"top left\",\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"5vw\",\"right\":\"5vw\",\"bottom\":\"5vw\",\"left\":\"5vw\"},\"margin\":{\"top\":\"0\"}}}} -->\n<div class=\"wp-block-cover alignfull has-custom-content-position is-position-top-left\" style=\"margin-top:0;padding-top:5vw;padding-right:5vw;padding-bottom:5vw;padding-left:5vw;min-height:50vh\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-90 has-background-dim\" style=\"background-color:#141414\"></span><img class=\"wp-block-cover__image-background wp-image-333\" alt=\"\" src=\"https://pd.w.org/2022/07/87262c92d42acd1c3.73206444.jpg\" style=\"object-position:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 0{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" data-object-fit=\"cover\" data-object-position=\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 0{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" /><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"0px\"},\"layout\":{\"selfStretch\":\"fill\",\"flexSize\":null}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"flexWrap\":\"nowrap\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"left\",\"style\":{\"typography\":{\"fontSize\":\"160px\",\"fontStyle\":\"italic\",\"fontWeight\":\"900\",\"lineHeight\":\"0.8\",\"letterSpacing\":\"-4px\",\"textTransform\":\"none\"},\"color\":{\"text\":\"#d8a557\"}},\"fontFamily\":\"source-serif-pro\"} -->\n<p class=\"has-text-align-left has-text-color has-source-serif-pro-font-family\" style=\"color:#d8a557;font-size:160px;font-style:italic;font-weight:900;letter-spacing:-4px;line-height:0.8;text-transform:none\">bud!</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div></div>\n<!-- /wp:cover -->\";}i:11;O:8:\"stdClass\":7:{s:2:\"id\";i:309230;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:44:\"Fullwidth cover with repeating gradient text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1826:\"\n<div class=\"wp-block-cover alignfull is-light wp-duotone-36345d-abaaaa-4\" style=\"margin-top:0;padding-top:5vw;padding-right:5vw;padding-bottom:5vw;padding-left:5vw\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-60 has-background-dim\" style=\"background-color:#c2b7a4\"></span><img decoding=\"async\" class=\"wp-block-cover__image-background wp-image-334\" alt=\"\" src=\"https://pd.w.org/2022/01/95161f850d22f0c06.37817431.jpg\" style=\"object-position:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 5{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" data-object-fit=\"cover\" data-object-position=\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 5{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" /><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-group is-vertical is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-e59d9123 wp-block-group-is-layout-flex\">\n<p class=\"has-text-align-right has-text-color wp-block-paragraph\" style=\"color:#c8c4d3;font-size:148px;font-style:normal;font-weight:300;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">DJANGO</p>\n\n\n\n<p class=\"has-text-align-right has-text-color wp-block-paragraph\" style=\"color:#ac94b2;font-size:148px;font-style:normal;font-weight:300;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">DJANGO</p>\n\n\n\n<p class=\"has-text-align-right has-text-color wp-block-paragraph\" style=\"color:#71689c;font-size:148px;font-style:normal;font-weight:300;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">DJANGO</p>\n\n\n\n<p class=\"has-text-align-right has-text-color wp-block-paragraph\" style=\"color:#444178;font-size:148px;font-style:normal;font-weight:300;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">DJANGO</p>\n</div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:48:\"Fullwidth, Background Image, Gradient, Uppercase\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:48:\"core/cover,core/group,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3135:\"<!-- wp:cover {\"url\":\"https://pd.w.org/2022/01/95161f850d22f0c06.37817431.jpg\",\"id\":334,\"dimRatio\":60,\"customOverlayColor\":\"#c2b7a4\",\"focalPoint\":{\"x\":0.5,\"y\":0.05},\"isDark\":false,\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"5vw\",\"right\":\"5vw\",\"bottom\":\"5vw\",\"left\":\"5vw\"},\"margin\":{\"top\":\"0\"}},\"color\":{\"duotone\":[\"#36345d\",\"#abaaaa\"]}}} -->\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;padding-top:5vw;padding-right:5vw;padding-bottom:5vw;padding-left:5vw\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-60 has-background-dim\" style=\"background-color:#c2b7a4\"></span><img class=\"wp-block-cover__image-background wp-image-334\" alt=\"\" src=\"https://pd.w.org/2022/01/95161f850d22f0c06.37817431.jpg\" style=\"object-position:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 5{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" data-object-fit=\"cover\" data-object-position=\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 5{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" /><div class=\"wp-block-cover__inner-container\"><!-- wp:spacer {\"height\":\"48px\"} -->\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"0\"}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"flexWrap\":\"nowrap\",\"justifyContent\":\"center\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"right\",\"style\":{\"typography\":{\"fontSize\":\"148px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"300\",\"lineHeight\":\"0.8\",\"letterSpacing\":\"-4px\"},\"color\":{\"text\":\"#c8c4d3\"}}} -->\n<p class=\"has-text-align-right has-text-color\" style=\"color:#c8c4d3;font-size:148px;font-style:normal;font-weight:300;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">DJANGO</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"right\",\"style\":{\"typography\":{\"fontSize\":\"148px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"300\",\"lineHeight\":\"0.8\",\"letterSpacing\":\"-4px\"},\"color\":{\"text\":\"#ac94b2\"}}} -->\n<p class=\"has-text-align-right has-text-color\" style=\"color:#ac94b2;font-size:148px;font-style:normal;font-weight:300;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">DJANGO</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"right\",\"style\":{\"typography\":{\"fontSize\":\"148px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"300\",\"lineHeight\":\"0.8\",\"letterSpacing\":\"-4px\"},\"color\":{\"text\":\"#71689c\"}}} -->\n<p class=\"has-text-align-right has-text-color\" style=\"color:#71689c;font-size:148px;font-style:normal;font-weight:300;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">DJANGO</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"right\",\"style\":{\"typography\":{\"fontSize\":\"148px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"300\",\"lineHeight\":\"0.8\",\"letterSpacing\":\"-4px\"},\"color\":{\"text\":\"#444178\"}}} -->\n<p class=\"has-text-align-right has-text-color\" style=\"color:#444178;font-size:148px;font-style:normal;font-weight:300;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">DJANGO</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group -->\n\n<!-- wp:spacer {\"height\":\"48px\"} -->\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div></div>\n<!-- /wp:cover -->\";}i:12;O:8:\"stdClass\":7:{s:2:\"id\";i:309224;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:72:\"Fullwidth, vertically aligned headline on right with description on left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2286:\"\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;padding-top:5vw;padding-right:5vw;padding-bottom:5vw;padding-left:5vw\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#e68b14\"></span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group is-layout-flex wp-container-core-group-is-layout-bbbc119a wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group wp-container-content-8eb0bdf3 is-layout-flow wp-container-core-group-is-layout-bf4059b8 wp-block-group-is-layout-flow\">\n<p class=\"wp-container-content-aeb25491 wp-block-paragraph\" style=\"font-size:17px;font-style:normal;font-weight:300;letter-spacing:0px;line-height:1.4;text-decoration:none;text-transform:none\">Let &#8216;em Roll is an album by American organist Big John Patton recorded in 1965 and released on the Blue Note label.</p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-font-size\" style=\"font-size:17px;font-style:normal;font-weight:700;letter-spacing:0px;text-decoration:none;text-transform:uppercase\"><a class=\"wp-block-button__link has-white-color has-black-background-color has-text-color has-background wp-element-button\" style=\"border-radius:0px;border-top-style:none;border-top-width:0px;border-right-style:none;border-right-width:0px;border-bottom-style:none;border-bottom-width:0px;border-left-style:none;border-left-width:0px;padding-top:14px;padding-right:36px;padding-bottom:14px;padding-left:36px\">Shop Now</a></div>\n</div>\n</div>\n\n\n\n<div class=\"wp-block-group wp-container-content-9cfa9a5a is-layout-flow wp-container-core-group-is-layout-a806e4b5 wp-block-group-is-layout-flow\">\n<p class=\"has-text-align-right has-black-color has-text-color wp-block-paragraph\" style=\"font-size:148px;font-style:normal;font-weight:700;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">Let<br>&#8216;EM<br>Roll</p>\n\n\n\n<p class=\"has-text-align-right has-white-color has-text-color wp-block-paragraph\" style=\"font-size:148px;font-style:normal;font-weight:700;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">Big<br>John<br>Patton</p>\n</div>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:60:\"vertically, bold, jazz, shop, store, headline, hero, product\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:61:\"core/button,core/buttons,core/cover,core/group,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3726:\"<!-- wp:cover {\"customOverlayColor\":\"#e68b14\",\"isDark\":false,\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"5vw\",\"right\":\"5vw\",\"bottom\":\"5vw\",\"left\":\"5vw\"},\"margin\":{\"top\":\"0\"}}}} -->\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;padding-top:5vw;padding-right:5vw;padding-bottom:5vw;padding-left:5vw\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#e68b14\"></span><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"layout\":{\"type\":\"flex\",\"flexWrap\":\"wrap\",\"verticalAlignment\":\"top\"}} -->\n<div class=\"wp-block-group\"><!-- wp:group {\"style\":{\"layout\":{\"selfStretch\":\"fixed\",\"flexSize\":\"320px\"},\"spacing\":{\"blockGap\":\"24px\"}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"style\":{\"layout\":{\"selfStretch\":\"fixed\",\"flexSize\":\"330px\"},\"typography\":{\"fontSize\":\"17px\",\"fontStyle\":\"normal\",\"fontWeight\":\"300\",\"lineHeight\":\"1.4\",\"textTransform\":\"none\",\"textDecoration\":\"none\",\"letterSpacing\":\"0px\"}}} -->\n<p style=\"font-size:17px;font-style:normal;font-weight:300;letter-spacing:0px;line-height:1.4;text-decoration:none;text-transform:none\">Let \'em Roll is an album by American organist Big John Patton recorded in 1965 and released on the Blue Note label.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:buttons -->\n<div class=\"wp-block-buttons\"><!-- wp:button {\"backgroundColor\":\"black\",\"textColor\":\"white\",\"style\":{\"typography\":{\"fontSize\":\"17px\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"textDecoration\":\"none\",\"textTransform\":\"uppercase\",\"letterSpacing\":\"0px\"},\"spacing\":{\"padding\":{\"top\":\"14px\",\"bottom\":\"14px\",\"left\":\"36px\",\"right\":\"36px\"}},\"border\":{\"radius\":\"0px\",\"top\":{\"radius\":\"0px\",\"width\":\"0px\",\"style\":\"none\"},\"right\":{\"radius\":\"0px\",\"width\":\"0px\",\"style\":\"none\"},\"bottom\":{\"radius\":\"0px\",\"width\":\"0px\",\"style\":\"none\"},\"left\":{\"radius\":\"0px\",\"width\":\"0px\",\"style\":\"none\"}}}} -->\n<div class=\"wp-block-button has-custom-font-size\" style=\"font-size:17px;font-style:normal;font-weight:700;letter-spacing:0px;text-decoration:none;text-transform:uppercase\"><a class=\"wp-block-button__link has-white-color has-black-background-color has-text-color has-background wp-element-button\" style=\"border-radius:0px;border-top-style:none;border-top-width:0px;border-right-style:none;border-right-width:0px;border-bottom-style:none;border-bottom-width:0px;border-left-style:none;border-left-width:0px;padding-top:14px;padding-right:36px;padding-bottom:14px;padding-left:36px\">Shop Now</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"0px\"},\"layout\":{\"selfStretch\":\"fill\",\"flexSize\":null}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"right\",\"style\":{\"typography\":{\"fontSize\":\"148px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"0.8\",\"letterSpacing\":\"-4px\"}},\"textColor\":\"black\"} -->\n<p class=\"has-text-align-right has-black-color has-text-color\" style=\"font-size:148px;font-style:normal;font-weight:700;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">Let<br>\'EM<br>Roll</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"right\",\"style\":{\"typography\":{\"fontSize\":\"148px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"0.8\",\"letterSpacing\":\"-4px\"}},\"textColor\":\"white\"} -->\n<p class=\"has-text-align-right has-white-color has-text-color\" style=\"font-size:148px;font-style:normal;font-weight:700;letter-spacing:-4px;line-height:0.8;text-transform:uppercase\">Big<br>John<br>Patton</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group --></div></div>\n<!-- /wp:cover -->\";}i:13;O:8:\"stdClass\":7:{s:2:\"id\";i:309236;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:60:\"Fullwidth headline with links and gradient offset background\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2034:\"\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;padding-top:48px;padding-right:5vw;padding-bottom:48px;padding-left:5vw\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim has-background-gradient\" style=\"background:linear-gradient(180deg,rgb(0,0,0) 39{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442},rgb(83,80,123) 39{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\"></span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-group is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-385e35e4 wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group wp-container-content-9cfa9a5a is-layout-flow wp-container-core-group-is-layout-a806e4b5 wp-block-group-is-layout-flow\">\n<p class=\"has-text-align-left has-white-color has-text-color has-link-color wp-elements-1 wp-block-paragraph\" style=\"font-size:172px;font-style:normal;font-weight:700;letter-spacing:-10px;line-height:0.7;text-transform:uppercase\"><strong>MONK</strong>.</p>\n</div>\n\n\n\n<div class=\"wp-block-group wp-container-content-9dbf05af is-layout-flow wp-container-core-group-is-layout-bf4059b8 wp-block-group-is-layout-flow\">\n<div class=\"wp-block-group is-content-justification-right is-nowrap is-layout-flex wp-container-core-group-is-layout-9d49bf4d wp-block-group-is-layout-flex\">\n<p class=\"has-white-color has-text-color has-link-color wp-elements-2 wp-block-paragraph\" style=\"font-size:17px;font-style:normal;font-weight:700;letter-spacing:0px;text-decoration:none;text-transform:uppercase\">A new collection</p>\n\n\n\n<p class=\"has-white-color has-text-color has-link-color wp-elements-3 wp-block-paragraph\" style=\"font-size:17px;font-style:normal;font-weight:700;letter-spacing:0px;text-decoration:none;text-transform:uppercase\">Learn More <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">→</span> </p>\n</div>\n</div>\n</div>\n\n\n\n<div style=\"height:260px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:41:\"Offset, Gradient, Jazz, Headline, Feature\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:48:\"core/cover,core/group,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3195:\"<!-- wp:cover {\"customGradient\":\"linear-gradient(180deg,rgb(0,0,0) 39{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442},rgb(83,80,123) 39{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\",\"isDark\":false,\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"48px\",\"right\":\"5vw\",\"bottom\":\"48px\",\"left\":\"5vw\"},\"margin\":{\"top\":\"0\"}}}} -->\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;padding-top:48px;padding-right:5vw;padding-bottom:48px;padding-left:5vw\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim has-background-gradient\" style=\"background:linear-gradient(180deg,rgb(0,0,0) 39{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442},rgb(83,80,123) 39{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\"></span><div class=\"wp-block-cover__inner-container\"><!-- wp:spacer -->\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"48px\"}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"wrap\",\"verticalAlignment\":\"top\",\"justifyContent\":\"space-between\"}} -->\n<div class=\"wp-block-group\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"0px\"},\"layout\":{\"selfStretch\":\"fill\",\"flexSize\":null}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"left\",\"style\":{\"typography\":{\"fontSize\":\"172px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"0.7\",\"letterSpacing\":\"-10px\"},\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|white\"}}}},\"textColor\":\"white\"} -->\n<p class=\"has-text-align-left has-white-color has-text-color has-link-color\" style=\"font-size:172px;font-style:normal;font-weight:700;letter-spacing:-10px;line-height:0.7;text-transform:uppercase\"><strong>MONK</strong>.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"style\":{\"layout\":{\"selfStretch\":\"fixed\",\"flexSize\":\"400px\"},\"spacing\":{\"blockGap\":\"24px\"}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"48px\"}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\",\"justifyContent\":\"right\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"style\":{\"typography\":{\"fontSize\":\"17px\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"textDecoration\":\"none\",\"textTransform\":\"uppercase\",\"letterSpacing\":\"0px\"},\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|white\"}}}},\"textColor\":\"white\"} -->\n<p class=\"has-white-color has-text-color has-link-color\" style=\"font-size:17px;font-style:normal;font-weight:700;letter-spacing:0px;text-decoration:none;text-transform:uppercase\">A new collection</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"style\":{\"typography\":{\"fontSize\":\"17px\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"textDecoration\":\"none\",\"textTransform\":\"uppercase\",\"letterSpacing\":\"0px\"},\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|white\"}}}},\"textColor\":\"white\"} -->\n<p class=\"has-white-color has-text-color has-link-color\" style=\"font-size:17px;font-style:normal;font-weight:700;letter-spacing:0px;text-decoration:none;text-transform:uppercase\">Learn More → </p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\n\n<!-- wp:spacer {\"height\":\"260px\"} -->\n<div style=\"height:260px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div></div>\n<!-- /wp:cover -->\";}i:14;O:8:\"stdClass\":7:{s:2:\"id\";i:308937;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:42:\"Heading, Paragraph, Button with Two Images\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2701:\"\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;padding-top:6vw;padding-right:6vw;padding-bottom:6vw;padding-left:6vw\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#eb4c77\"></span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group is-content-justification-center is-layout-flex wp-container-core-group-is-layout-7171c4da wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group alignwide wp-container-content-ceb7f5b3 is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-5bff1107 wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading alignwide has-text-align-left has-contrast-color has-text-color\" style=\"font-size:100px;font-style:normal;font-weight:500;line-height:0.9;text-transform:none\">Time for an adventure</h2>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<p class=\"has-text-align-left has-contrast-color has-text-color wp-block-paragraph\">Explore our network of trails that lead through a variety of woodland habitats and observe the diverse flora that call this area home. </p>\n\n\n\n<div style=\"height:60px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-left is-nowrap is-layout-flex wp-container-core-buttons-is-layout-950bf021 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-font-size is-style-fill\" style=\"font-size:16px;font-style:normal;font-weight:500;letter-spacing:0px;text-transform:uppercase\"><a class=\"wp-block-button__link has-base-color has-contrast-background-color has-text-color has-background wp-element-button\" style=\"border-radius:0px;padding-top:24px;padding-right:48px;padding-bottom:24px;padding-left:48px\">Sign up</a></div>\n</div>\n</div>\n\n\n\n<div class=\"wp-block-group is-content-justification-right is-nowrap is-layout-flex wp-container-core-group-is-layout-eeafa4e7 wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group wp-container-content-0733e5d0 is-layout-flow wp-block-group-is-layout-flow\">\n<div style=\"height:8vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<figure class=\"wp-block-image size-large wp-container-content-0733e5d0 wp-duotone-rgb000-rgb21788120-5\"><img decoding=\"async\" src=\"https://pd.w.org/2022/01/84661f60659149cc8.02053291.jpg\" alt=\"\" /></figure>\n</div>\n\n\n\n<figure class=\"wp-block-image size-large wp-container-content-0733e5d0 wp-duotone-rgb000-rgb21788120-6\"><img decoding=\"async\" src=\"https://pd.w.org/2022/01/21261f60ba46147b0.97888240.jpg\" alt=\"\" /></figure>\n</div>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:97:\"core/button,core/buttons,core/cover,core/group,core/heading,core/image,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:4102:\"<!-- wp:cover {\"customOverlayColor\":\"#eb4c77\",\"contentPosition\":\"center center\",\"isDark\":false,\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"6vw\",\"right\":\"6vw\",\"bottom\":\"6vw\",\"left\":\"6vw\"},\"margin\":{\"top\":\"0\"}}}} -->\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;padding-top:6vw;padding-right:6vw;padding-bottom:6vw;padding-left:6vw\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#eb4c77\"></span><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"0vw\"}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"wrap\",\"justifyContent\":\"center\",\"verticalAlignment\":\"top\"}} -->\n<div class=\"wp-block-group\"><!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"blockGap\":\"0px\"},\"layout\":{\"selfStretch\":\"fill\"}},\"layout\":{\"type\":\"constrained\",\"justifyContent\":\"left\",\"contentSize\":\"600px\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:heading {\"textAlign\":\"left\",\"align\":\"wide\",\"style\":{\"typography\":{\"fontSize\":\"100px\",\"textTransform\":\"none\",\"fontStyle\":\"normal\",\"fontWeight\":\"500\",\"lineHeight\":\"0.9\"}},\"textColor\":\"contrast\"} -->\n<h2 class=\"wp-block-heading alignwide has-text-align-left has-contrast-color has-text-color\" style=\"font-size:100px;font-style:normal;font-weight:500;line-height:0.9;text-transform:none\">Time for an adventure</h2>\n<!-- /wp:heading -->\n\n<!-- wp:spacer {\"height\":\"24px\"} -->\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:paragraph {\"align\":\"left\",\"textColor\":\"contrast\"} -->\n<p class=\"has-text-align-left has-contrast-color has-text-color\">Explore our network of trails that lead through a variety of woodland habitats and observe the diverse flora that call this area home. </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:spacer {\"height\":\"60px\"} -->\n<div style=\"height:60px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:buttons {\"layout\":{\"type\":\"flex\",\"justifyContent\":\"left\",\"flexWrap\":\"nowrap\"}} -->\n<div class=\"wp-block-buttons\"><!-- wp:button {\"backgroundColor\":\"contrast\",\"textColor\":\"base\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"24px\",\"right\":\"48px\",\"bottom\":\"24px\",\"left\":\"48px\"}},\"typography\":{\"fontSize\":\"16px\",\"fontStyle\":\"normal\",\"fontWeight\":\"500\",\"textTransform\":\"uppercase\",\"letterSpacing\":\"0px\"},\"border\":{\"radius\":\"0px\"}},\"className\":\"is-style-fill\"} -->\n<div class=\"wp-block-button has-custom-font-size is-style-fill\" style=\"font-size:16px;font-style:normal;font-weight:500;letter-spacing:0px;text-transform:uppercase\"><a class=\"wp-block-button__link has-base-color has-contrast-background-color has-text-color has-background wp-element-button\" style=\"border-radius:0px;padding-top:24px;padding-right:48px;padding-bottom:24px;padding-left:48px\">Sign up</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"style\":{\"layout\":{\"selfStretch\":\"fit\",\"flexSize\":null},\"spacing\":{\"blockGap\":\"24px\"}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\",\"verticalAlignment\":\"top\",\"justifyContent\":\"right\"}} -->\n<div class=\"wp-block-group\"><!-- wp:group {\"style\":{\"layout\":{\"selfStretch\":\"fixed\",\"flexSize\":\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group\"><!-- wp:spacer {\"height\":\"8vw\"} -->\n<div style=\"height:8vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:image {\"sizeSlug\":\"large\",\"style\":{\"layout\":{\"selfStretch\":\"fixed\",\"flexSize\":\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"},\"color\":{\"duotone\":[\"rgb(0, 0, 0)\",\"rgb(217, 88, 120)\"]}}} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://pd.w.org/2022/01/84661f60659149cc8.02053291.jpg\" alt=\"\" /></figure>\n<!-- /wp:image --></div>\n<!-- /wp:group -->\n\n<!-- wp:image {\"sizeSlug\":\"large\",\"style\":{\"layout\":{\"selfStretch\":\"fixed\",\"flexSize\":\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"},\"color\":{\"duotone\":[\"rgb(0, 0, 0)\",\"rgb(217, 88, 120)\"]}}} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://pd.w.org/2022/01/21261f60ba46147b0.97888240.jpg\" alt=\"\" /></figure>\n<!-- /wp:image --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group --></div></div>\n<!-- /wp:cover -->\";}i:15;O:8:\"stdClass\":7:{s:2:\"id\";i:308949;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:42:\"Bold sale banner with geometric background\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1776:\"\n<div class=\"wp-block-cover alignfull wp-duotone-rgb4448102-ffb23d-7\" style=\"margin-top:0;padding-top:4vw;padding-right:4vw;padding-bottom:4vw;padding-left:4vw;min-height:50vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-90 has-background-dim\" style=\"background-color:#2c3066\"></span><img decoding=\"async\" class=\"wp-block-cover__image-background wp-image-334\" alt=\"\" src=\"https://pd.w.org/2022/01/2661f82cd1ba9172.16386413.jpg\" data-object-fit=\"cover\" /><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group is-layout-flow wp-container-core-group-is-layout-a806e4b5 wp-block-group-is-layout-flow\">\n<p class=\"has-text-align-center has-text-color wp-block-paragraph\" style=\"color:#ffb23d;font-size:160px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:0.9;text-transform:uppercase\">Enjoy</p>\n\n\n\n<p class=\"has-text-align-center has-text-color wp-block-paragraph\" style=\"color:#ffb23d;font-size:160px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:0.9;text-transform:uppercase\">20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} Off</p>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-36078703 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-font-size\" style=\"font-size:20px;font-style:normal;font-weight:700;letter-spacing:1px;text-transform:uppercase\"><a class=\"wp-block-button__link has-text-color has-background wp-element-button\" style=\"color:#2c3066;background-color:#ffb23d;padding-top:32px;padding-right:48px;padding-bottom:32px;padding-left:48px\">Shop Now</a></div>\n</div>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:43:\"store, shop, coupon, jazz, background image\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:73:\"core/button,core/buttons,core/cover,core/group,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2819:\"<!-- wp:cover {\"url\":\"https://pd.w.org/2022/01/2661f82cd1ba9172.16386413.jpg\",\"id\":334,\"dimRatio\":90,\"customOverlayColor\":\"#2c3066\",\"minHeight\":50,\"minHeightUnit\":\"vh\",\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"4vw\",\"right\":\"4vw\",\"bottom\":\"4vw\",\"left\":\"4vw\"},\"margin\":{\"top\":\"0\"}},\"color\":{\"duotone\":[\"rgb(44, 48, 102)\",\"#ffb23d\"]}}} -->\n<div class=\"wp-block-cover alignfull\" style=\"margin-top:0;padding-top:4vw;padding-right:4vw;padding-bottom:4vw;padding-left:4vw;min-height:50vh\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-90 has-background-dim\" style=\"background-color:#2c3066\"></span><img class=\"wp-block-cover__image-background wp-image-334\" alt=\"\" src=\"https://pd.w.org/2022/01/2661f82cd1ba9172.16386413.jpg\" data-object-fit=\"cover\" /><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"0px\"}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"center\",\"style\":{\"typography\":{\"fontSize\":\"160px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"0.9\",\"letterSpacing\":\"-2px\"},\"color\":{\"text\":\"#ffb23d\"}}} -->\n<p class=\"has-text-align-center has-text-color\" style=\"color:#ffb23d;font-size:160px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:0.9;text-transform:uppercase\">Enjoy</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"center\",\"style\":{\"typography\":{\"fontSize\":\"160px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"0.9\",\"letterSpacing\":\"-2px\"},\"color\":{\"text\":\"#ffb23d\"}}} -->\n<p class=\"has-text-align-center has-text-color\" style=\"color:#ffb23d;font-size:160px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:0.9;text-transform:uppercase\">20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} Off</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:spacer {\"height\":\"48px\"} -->\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:buttons {\"layout\":{\"type\":\"flex\",\"justifyContent\":\"center\"}} -->\n<div class=\"wp-block-buttons\"><!-- wp:button {\"style\":{\"color\":{\"background\":\"#ffb23d\",\"text\":\"#2c3066\"},\"spacing\":{\"padding\":{\"top\":\"32px\",\"right\":\"48px\",\"bottom\":\"32px\",\"left\":\"48px\"}},\"typography\":{\"fontSize\":\"20px\",\"textTransform\":\"uppercase\",\"letterSpacing\":\"1px\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\"}}} -->\n<div class=\"wp-block-button has-custom-font-size\" style=\"font-size:20px;font-style:normal;font-weight:700;letter-spacing:1px;text-transform:uppercase\"><a class=\"wp-block-button__link has-text-color has-background wp-element-button\" style=\"color:#2c3066;background-color:#ffb23d;padding-top:32px;padding-right:48px;padding-bottom:32px;padding-left:48px\">Shop Now</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:group --></div></div>\n<!-- /wp:cover -->\";}i:16;O:8:\"stdClass\":7:{s:2:\"id\";i:308924;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:47:\"Offset bold paragraph text with varying opacity\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1734:\"\n<div class=\"wp-block-cover alignfull has-white-color has-text-color\" style=\"margin-top:0;padding-top:4vw;padding-right:4vw;padding-bottom:4vw;padding-left:4vw;min-height:66vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-black-background-color has-background-dim-100 has-background-dim\"></span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-662885f9 wp-block-group-is-layout-constrained\">\n<p class=\"has-text-align-left has-text-color wp-block-paragraph\" style=\"color:#ffffff61;font-size:120px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:1;text-transform:uppercase\">Embark</p>\n\n\n\n<p class=\"has-text-align-right has-text-color wp-block-paragraph\" style=\"color:#ffffff73;font-size:72px;font-style:normal;font-weight:700;letter-spacing:0px;line-height:1;text-transform:uppercase\"><strong>ON A HIKING</strong></p>\n\n\n\n<p class=\"has-text-align-left has-text-color wp-block-paragraph\" style=\"color:#ffffffad;font-size:72px;font-style:normal;font-weight:700;letter-spacing:0px;line-height:1;text-transform:uppercase\">adventure and explore the beauty of nature&#8217;s best…</p>\n\n\n\n<p class=\"has-text-align-right has-text-color wp-block-paragraph\" style=\"color:#ffffffd1;font-size:148px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:1;text-transform:uppercase\">In the</p>\n\n\n\n<p class=\"has-text-align-left has-text-color wp-block-paragraph\" style=\"color:#fffffff5;font-size:162px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:1;text-transform:uppercase\">WOODS.</p>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:36:\"core/cover,core/group,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3052:\"<!-- wp:cover {\"overlayColor\":\"black\",\"minHeight\":66,\"minHeightUnit\":\"vh\",\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"4vw\",\"right\":\"4vw\",\"bottom\":\"4vw\",\"left\":\"4vw\"},\"margin\":{\"top\":\"0\"}}},\"textColor\":\"white\"} -->\n<div class=\"wp-block-cover alignfull has-white-color has-text-color\" style=\"margin-top:0;padding-top:4vw;padding-right:4vw;padding-bottom:4vw;padding-left:4vw;min-height:66vh\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-black-background-color has-background-dim-100 has-background-dim\"></span><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"0px\"}},\"layout\":{\"type\":\"constrained\",\"wideSize\":\"700px\",\"contentSize\":\"700px\",\"justifyContent\":\"left\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"left\",\"style\":{\"typography\":{\"fontSize\":\"120px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"1\",\"letterSpacing\":\"-2px\"},\"color\":{\"text\":\"#ffffff61\"}}} -->\n<p class=\"has-text-align-left has-text-color\" style=\"color:#ffffff61;font-size:120px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:1;text-transform:uppercase\">Embark</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"right\",\"style\":{\"typography\":{\"fontSize\":\"72px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"1\",\"letterSpacing\":\"0px\"},\"color\":{\"text\":\"#ffffff73\"}}} -->\n<p class=\"has-text-align-right has-text-color\" style=\"color:#ffffff73;font-size:72px;font-style:normal;font-weight:700;letter-spacing:0px;line-height:1;text-transform:uppercase\"><strong>ON A HIKING</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"left\",\"style\":{\"typography\":{\"fontSize\":\"72px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"1\",\"letterSpacing\":\"0px\"},\"color\":{\"text\":\"#ffffffad\"}}} -->\n<p class=\"has-text-align-left has-text-color\" style=\"color:#ffffffad;font-size:72px;font-style:normal;font-weight:700;letter-spacing:0px;line-height:1;text-transform:uppercase\">adventure and explore the beauty of nature\'s best…</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"right\",\"style\":{\"typography\":{\"fontSize\":\"148px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"1\",\"letterSpacing\":\"-2px\"},\"color\":{\"text\":\"#ffffffd1\"}}} -->\n<p class=\"has-text-align-right has-text-color\" style=\"color:#ffffffd1;font-size:148px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:1;text-transform:uppercase\">In the</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"left\",\"style\":{\"typography\":{\"fontSize\":\"162px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"1\",\"letterSpacing\":\"-2px\"},\"color\":{\"text\":\"#fffffff5\"}}} -->\n<p class=\"has-text-align-left has-text-color\" style=\"color:#fffffff5;font-size:162px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:1;text-transform:uppercase\">WOODS.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div></div>\n<!-- /wp:cover -->\";}i:17;O:8:\"stdClass\":7:{s:2:\"id\";i:308916;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:40:\"Offset text with a brutalist design vibe\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1512:\"\n<div class=\"wp-block-cover alignfull is-light has-black-color has-text-color\" style=\"margin-top:0;padding-top:48px;padding-right:48px;padding-bottom:48px;padding-left:48px;min-height:66vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#ffb43c\"></span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group is-layout-constrained wp-container-core-group-is-layout-6d71ef12 wp-block-group-is-layout-constrained\">\n<p class=\"has-text-align-left has-black-color has-text-color wp-block-paragraph\" style=\"font-size:148px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:0.9;text-transform:uppercase\"><mark style=\"color:#a65a00\" class=\"has-inline-color\">✴︎</mark> Walk</p>\n\n\n\n<p class=\"has-text-align-right has-black-color has-text-color wp-block-paragraph\" style=\"font-size:148px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:0.9;text-transform:uppercase\">In the</p>\n\n\n\n<p class=\"has-text-align-left has-black-color has-text-color wp-block-paragraph\" style=\"font-size:148px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:0.9;text-transform:uppercase\">Park</p>\n\n\n\n<p class=\"has-text-align-center has-text-color wp-block-paragraph\" style=\"color:#a65a00;font-size:140px;font-style:italic;font-weight:200;letter-spacing:0px;line-height:0.9;text-transform:uppercase\">—01.03</p>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:36:\"core/cover,core/group,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2631:\"<!-- wp:cover {\"customOverlayColor\":\"#ffb43c\",\"minHeight\":66,\"minHeightUnit\":\"vh\",\"isDark\":false,\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"48px\",\"right\":\"48px\",\"bottom\":\"48px\",\"left\":\"48px\"},\"margin\":{\"top\":\"0\"}}},\"textColor\":\"black\"} -->\n<div class=\"wp-block-cover alignfull is-light has-black-color has-text-color\" style=\"margin-top:0;padding-top:48px;padding-right:48px;padding-bottom:48px;padding-left:48px;min-height:66vh\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#ffb43c\"></span><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"0px\"}},\"layout\":{\"type\":\"constrained\",\"wideSize\":\"1200px\",\"contentSize\":\"800px\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"left\",\"style\":{\"typography\":{\"fontSize\":\"148px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"0.9\",\"letterSpacing\":\"-2px\"}},\"textColor\":\"black\"} -->\n<p class=\"has-text-align-left has-black-color has-text-color\" style=\"font-size:148px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:0.9;text-transform:uppercase\"><mark style=\"color:#a65a00\" class=\"has-inline-color\">✴︎</mark> Walk</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"right\",\"style\":{\"typography\":{\"fontSize\":\"148px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"0.9\",\"letterSpacing\":\"-2px\"}},\"textColor\":\"black\"} -->\n<p class=\"has-text-align-right has-black-color has-text-color\" style=\"font-size:148px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:0.9;text-transform:uppercase\">In the</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"left\",\"style\":{\"typography\":{\"fontSize\":\"148px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"lineHeight\":\"0.9\",\"letterSpacing\":\"-2px\"}},\"textColor\":\"black\"} -->\n<p class=\"has-text-align-left has-black-color has-text-color\" style=\"font-size:148px;font-style:normal;font-weight:700;letter-spacing:-2px;line-height:0.9;text-transform:uppercase\">Park</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"center\",\"style\":{\"typography\":{\"fontSize\":\"140px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"italic\",\"fontWeight\":\"200\",\"letterSpacing\":\"0px\",\"lineHeight\":\"0.9\"},\"color\":{\"text\":\"#a65a00\"}}} -->\n<p class=\"has-text-align-center has-text-color\" style=\"color:#a65a00;font-size:140px;font-style:italic;font-weight:200;letter-spacing:0px;line-height:0.9;text-transform:uppercase\">—01.03</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div></div>\n<!-- /wp:cover -->\";}i:18;O:8:\"stdClass\":7:{s:2:\"id\";i:308901;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:40:\"Fullscreen image with right content area\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2154:\"\n<div class=\"wp-block-cover alignfull\" style=\"margin-top:0;padding-top:4vw;padding-right:4vw;padding-bottom:4vw;padding-left:4vw\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#376a23\"></span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group is-content-justification-left is-layout-flex wp-container-core-group-is-layout-b1a298a6 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-large wp-container-content-0733e5d0\"><img decoding=\"async\" src=\"https://pd.w.org/2022/01/84661f60659149cc8.02053291.jpg\" alt=\"\" /></figure>\n\n\n\n<div class=\"wp-block-group alignwide wp-container-content-9cfa9a5a is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-5bff1107 wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading alignwide has-text-align-left has-black-color has-text-color\" style=\"font-size:80px;font-style:italic;font-weight:700;line-height:1.0;text-transform:uppercase\">wAndering through the woods</h2>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<p class=\"has-text-align-left has-black-color has-text-color wp-block-paragraph\" style=\"font-size:18px;font-style:italic;font-weight:600\">Explore our network of trails that lead through a variety of woodland habitats and observe the diverse flora that call this area home. </p>\n\n\n\n<div style=\"height:60px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-left is-nowrap is-layout-flex wp-container-core-buttons-is-layout-950bf021 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-font-size is-style-fill\" style=\"font-size:18px;font-style:italic;font-weight:600;letter-spacing:0px;text-transform:uppercase\"><a class=\"wp-block-button__link has-white-color has-black-background-color has-text-color has-background wp-element-button\" style=\"border-radius:0px;padding-top:24px;padding-right:48px;padding-bottom:24px;padding-left:48px\">Sign up</a></div>\n</div>\n</div>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:97:\"core/button,core/buttons,core/cover,core/group,core/heading,core/image,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3261:\"<!-- wp:cover {\"customOverlayColor\":\"#376a23\",\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"4vw\",\"right\":\"4vw\",\"bottom\":\"4vw\",\"left\":\"4vw\"},\"margin\":{\"top\":\"0\"}}}} -->\n<div class=\"wp-block-cover alignfull\" style=\"margin-top:0;padding-top:4vw;padding-right:4vw;padding-bottom:4vw;padding-left:4vw\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#376a23\"></span><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"4vw\"}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"wrap\",\"justifyContent\":\"left\"}} -->\n<div class=\"wp-block-group\"><!-- wp:image {\"sizeSlug\":\"large\",\"style\":{\"layout\":{\"selfStretch\":\"fixed\",\"flexSize\":\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"}}} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://pd.w.org/2022/01/84661f60659149cc8.02053291.jpg\" alt=\"\" /></figure>\n<!-- /wp:image -->\n\n<!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"blockGap\":\"0px\"},\"layout\":{\"selfStretch\":\"fill\",\"flexSize\":null}},\"layout\":{\"type\":\"constrained\",\"justifyContent\":\"left\",\"contentSize\":\"600px\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:heading {\"textAlign\":\"left\",\"align\":\"wide\",\"style\":{\"typography\":{\"fontSize\":\"80px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"italic\",\"fontWeight\":\"700\",\"lineHeight\":\"1.0\"}},\"textColor\":\"black\"} -->\n<h2 class=\"wp-block-heading alignwide has-text-align-left has-black-color has-text-color\" style=\"font-size:80px;font-style:italic;font-weight:700;line-height:1.0;text-transform:uppercase\">wAndering through the woods</h2>\n<!-- /wp:heading -->\n\n<!-- wp:spacer {\"height\":\"24px\"} -->\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:paragraph {\"align\":\"left\",\"style\":{\"typography\":{\"fontSize\":\"18px\",\"fontStyle\":\"italic\",\"fontWeight\":\"600\"}},\"textColor\":\"black\"} -->\n<p class=\"has-text-align-left has-black-color has-text-color\" style=\"font-size:18px;font-style:italic;font-weight:600\">Explore our network of trails that lead through a variety of woodland habitats and observe the diverse flora that call this area home. </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:spacer {\"height\":\"60px\"} -->\n<div style=\"height:60px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:buttons {\"layout\":{\"type\":\"flex\",\"justifyContent\":\"left\",\"flexWrap\":\"nowrap\"}} -->\n<div class=\"wp-block-buttons\"><!-- wp:button {\"backgroundColor\":\"black\",\"textColor\":\"white\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"24px\",\"right\":\"48px\",\"bottom\":\"24px\",\"left\":\"48px\"}},\"typography\":{\"fontSize\":\"18px\",\"fontStyle\":\"italic\",\"fontWeight\":\"600\",\"textTransform\":\"uppercase\",\"letterSpacing\":\"0px\"},\"border\":{\"radius\":\"0px\"}},\"className\":\"is-style-fill\"} -->\n<div class=\"wp-block-button has-custom-font-size is-style-fill\" style=\"font-size:18px;font-style:italic;font-weight:600;letter-spacing:0px;text-transform:uppercase\"><a class=\"wp-block-button__link has-white-color has-black-background-color has-text-color has-background wp-element-button\" style=\"border-radius:0px;padding-top:24px;padding-right:48px;padding-bottom:24px;padding-left:48px\">Sign up</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group --></div></div>\n<!-- /wp:cover -->\";}i:19;O:8:\"stdClass\":7:{s:2:\"id\";i:308871;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:46:\"Cover Image with Bold Heading and Button, Left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1620:\"\n<div class=\"wp-block-cover alignfull is-light wp-duotone-094850-f9644e-9\" style=\"margin-top:0;padding-top:48px;padding-right:48px;padding-bottom:48px;padding-left:48px;min-height:66vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-30 has-background-dim\"></span><img decoding=\"async\" class=\"wp-block-cover__image-background wp-image-335\" alt=\"\" src=\"https://pd.w.org/2021/12/12261b91fba359867.64939140.jpg\" data-object-fit=\"cover\" /><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-72694e06 wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading has-text-align-left has-white-color has-text-color\" style=\"font-size:100px;font-style:normal;font-weight:700;letter-spacing:0px;line-height:1;text-transform:uppercase\">Take a hike and wAnder through the woods</h2>\n</div>\n\n\n\n<div style=\"height:72px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-left is-nowrap is-layout-flex wp-container-core-buttons-is-layout-950bf021 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-font-size is-style-outline is-style-outline--8\" style=\"font-size:16px;font-style:normal;font-weight:600;letter-spacing:0px;text-transform:uppercase\"><a class=\"wp-block-button__link has-white-color has-text-color wp-element-button\" style=\"padding-top:24px;padding-right:48px;padding-bottom:24px;padding-left:48px\">Explore</a></div>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:71:\"core/button,core/buttons,core/cover,core/group,core/heading,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2443:\"<!-- wp:cover {\"url\":\"https://pd.w.org/2021/12/12261b91fba359867.64939140.jpg\",\"id\":335,\"dimRatio\":30,\"minHeight\":66,\"minHeightUnit\":\"vh\",\"isDark\":false,\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"48px\",\"right\":\"48px\",\"bottom\":\"48px\",\"left\":\"48px\"},\"margin\":{\"top\":\"0\"}},\"color\":{\"duotone\":[\"#094850\",\"#f9644e\"]}}} -->\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;padding-top:48px;padding-right:48px;padding-bottom:48px;padding-left:48px;min-height:66vh\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-30 has-background-dim\"></span><img class=\"wp-block-cover__image-background wp-image-335\" alt=\"\" src=\"https://pd.w.org/2021/12/12261b91fba359867.64939140.jpg\" data-object-fit=\"cover\" /><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"48px\"}},\"layout\":{\"type\":\"constrained\",\"contentSize\":\"75{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\",\"justifyContent\":\"left\",\"wideSize\":\"75{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"}} -->\n<div class=\"wp-block-group\"><!-- wp:heading {\"textAlign\":\"left\",\"style\":{\"typography\":{\"fontSize\":\"100px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"letterSpacing\":\"0px\",\"lineHeight\":\"1\"}},\"textColor\":\"white\"} -->\n<h2 class=\"wp-block-heading has-text-align-left has-white-color has-text-color\" style=\"font-size:100px;font-style:normal;font-weight:700;letter-spacing:0px;line-height:1;text-transform:uppercase\">Take a hike and wAnder through the woods</h2>\n<!-- /wp:heading --></div>\n<!-- /wp:group -->\n\n<!-- wp:spacer {\"height\":\"72px\"} -->\n<div style=\"height:72px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:buttons {\"layout\":{\"type\":\"flex\",\"justifyContent\":\"left\",\"flexWrap\":\"nowrap\"}} -->\n<div class=\"wp-block-buttons\"><!-- wp:button {\"textColor\":\"white\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"24px\",\"right\":\"48px\",\"bottom\":\"24px\",\"left\":\"48px\"}},\"typography\":{\"fontSize\":\"16px\",\"fontStyle\":\"normal\",\"fontWeight\":\"600\",\"textTransform\":\"uppercase\",\"letterSpacing\":\"0px\"}},\"className\":\"is-style-outline\"} -->\n<div class=\"wp-block-button has-custom-font-size is-style-outline\" style=\"font-size:16px;font-style:normal;font-weight:600;letter-spacing:0px;text-transform:uppercase\"><a class=\"wp-block-button__link has-white-color has-text-color wp-element-button\" style=\"padding-top:24px;padding-right:48px;padding-bottom:24px;padding-left:48px\">Explore</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div></div>\n<!-- /wp:cover -->\";}i:20;O:8:\"stdClass\":7:{s:2:\"id\";i:308868;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:40:\"Cover Image with Bold Heading and Button\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1630:\"\n<div class=\"wp-block-cover alignfull is-light wp-duotone-rgb4247103-rgb21419442-11\" style=\"margin-top:0;padding-top:48px;padding-right:48px;padding-bottom:48px;padding-left:48px;min-height:66vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-30 has-background-dim\"></span><img decoding=\"async\" class=\"wp-block-cover__image-background wp-image-335\" alt=\"\" src=\"https://pd.w.org/2022/01/26061d763eca13bb6.11341561.jpg\" data-object-fit=\"cover\" /><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group is-layout-constrained wp-container-core-group-is-layout-08424862 wp-block-group-is-layout-constrained\">\n<h2 class=\"wp-block-heading has-text-align-center has-white-color has-text-color\" style=\"font-size:100px;font-style:normal;font-weight:700;letter-spacing:0px;line-height:1;text-transform:uppercase\">Embark on a hiking adventure and explore the beauty of the woods.</h2>\n</div>\n\n\n\n<div style=\"height:72px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-nowrap is-layout-flex wp-container-core-buttons-is-layout-d9d2fa6c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-font-size is-style-outline is-style-outline--10\" style=\"font-size:16px;font-style:normal;font-weight:600;letter-spacing:0px;text-transform:uppercase\"><a class=\"wp-block-button__link has-white-color has-text-color wp-element-button\" style=\"padding-top:24px;padding-right:48px;padding-bottom:24px;padding-left:48px\">Explore</a></div>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:71:\"core/button,core/buttons,core/cover,core/group,core/heading,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2449:\"<!-- wp:cover {\"url\":\"https://pd.w.org/2022/01/26061d763eca13bb6.11341561.jpg\",\"id\":335,\"dimRatio\":30,\"minHeight\":66,\"minHeightUnit\":\"vh\",\"isDark\":false,\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"48px\",\"right\":\"48px\",\"bottom\":\"48px\",\"left\":\"48px\"},\"margin\":{\"top\":\"0\"}},\"color\":{\"duotone\":[\"rgb(42, 47, 103)\",\"rgb(214, 194, 42)\"]}}} -->\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;padding-top:48px;padding-right:48px;padding-bottom:48px;padding-left:48px;min-height:66vh\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-30 has-background-dim\"></span><img class=\"wp-block-cover__image-background wp-image-335\" alt=\"\" src=\"https://pd.w.org/2022/01/26061d763eca13bb6.11341561.jpg\" data-object-fit=\"cover\" /><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"48px\"}},\"layout\":{\"type\":\"constrained\",\"wideSize\":\"80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"}} -->\n<div class=\"wp-block-group\"><!-- wp:heading {\"textAlign\":\"center\",\"style\":{\"typography\":{\"fontSize\":\"100px\",\"textTransform\":\"uppercase\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"letterSpacing\":\"0px\",\"lineHeight\":\"1\"}},\"textColor\":\"white\"} -->\n<h2 class=\"wp-block-heading has-text-align-center has-white-color has-text-color\" style=\"font-size:100px;font-style:normal;font-weight:700;letter-spacing:0px;line-height:1;text-transform:uppercase\">Embark on a hiking adventure and explore the beauty of the woods.</h2>\n<!-- /wp:heading --></div>\n<!-- /wp:group -->\n\n<!-- wp:spacer {\"height\":\"72px\"} -->\n<div style=\"height:72px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:buttons {\"layout\":{\"type\":\"flex\",\"justifyContent\":\"center\",\"flexWrap\":\"nowrap\"}} -->\n<div class=\"wp-block-buttons\"><!-- wp:button {\"textColor\":\"white\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"24px\",\"right\":\"48px\",\"bottom\":\"24px\",\"left\":\"48px\"}},\"typography\":{\"fontSize\":\"16px\",\"fontStyle\":\"normal\",\"fontWeight\":\"600\",\"textTransform\":\"uppercase\",\"letterSpacing\":\"0px\"}},\"className\":\"is-style-outline\"} -->\n<div class=\"wp-block-button has-custom-font-size is-style-outline\" style=\"font-size:16px;font-style:normal;font-weight:600;letter-spacing:0px;text-transform:uppercase\"><a class=\"wp-block-button__link has-white-color has-text-color wp-element-button\" style=\"padding-top:24px;padding-right:48px;padding-bottom:24px;padding-left:48px\">Explore</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div></div>\n<!-- /wp:cover -->\";}i:21;O:8:\"stdClass\":7:{s:2:\"id\";i:303828;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:30:\"Fullscreen cover image gallery\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:942:\"\n<div class=\"wp-block-cover alignfull\" style=\"padding-top:4vw;padding-right:4vw;padding-bottom:4vw;padding-left:4vw;min-height:66vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-black-background-color has-background-dim-100 has-background-dim\"></span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-73e98c27 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https://thato.test/?page_id=28\"><img decoding=\"async\" src=\"https://pd.w.org/2022/01/84661f60659149cc8.02053291.jpg\" alt=\"\" /></a></figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://thato.test/?page_id=28\"><img decoding=\"async\" src=\"https://pd.w.org/2022/01/21261f60ba46147b0.97888240.jpg\" alt=\"\" /></a></figure>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:43:\"gallery, images, columns, background, cover\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:32:\"core/cover,core/group,core/image\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:7:\"gallery\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1259:\"<!-- wp:cover {\"overlayColor\":\"black\",\"minHeight\":66,\"minHeightUnit\":\"vh\",\"contentPosition\":\"center center\",\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"4vw\",\"right\":\"4vw\",\"bottom\":\"4vw\",\"left\":\"4vw\"}}}} -->\n<div class=\"wp-block-cover alignfull\" style=\"padding-top:4vw;padding-right:4vw;padding-bottom:4vw;padding-left:4vw;min-height:66vh\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-black-background-color has-background-dim-100 has-background-dim\"></span><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"4vw\"}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\",\"justifyContent\":\"center\"}} -->\n<div class=\"wp-block-group\"><!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"custom\"} -->\n<figure class=\"wp-block-image size-large\"><a href=\"https://thato.test/?page_id=28\"><img src=\"https://pd.w.org/2022/01/84661f60659149cc8.02053291.jpg\" alt=\"\" /></a></figure>\n<!-- /wp:image -->\n\n<!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"custom\"} -->\n<figure class=\"wp-block-image size-large\"><a href=\"https://thato.test/?page_id=28\"><img src=\"https://pd.w.org/2022/01/21261f60ba46147b0.97888240.jpg\" alt=\"\" /></a></figure>\n<!-- /wp:image --></div>\n<!-- /wp:group --></div></div>\n<!-- /wp:cover -->\";}i:22;O:8:\"stdClass\":7:{s:2:\"id\";i:277265;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Fullwidth posts with uppercase titles\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:498:\"\n<div class=\"wp-block-query alignfull is-layout-flow wp-block-query-is-layout-flow\">\n<div class=\"wp-block-group alignfull is-layout-flow wp-block-group-is-layout-flow\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\"></div>\n\n\n\n<div class=\"wp-block-group is-layout-flow wp-block-group-is-layout-flow\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--30);padding-right:16px;padding-bottom:var(--wp--preset--spacing--30);padding-left:16px\"></div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:30:\"star, posts, loop, blog, index\";s:16:\"wpop_description\";s:62:\"A fullwidth posts pattern with large titles and start accents.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:10:\"core/query\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:182:\"core/group,core/paragraph,core/post-date,core/post-template,core/post-terms,core/post-title,core/query,core/query-pagination,core/query-pagination-next,core/query-pagination-previous\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:5:\"query\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3502:\"<!-- wp:query {\"queryId\":31,\"query\":{\"perPage\":3,\"pages\":0,\"offset\":0,\"postType\":\"post\",\"order\":\"desc\",\"orderBy\":\"date\",\"author\":\"\",\"search\":\"\",\"exclude\":[],\"sticky\":\"\",\"inherit\":false},\"align\":\"full\",\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-query alignfull\"><!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"0\",\"right\":\"0\",\"bottom\":\"0\",\"left\":\"0\"}}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group alignfull\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\"><!-- wp:post-template {\"style\":{\"typography\":{\"textTransform\":\"none\"}}} -->\n<!-- wp:group {\"style\":{\"border\":{\"bottom\":{\"color\":\"var:preset|color|contrast\",\"width\":\"1px\"}}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group\" style=\"border-bottom-color:var(--wp--preset--color--contrast);border-bottom-width:1px\"><!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"16px\",\"right\":\"16px\",\"bottom\":\"16px\",\"left\":\"16px\"}}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\",\"justifyContent\":\"space-between\"}} -->\n<div class=\"wp-block-group\" style=\"padding-top:16px;padding-right:16px;padding-bottom:16px;padding-left:16px\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"4px\"}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph -->\n<p>✴︎</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:post-date {\"textAlign\":\"left\",\"format\":\"M j, Y\",\"style\":{\"spacing\":{\"margin\":{\"top\":\"0\",\"right\":\"0\",\"bottom\":\"0\",\"left\":\"0\"}},\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|contrast\"}}},\"typography\":{\"textTransform\":\"uppercase\"}},\"textColor\":\"contrast\",\"fontSize\":\"small\"} /--></div>\n<!-- /wp:group -->\n\n<!-- wp:post-terms {\"term\":\"category\",\"prefix\":\"✴︎ \",\"style\":{\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|contrast\"}}},\"typography\":{\"textTransform\":\"uppercase\"}},\"textColor\":\"contrast\"} /--></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"16px\",\"bottom\":\"var:preset|spacing|70\",\"right\":\"16px\",\"left\":\"16px\"}}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\"}} -->\n<div class=\"wp-block-group\" style=\"padding-top:16px;padding-right:16px;padding-bottom:var(--wp--preset--spacing--70);padding-left:16px\"><!-- wp:post-title {\"isLink\":true,\"style\":{\"spacing\":{\"margin\":{\"top\":\"0\",\"right\":\"0\",\"bottom\":\"0\",\"left\":\"0\"}},\"layout\":{\"selfStretch\":\"fit\"},\"typography\":{\"fontStyle\":\"normal\",\"fontWeight\":\"500\",\"lineHeight\":\"1.1\",\"textTransform\":\"uppercase\",\"fontSize\":\"5.2rem\"},\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|contrast\"}}}},\"textColor\":\"contrast\"} /--></div>\n<!-- /wp:group -->\n<!-- /wp:post-template --></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|30\",\"right\":\"16px\",\"left\":\"16px\"},\"margin\":{\"top\":\"0\",\"bottom\":\"0\"}}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--30);padding-right:16px;padding-bottom:var(--wp--preset--spacing--30);padding-left:16px\"><!-- wp:query-pagination {\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\",\"justifyContent\":\"left\"}} -->\n<!-- wp:query-pagination-previous {\"label\":\"Previous\",\"style\":{\"typography\":{\"textTransform\":\"uppercase\"}},\"fontSize\":\"small\"} /-->\n\n<!-- wp:query-pagination-next {\"label\":\"Next\",\"style\":{\"typography\":{\"textTransform\":\"uppercase\"}},\"fontSize\":\"small\"} /-->\n<!-- /wp:query-pagination --></div>\n<!-- /wp:group --></div>\n<!-- /wp:query -->\";}i:23;O:8:\"stdClass\":7:{s:2:\"id\";i:277127;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:33:\"Fullwidth posts titles with dates\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:637:\"\n<div class=\"wp-block-query alignfull is-layout-flow wp-block-query-is-layout-flow\">\n<div class=\"wp-block-group alignfull is-layout-flow wp-block-group-is-layout-flow\" style=\"padding-top:0;padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--40)\"></div>\n\n\n\n<div class=\"wp-block-group is-layout-flow wp-block-group-is-layout-flow\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--40)\"></div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:31:\"Posts, Query, Loop, Blog, Index\";s:16:\"wpop_description\";s:62:\"A fullwidth posts pattern with large titles and numeral dates.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:10:\"core/query\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:151:\"core/group,core/post-date,core/post-template,core/post-title,core/query,core/query-pagination,core/query-pagination-next,core/query-pagination-previous\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:5:\"query\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3583:\"<!-- wp:query {\"queryId\":1,\"query\":{\"perPage\":3,\"pages\":0,\"offset\":0,\"postType\":\"post\",\"order\":\"desc\",\"orderBy\":\"date\",\"author\":\"\",\"search\":\"\",\"exclude\":[],\"sticky\":\"\",\"inherit\":false},\"align\":\"full\",\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-query alignfull\"><!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"0\",\"right\":\"var:preset|spacing|40\",\"bottom\":\"var:preset|spacing|40\",\"left\":\"var:preset|spacing|40\"}}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group alignfull\" style=\"padding-top:0;padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--40)\"><!-- wp:post-template {\"align\":\"full\",\"style\":{\"typography\":{\"textTransform\":\"none\"}}} -->\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"0\",\"padding\":{\"bottom\":\"var:preset|spacing|50\"}}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group\" style=\"padding-bottom:var(--wp--preset--spacing--50)\"><!-- wp:group {\"style\":{\"border\":{\"bottom\":{\"color\":\"var:preset|color|contrast\",\"width\":\"4px\"}},\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\",\"right\":\"0\",\"bottom\":\"var:preset|spacing|30\",\"left\":\"0\"}}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\",\"justifyContent\":\"space-between\"}} -->\n<div class=\"wp-block-group\" style=\"border-bottom-color:var(--wp--preset--color--contrast);border-bottom-width:4px;padding-top:var(--wp--preset--spacing--30);padding-right:0;padding-bottom:var(--wp--preset--spacing--30);padding-left:0\"><!-- wp:post-date {\"textAlign\":\"left\",\"format\":\"m.j\",\"style\":{\"spacing\":{\"margin\":{\"top\":\"0\",\"right\":\"0\",\"bottom\":\"0\",\"left\":\"0\"}},\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|contrast\"}}},\"typography\":{\"letterSpacing\":\"1px\",\"fontSize\":\"2rem\",\"fontStyle\":\"normal\",\"fontWeight\":\"600\"}},\"textColor\":\"contrast\"} /-->\n\n<!-- wp:post-date {\"textAlign\":\"left\",\"format\":\"Y\",\"style\":{\"spacing\":{\"margin\":{\"top\":\"0\",\"right\":\"0\",\"bottom\":\"0\",\"left\":\"0\"}},\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|contrast\"}}},\"typography\":{\"letterSpacing\":\"1px\",\"fontSize\":\"2rem\",\"fontStyle\":\"normal\",\"fontWeight\":\"600\"}},\"textColor\":\"contrast\"} /--></div>\n<!-- /wp:group -->\n\n<!-- wp:post-title {\"isLink\":true,\"style\":{\"layout\":{\"selfStretch\":\"fit\"},\"typography\":{\"lineHeight\":\"1.1\",\"fontSize\":\"4.6rem\",\"fontStyle\":\"normal\",\"fontWeight\":\"600\"},\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|contrast\"}}},\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\"}}},\"textColor\":\"contrast\"} /--></div>\n<!-- /wp:group -->\n<!-- /wp:post-template --></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|40\",\"bottom\":\"var:preset|spacing|40\",\"right\":\"var:preset|spacing|40\",\"left\":\"var:preset|spacing|40\"},\"margin\":{\"top\":\"0\",\"bottom\":\"0\"}}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--40)\"><!-- wp:query-pagination {\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\",\"justifyContent\":\"space-between\"}} -->\n<!-- wp:query-pagination-previous {\"style\":{\"typography\":{\"fontSize\":\"2rem\",\"fontStyle\":\"normal\",\"fontWeight\":\"600\",\"textTransform\":\"uppercase\",\"letterSpacing\":\"1px\"}}} /-->\n\n<!-- wp:query-pagination-next {\"style\":{\"typography\":{\"fontSize\":\"2rem\",\"fontStyle\":\"normal\",\"fontWeight\":\"600\",\"textTransform\":\"uppercase\",\"letterSpacing\":\"1px\"}}} /-->\n<!-- /wp:query-pagination --></div>\n<!-- /wp:group --></div>\n<!-- /wp:query -->\";}i:24;O:8:\"stdClass\":7:{s:2:\"id\";i:229111;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:36:\"Fullwidth site title and menu button\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3310:\"\n<div class=\"wp-block-group alignfull has-contrast-color has-text-color has-link-color wp-elements-4 is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-50016974 wp-block-group-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><h1 class=\"wp-block-site-title\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1>\n\n<nav class=\"is-responsive items-justified-right wp-block-navigation is-content-justification-right is-layout-flex wp-container-core-navigation-is-layout-f845d360 wp-block-navigation-is-layout-flex\" aria-label=\" 2\" \n		 data-wp-interactive=\"core/navigation\" data-wp-context=\'{\"overlayOpenedBy\":{\"click\":false,\"hover\":false,\"focus\":false},\"type\":\"overlay\",\"roleAttribute\":\"\",\"ariaLabel\":\"Menu\"}\'><button aria-haspopup=\"dialog\" aria-label=\"Abrir menu\" class=\"wp-block-navigation__responsive-container-open always-shown\" \n				data-wp-on--click=\"actions.openMenuOnClick\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n			><svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 7.5h16v1.5H4z\"></path><path d=\"M4 15h16v1.5H4z\"></path></svg></button>\n				<div class=\"wp-block-navigation__responsive-container hidden-by-default\"  id=\"modal-12\" \n				data-wp-class--has-modal-open=\"state.isMenuOpen\"\n				data-wp-class--is-menu-open=\"state.isMenuOpen\"\n				data-wp-watch=\"callbacks.initMenu\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n				data-wp-on--focusout=\"actions.handleMenuFocusout\"\n				tabindex=\"-1\"\n			>\n					<div class=\"wp-block-navigation__responsive-close\" tabindex=\"-1\">\n						<div class=\"wp-block-navigation__responsive-dialog\" \n				data-wp-bind--aria-modal=\"state.ariaModal\"\n				data-wp-bind--aria-label=\"state.ariaLabel\"\n				data-wp-bind--role=\"state.roleAttribute\"\n			>\n							<button aria-label=\"Fechar menu\" class=\"wp-block-navigation__responsive-container-close\" \n				data-wp-on--click=\"actions.closeMenuOnClick\"\n			><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m13.06 12 6.47-6.47-1.06-1.06L12 10.94 5.53 4.47 4.47 5.53 10.94 12l-6.47 6.47 1.06 1.06L12 13.06l6.47 6.47 1.06-1.06L13.06 12Z\"></path></svg></button>\n							<div class=\"wp-block-navigation__responsive-container-content\" \n				data-wp-watch=\"callbacks.focusFirstElement\"\n			 id=\"modal-12-content\">\n								<ul class=\"wp-block-navigation__container is-responsive items-justified-right wp-block-navigation\"><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Home</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">About</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Contact</span></a></li></ul>\n								\n							</div>\n						</div>\n					</div>\n				</div></nav></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:51:\"Header with site title and a hamburger menu button.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:42:\"core/group,core/navigation,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:794:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\",\"right\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|30\",\"left\":\"var:preset|spacing|30\"}},\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|contrast\"}}}},\"textColor\":\"contrast\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\"}} -->\n<div class=\"wp-block-group alignfull has-contrast-color has-text-color has-link-color\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:site-title /-->\n\n<!-- wp:navigation {\"overlayMenu\":\"always\",\"layout\":{\"type\":\"flex\",\"setCascadingProperties\":true,\"justifyContent\":\"right\"}} /--></div>\n<!-- /wp:group -->\";}i:25;O:8:\"stdClass\":7:{s:2:\"id\";i:229116;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:32:\"Fullwidth header with hero image\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4711:\"\n<div class=\"wp-block-group alignfull is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group alignfull is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-1d00eaaa wp-block-group-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group is-layout-flex wp-container-core-group-is-layout-b56d9725 wp-block-group-is-layout-flex\"><div class=\"is-default-size wp-block-site-logo\"><span class=\"custom-logo-link\"><img decoding=\"async\" src=\"https://s.w.org/images/wmark.png\" class=\"custom-logo\" alt=\"Logo do site\"></span></div>\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-bfed54d0 wp-block-group-is-layout-flex\"><h1 class=\"has-link-color wp-elements-5 wp-block-site-title has-medium-font-size\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1></div>\n</div>\n\n\n<nav class=\"is-responsive items-justified-right wp-block-navigation is-content-justification-right is-layout-flex wp-container-core-navigation-is-layout-f845d360 wp-block-navigation-is-layout-flex\" aria-label=\" 3\" \n		 data-wp-interactive=\"core/navigation\" data-wp-context=\'{\"overlayOpenedBy\":{\"click\":false,\"hover\":false,\"focus\":false},\"type\":\"overlay\",\"roleAttribute\":\"\",\"ariaLabel\":\"Menu\"}\'><button aria-haspopup=\"dialog\" aria-label=\"Abrir menu\" class=\"wp-block-navigation__responsive-container-open\" \n				data-wp-on--click=\"actions.openMenuOnClick\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n			><svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 7.5h16v1.5H4z\"></path><path d=\"M4 15h16v1.5H4z\"></path></svg></button>\n				<div class=\"wp-block-navigation__responsive-container\"  id=\"modal-13\" \n				data-wp-class--has-modal-open=\"state.isMenuOpen\"\n				data-wp-class--is-menu-open=\"state.isMenuOpen\"\n				data-wp-watch=\"callbacks.initMenu\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n				data-wp-on--focusout=\"actions.handleMenuFocusout\"\n				tabindex=\"-1\"\n			>\n					<div class=\"wp-block-navigation__responsive-close\" tabindex=\"-1\">\n						<div class=\"wp-block-navigation__responsive-dialog\" \n				data-wp-bind--aria-modal=\"state.ariaModal\"\n				data-wp-bind--aria-label=\"state.ariaLabel\"\n				data-wp-bind--role=\"state.roleAttribute\"\n			>\n							<button aria-label=\"Fechar menu\" class=\"wp-block-navigation__responsive-container-close\" \n				data-wp-on--click=\"actions.closeMenuOnClick\"\n			><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m13.06 12 6.47-6.47-1.06-1.06L12 10.94 5.53 4.47 4.47 5.53 10.94 12l-6.47 6.47 1.06 1.06L12 13.06l6.47 6.47 1.06-1.06L13.06 12Z\"></path></svg></button>\n							<div class=\"wp-block-navigation__responsive-container-content\" \n				data-wp-watch=\"callbacks.focusFirstElement\"\n			 id=\"modal-13-content\">\n								<ul class=\"wp-block-navigation__container is-responsive items-justified-right wp-block-navigation\"><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Home</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">About</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Contact</span></a></li></ul>\n								\n							</div>\n						</div>\n					</div>\n				</div></nav></div>\n\n\n\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;min-height:40vw;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-black-background-color has-background-dim-0 has-background-dim\"></span><img decoding=\"async\" class=\"wp-block-cover__image-background wp-image-61\" alt=\"\" src=\"https://img.rawpixel.com/s3fs-private/rawpixel_images/website_content/a017-eberhard-cco-the-after-rain.jpg?w=1200&amp;h=1200&amp;fit=clip&amp;crop=default&amp;dpr=1&amp;q=75&amp;vib=3&amp;con=3&amp;usm=15&amp;cs=srgb&amp;bg=F4F4F3&amp;ixlib=js-2.2.1&amp;s=e7b4ca0a0edcc84ba48c1f7ebf02dd5a\" style=\"object-position:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" data-object-fit=\"cover\" data-object-position=\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" /><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div></div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:65:\"Header on a white background followed by a full-width hero image.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:80:\"core/cover,core/group,core/navigation,core/site-logo,core/site-title,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"header\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2566:\"<!-- wp:group {\"align\":\"full\",\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group alignfull\"><!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\",\"right\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|30\",\"left\":\"var:preset|spacing|30\"}}},\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\",\"flexWrap\":\"wrap\"}} -->\n<div class=\"wp-block-group alignfull\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"24px\"}},\"layout\":{\"type\":\"flex\"}} -->\n<div class=\"wp-block-group\"><!-- wp:site-logo /-->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"4px\"}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\"}} -->\n<div class=\"wp-block-group\"><!-- wp:site-title {\"style\":{\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|contrast\"}}}},\"fontSize\":\"medium\"} /--></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\n\n<!-- wp:navigation {\"layout\":{\"type\":\"flex\",\"setCascadingProperties\":true,\"justifyContent\":\"right\"}} /--></div>\n<!-- /wp:group -->\n\n<!-- wp:cover {\"url\":\"https://img.rawpixel.com/s3fs-private/rawpixel_images/website_content/a017-eberhard-cco-the-after-rain.jpg?w=1200&h=1200&fit=clip&crop=default&dpr=1&q=75&vib=3&con=3&usm=15&cs=srgb&bg=F4F4F3&ixlib=js-2.2.1&s=e7b4ca0a0edcc84ba48c1f7ebf02dd5a\",\"id\":61,\"dimRatio\":0,\"overlayColor\":\"black\",\"focalPoint\":{\"x\":0.5,\"y\":0.5},\"minHeight\":40,\"minHeightUnit\":\"vw\",\"contentPosition\":\"center center\",\"isDark\":false,\"align\":\"full\",\"style\":{\"spacing\":{\"margin\":{\"top\":\"0\"}}}} -->\n<div class=\"wp-block-cover alignfull is-light\" style=\"margin-top:0;min-height:40vw\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-black-background-color has-background-dim-0 has-background-dim\"></span><img class=\"wp-block-cover__image-background wp-image-61\" alt=\"\" src=\"https://img.rawpixel.com/s3fs-private/rawpixel_images/website_content/a017-eberhard-cco-the-after-rain.jpg?w=1200&amp;h=1200&amp;fit=clip&amp;crop=default&amp;dpr=1&amp;q=75&amp;vib=3&amp;con=3&amp;usm=15&amp;cs=srgb&amp;bg=F4F4F3&amp;ixlib=js-2.2.1&amp;s=e7b4ca0a0edcc84ba48c1f7ebf02dd5a\" style=\"object-position:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" data-object-fit=\"cover\" data-object-position=\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" /><div class=\"wp-block-cover__inner-container\"><!-- wp:spacer {\"height\":\"50px\"} -->\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div></div>\n<!-- /wp:cover --></div>\n<!-- /wp:group -->\";}i:26;O:8:\"stdClass\":7:{s:2:\"id\";i:229092;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:41:\"Header inside full-width background image\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4696:\"\n<div class=\"wp-block-group alignfull is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-cover alignfull is-light\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30);min-height:50px;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-black-background-color has-background-dim\"></span><img decoding=\"async\" class=\"wp-block-cover__image-background wp-image-61\" alt=\"\" src=\"https://img.rawpixel.com/s3fs-private/rawpixel_images/website_content/a017-eberhard-cco-the-after-rain.jpg?w=1200&amp;h=1200&amp;fit=clip&amp;crop=default&amp;dpr=1&amp;q=75&amp;vib=3&amp;con=3&amp;usm=15&amp;cs=srgb&amp;bg=F4F4F3&amp;ixlib=js-2.2.1&amp;s=e7b4ca0a0edcc84ba48c1f7ebf02dd5a\" style=\"object-position:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" data-object-fit=\"cover\" data-object-position=\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" /><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-group alignwide has-base-color has-text-color has-link-color wp-elements-6 is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-8c9d081f wp-block-group-is-layout-flex\" style=\"margin-top:0;margin-bottom:0\">\n<div class=\"wp-block-group is-layout-flex wp-block-group-is-layout-flex\"><div class=\"is-default-size is-style-default wp-block-site-logo\"><span class=\"custom-logo-link\"><img decoding=\"async\" src=\"https://s.w.org/images/wmark.png\" class=\"custom-logo\" alt=\"Logo do site\"></span></div>\n\n<h1 class=\"has-link-color wp-elements-7 wp-block-site-title has-text-color has-white-color has-medium-font-size\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1></div>\n\n\n<nav class=\"has-text-color has-white-color is-responsive items-justified-right wp-block-navigation is-content-justification-right is-layout-flex wp-container-core-navigation-is-layout-f845d360 wp-block-navigation-is-layout-flex\" aria-label=\" 4\" \n		 data-wp-interactive=\"core/navigation\" data-wp-context=\'{\"overlayOpenedBy\":{\"click\":false,\"hover\":false,\"focus\":false},\"type\":\"overlay\",\"roleAttribute\":\"\",\"ariaLabel\":\"Menu\"}\'><button aria-haspopup=\"dialog\" aria-label=\"Abrir menu\" class=\"wp-block-navigation__responsive-container-open\" \n				data-wp-on--click=\"actions.openMenuOnClick\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n			><svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 7.5h16v1.5H4z\"></path><path d=\"M4 15h16v1.5H4z\"></path></svg></button>\n				<div class=\"wp-block-navigation__responsive-container\"  id=\"modal-14\" \n				data-wp-class--has-modal-open=\"state.isMenuOpen\"\n				data-wp-class--is-menu-open=\"state.isMenuOpen\"\n				data-wp-watch=\"callbacks.initMenu\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n				data-wp-on--focusout=\"actions.handleMenuFocusout\"\n				tabindex=\"-1\"\n			>\n					<div class=\"wp-block-navigation__responsive-close\" tabindex=\"-1\">\n						<div class=\"wp-block-navigation__responsive-dialog\" \n				data-wp-bind--aria-modal=\"state.ariaModal\"\n				data-wp-bind--aria-label=\"state.ariaLabel\"\n				data-wp-bind--role=\"state.roleAttribute\"\n			>\n							<button aria-label=\"Fechar menu\" class=\"wp-block-navigation__responsive-container-close\" \n				data-wp-on--click=\"actions.closeMenuOnClick\"\n			><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m13.06 12 6.47-6.47-1.06-1.06L12 10.94 5.53 4.47 4.47 5.53 10.94 12l-6.47 6.47 1.06 1.06L12 13.06l6.47 6.47 1.06-1.06L13.06 12Z\"></path></svg></button>\n							<div class=\"wp-block-navigation__responsive-container-content\" \n				data-wp-watch=\"callbacks.focusFirstElement\"\n			 id=\"modal-14-content\">\n								<ul class=\"wp-block-navigation__container has-text-color has-white-color is-responsive items-justified-right wp-block-navigation\"><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Home</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">About</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Contact</span></a></li></ul>\n								\n							</div>\n						</div>\n					</div>\n				</div></nav></div>\n\n\n\n<div style=\"height:33vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div></div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:100:\"Simple header with logo, site title, navigation and a full-width background image with dark overlay.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:80:\"core/cover,core/group,core/navigation,core/site-logo,core/site-title,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"header\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2554:\"<!-- wp:group {\"align\":\"full\",\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group alignfull\"><!-- wp:cover {\"url\":\"https://img.rawpixel.com/s3fs-private/rawpixel_images/website_content/a017-eberhard-cco-the-after-rain.jpg?w=1200&h=1200&fit=clip&crop=default&dpr=1&q=75&vib=3&con=3&usm=15&cs=srgb&bg=F4F4F3&ixlib=js-2.2.1&s=e7b4ca0a0edcc84ba48c1f7ebf02dd5a\",\"id\":61,\"dimRatio\":50,\"overlayColor\":\"black\",\"focalPoint\":{\"x\":0.5,\"y\":0.5},\"minHeight\":50,\"contentPosition\":\"center center\",\"isDark\":false,\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\",\"right\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|30\",\"left\":\"var:preset|spacing|30\"}}}} -->\n<div class=\"wp-block-cover alignfull is-light\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30);min-height:50px\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-black-background-color has-background-dim\"></span><img class=\"wp-block-cover__image-background wp-image-61\" alt=\"\" src=\"https://img.rawpixel.com/s3fs-private/rawpixel_images/website_content/a017-eberhard-cco-the-after-rain.jpg?w=1200&amp;h=1200&amp;fit=clip&amp;crop=default&amp;dpr=1&amp;q=75&amp;vib=3&amp;con=3&amp;usm=15&amp;cs=srgb&amp;bg=F4F4F3&amp;ixlib=js-2.2.1&amp;s=e7b4ca0a0edcc84ba48c1f7ebf02dd5a\" style=\"object-position:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" data-object-fit=\"cover\" data-object-position=\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\" /><div class=\"wp-block-cover__inner-container\"><!-- wp:group {\"align\":\"wide\",\"style\":{\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|base\"}}},\"spacing\":{\"margin\":{\"top\":\"0\",\"bottom\":\"0\"}}},\"textColor\":\"base\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\",\"flexWrap\":\"wrap\"}} -->\n<div class=\"wp-block-group alignwide has-base-color has-text-color has-link-color\" style=\"margin-top:0;margin-bottom:0\"><!-- wp:group {\"layout\":{\"type\":\"flex\"}} -->\n<div class=\"wp-block-group\"><!-- wp:site-logo {\"className\":\"is-style-default\"} /-->\n\n<!-- wp:site-title {\"style\":{\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|background\"}}}},\"textColor\":\"white\",\"fontSize\":\"medium\"} /--></div>\n<!-- /wp:group -->\n\n<!-- wp:navigation {\"textColor\":\"white\",\"layout\":{\"type\":\"flex\",\"setCascadingProperties\":true,\"justifyContent\":\"right\"}} /--></div>\n<!-- /wp:group -->\n\n<!-- wp:spacer {\"height\":\"33vw\"} -->\n<div style=\"height:33vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div></div>\n<!-- /wp:cover --></div>\n<!-- /wp:group -->\";}i:27;O:8:\"stdClass\":7:{s:2:\"id\";i:229097;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:34:\"Simple header with dark background\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3872:\"\n<div class=\"wp-block-group alignfull has-background-color has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-8 is-layout-constrained wp-container-core-group-is-layout-9f34fe8c wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-eb8a1b9b wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-layout-flex wp-block-group-is-layout-flex\"><div class=\"is-default-size wp-block-site-logo\"><span class=\"custom-logo-link\"><img decoding=\"async\" src=\"https://s.w.org/images/wmark.png\" class=\"custom-logo\" alt=\"Logo do site\"></span></div>\n\n<h1 class=\"has-link-color wp-elements-9 wp-block-site-title\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1></div>\n\n\n\n<div class=\"wp-block-group is-layout-flex wp-block-group-is-layout-flex\"><nav class=\"is-responsive items-justified-right wp-block-navigation is-content-justification-right is-layout-flex wp-container-core-navigation-is-layout-f845d360 wp-block-navigation-is-layout-flex\" aria-label=\" 5\" \n		 data-wp-interactive=\"core/navigation\" data-wp-context=\'{\"overlayOpenedBy\":{\"click\":false,\"hover\":false,\"focus\":false},\"type\":\"overlay\",\"roleAttribute\":\"\",\"ariaLabel\":\"Menu\"}\'><button aria-haspopup=\"dialog\" aria-label=\"Abrir menu\" class=\"wp-block-navigation__responsive-container-open\" \n				data-wp-on--click=\"actions.openMenuOnClick\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n			><svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 7.5h16v1.5H4z\"></path><path d=\"M4 15h16v1.5H4z\"></path></svg></button>\n				<div class=\"wp-block-navigation__responsive-container\"  id=\"modal-15\" \n				data-wp-class--has-modal-open=\"state.isMenuOpen\"\n				data-wp-class--is-menu-open=\"state.isMenuOpen\"\n				data-wp-watch=\"callbacks.initMenu\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n				data-wp-on--focusout=\"actions.handleMenuFocusout\"\n				tabindex=\"-1\"\n			>\n					<div class=\"wp-block-navigation__responsive-close\" tabindex=\"-1\">\n						<div class=\"wp-block-navigation__responsive-dialog\" \n				data-wp-bind--aria-modal=\"state.ariaModal\"\n				data-wp-bind--aria-label=\"state.ariaLabel\"\n				data-wp-bind--role=\"state.roleAttribute\"\n			>\n							<button aria-label=\"Fechar menu\" class=\"wp-block-navigation__responsive-container-close\" \n				data-wp-on--click=\"actions.closeMenuOnClick\"\n			><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m13.06 12 6.47-6.47-1.06-1.06L12 10.94 5.53 4.47 4.47 5.53 10.94 12l-6.47 6.47 1.06 1.06L12 13.06l6.47 6.47 1.06-1.06L13.06 12Z\"></path></svg></button>\n							<div class=\"wp-block-navigation__responsive-container-content\" \n				data-wp-watch=\"callbacks.focusFirstElement\"\n			 id=\"modal-15-content\">\n								<ul class=\"wp-block-navigation__container is-responsive items-justified-right wp-block-navigation\"><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Home</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">About</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Contact</span></a></li></ul>\n								\n							</div>\n						</div>\n					</div>\n				</div></nav></div>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:76:\"Simple header with logo, site title, navigation links and a dark background.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:57:\"core/group,core/navigation,core/site-logo,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1497:\"<!-- wp:group {\"metadata\":{\"categories\":[\"header\",\"wireframe\"],\"patternName\":\"core/simple-header-with-dark-background\",\"name\":\"Simple header with dark background\"},\"align\":\"full\",\"style\":{\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|white\"}}},\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\",\"right\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|30\",\"left\":\"var:preset|spacing|30\"}}},\"backgroundColor\":\"black\",\"textColor\":\"white\",\"className\":\"has-background-color\",\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group alignfull has-background-color has-white-color has-black-background-color has-text-color has-background has-link-color\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:group {\"align\":\"wide\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\",\"flexWrap\":\"wrap\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:group {\"layout\":{\"type\":\"flex\"}} -->\n<div class=\"wp-block-group\"><!-- wp:site-logo /-->\n\n<!-- wp:site-title {\"style\":{\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|white\"}}}}} /--></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"layout\":{\"type\":\"flex\",\"flexWrap\":\"wrap\"}} -->\n<div class=\"wp-block-group\"><!-- wp:navigation {\"layout\":{\"type\":\"flex\",\"setCascadingProperties\":true,\"justifyContent\":\"right\"}} /--></div>\n<!-- /wp:group --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:28;O:8:\"stdClass\":7:{s:2:\"id\";i:229101;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:29:\"Text-only header with tagline\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3580:\"\n<div class=\"wp-block-group alignfull is-layout-constrained wp-container-core-group-is-layout-9f34fe8c wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-b411fb28 wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-layout-flex wp-block-group-is-layout-flex\"><h1 class=\"has-link-color wp-elements-10 wp-block-site-title\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1>\n\n<p class=\"wp-block-site-tagline\">Beautifully designed patterns ready to go with a simple copy/paste</p></div>\n\n\n<nav class=\"is-responsive items-justified-right wp-block-navigation is-content-justification-right is-layout-flex wp-container-core-navigation-is-layout-f845d360 wp-block-navigation-is-layout-flex\" aria-label=\" 6\" \n		 data-wp-interactive=\"core/navigation\" data-wp-context=\'{\"overlayOpenedBy\":{\"click\":false,\"hover\":false,\"focus\":false},\"type\":\"overlay\",\"roleAttribute\":\"\",\"ariaLabel\":\"Menu\"}\'><button aria-haspopup=\"dialog\" aria-label=\"Abrir menu\" class=\"wp-block-navigation__responsive-container-open\" \n				data-wp-on--click=\"actions.openMenuOnClick\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n			><svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 7.5h16v1.5H4z\"></path><path d=\"M4 15h16v1.5H4z\"></path></svg></button>\n				<div class=\"wp-block-navigation__responsive-container\"  id=\"modal-16\" \n				data-wp-class--has-modal-open=\"state.isMenuOpen\"\n				data-wp-class--is-menu-open=\"state.isMenuOpen\"\n				data-wp-watch=\"callbacks.initMenu\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n				data-wp-on--focusout=\"actions.handleMenuFocusout\"\n				tabindex=\"-1\"\n			>\n					<div class=\"wp-block-navigation__responsive-close\" tabindex=\"-1\">\n						<div class=\"wp-block-navigation__responsive-dialog\" \n				data-wp-bind--aria-modal=\"state.ariaModal\"\n				data-wp-bind--aria-label=\"state.ariaLabel\"\n				data-wp-bind--role=\"state.roleAttribute\"\n			>\n							<button aria-label=\"Fechar menu\" class=\"wp-block-navigation__responsive-container-close\" \n				data-wp-on--click=\"actions.closeMenuOnClick\"\n			><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m13.06 12 6.47-6.47-1.06-1.06L12 10.94 5.53 4.47 4.47 5.53 10.94 12l-6.47 6.47 1.06 1.06L12 13.06l6.47 6.47 1.06-1.06L13.06 12Z\"></path></svg></button>\n							<div class=\"wp-block-navigation__responsive-container-content\" \n				data-wp-watch=\"callbacks.focusFirstElement\"\n			 id=\"modal-16-content\">\n								<ul class=\"wp-block-navigation__container is-responsive items-justified-right wp-block-navigation\"><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Home</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">About</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Contact</span></a></li></ul>\n								\n							</div>\n						</div>\n					</div>\n				</div></nav></div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:53:\"Header with site title, tagline and navigation links.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:60:\"core/group,core/navigation,core/site-tagline,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:966:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\",\"right\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|30\",\"left\":\"var:preset|spacing|30\"}}},\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group alignfull\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:group {\"align\":\"wide\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:group {\"layout\":{\"type\":\"flex\"}} -->\n<div class=\"wp-block-group\"><!-- wp:site-title {\"style\":{\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|contrast\"}}}}} /-->\n\n<!-- wp:site-tagline /--></div>\n<!-- /wp:group -->\n\n<!-- wp:navigation {\"layout\":{\"type\":\"flex\",\"setCascadingProperties\":true,\"justifyContent\":\"right\"}} /--></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:29;O:8:\"stdClass\":7:{s:2:\"id\";i:229105;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:26:\"Simple header with tagline\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4077:\"\n<div class=\"wp-block-group alignfull has-contrast-color has-text-color has-link-color wp-elements-11 is-layout-constrained wp-container-core-group-is-layout-9f34fe8c wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-eb8a1b9b wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-layout-flex wp-container-core-group-is-layout-b56d9725 wp-block-group-is-layout-flex\"><div class=\"is-default-size wp-block-site-logo\"><span class=\"custom-logo-link\"><img decoding=\"async\" src=\"https://s.w.org/images/wmark.png\" class=\"custom-logo\" alt=\"Logo do site\"></span></div>\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-bfed54d0 wp-block-group-is-layout-flex\"><h1 class=\"has-link-color wp-elements-12 wp-block-site-title\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1>\n\n<p class=\"wp-block-site-tagline has-small-font-size\">Beautifully designed patterns ready to go with a simple copy/paste</p></div>\n</div>\n\n\n<nav class=\"has-small-font-size is-responsive items-justified-right wp-block-navigation is-content-justification-right is-layout-flex wp-container-core-navigation-is-layout-f845d360 wp-block-navigation-is-layout-flex\" aria-label=\" 7\" \n		 data-wp-interactive=\"core/navigation\" data-wp-context=\'{\"overlayOpenedBy\":{\"click\":false,\"hover\":false,\"focus\":false},\"type\":\"overlay\",\"roleAttribute\":\"\",\"ariaLabel\":\"Menu\"}\'><button aria-haspopup=\"dialog\" aria-label=\"Abrir menu\" class=\"wp-block-navigation__responsive-container-open\" \n				data-wp-on--click=\"actions.openMenuOnClick\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n			><svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 7.5h16v1.5H4z\"></path><path d=\"M4 15h16v1.5H4z\"></path></svg></button>\n				<div class=\"wp-block-navigation__responsive-container\"  id=\"modal-17\" \n				data-wp-class--has-modal-open=\"state.isMenuOpen\"\n				data-wp-class--is-menu-open=\"state.isMenuOpen\"\n				data-wp-watch=\"callbacks.initMenu\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n				data-wp-on--focusout=\"actions.handleMenuFocusout\"\n				tabindex=\"-1\"\n			>\n					<div class=\"wp-block-navigation__responsive-close\" tabindex=\"-1\">\n						<div class=\"wp-block-navigation__responsive-dialog\" \n				data-wp-bind--aria-modal=\"state.ariaModal\"\n				data-wp-bind--aria-label=\"state.ariaLabel\"\n				data-wp-bind--role=\"state.roleAttribute\"\n			>\n							<button aria-label=\"Fechar menu\" class=\"wp-block-navigation__responsive-container-close\" \n				data-wp-on--click=\"actions.closeMenuOnClick\"\n			><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m13.06 12 6.47-6.47-1.06-1.06L12 10.94 5.53 4.47 4.47 5.53 10.94 12l-6.47 6.47 1.06 1.06L12 13.06l6.47 6.47 1.06-1.06L13.06 12Z\"></path></svg></button>\n							<div class=\"wp-block-navigation__responsive-container-content\" \n				data-wp-watch=\"callbacks.focusFirstElement\"\n			 id=\"modal-17-content\">\n								<ul class=\"wp-block-navigation__container has-small-font-size is-responsive items-justified-right wp-block-navigation\"><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Home</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">About</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Contact</span></a></li></ul>\n								\n							</div>\n						</div>\n					</div>\n				</div></nav></div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:92:\"Header with site logo, title and tagline on the left and with navigation links on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:75:\"core/group,core/navigation,core/site-logo,core/site-tagline,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1389:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\",\"right\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|30\",\"left\":\"var:preset|spacing|30\"}},\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|contrast\"}}}},\"textColor\":\"contrast\",\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group alignfull has-contrast-color has-text-color has-link-color\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:group {\"align\":\"wide\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\",\"flexWrap\":\"wrap\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"24px\"}},\"layout\":{\"type\":\"flex\"}} -->\n<div class=\"wp-block-group\"><!-- wp:site-logo /-->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"4px\"}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\"}} -->\n<div class=\"wp-block-group\"><!-- wp:site-title {\"style\":{\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|contrast\"}}}}} /-->\n\n<!-- wp:site-tagline {\"fontSize\":\"small\"} /--></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\n\n<!-- wp:navigation {\"layout\":{\"type\":\"flex\",\"setCascadingProperties\":true,\"justifyContent\":\"right\"},\"fontSize\":\"small\"} /--></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:30;O:8:\"stdClass\":7:{s:2:\"id\";i:229080;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:25:\"Centered header with logo\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3650:\"\n<div class=\"wp-block-group alignfull is-layout-constrained wp-container-core-group-is-layout-da0445ef wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group alignwide is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-3448b7a1 wp-block-group-is-layout-flex\"><div class=\"is-default-size wp-block-site-logo\"><span class=\"custom-logo-link\"><img decoding=\"async\" src=\"https://s.w.org/images/wmark.png\" class=\"custom-logo\" alt=\"Logo do site\"></span></div>\n\n<h1 class=\"has-link-color wp-elements-13 wp-block-site-title has-text-color has-contrast-color has-large-font-size\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1>\n\n<nav class=\"is-responsive items-justified-center wp-block-navigation is-content-justification-center is-layout-flex wp-container-core-navigation-is-layout-517857a4 wp-block-navigation-is-layout-flex\" aria-label=\" 8\" \n		 data-wp-interactive=\"core/navigation\" data-wp-context=\'{\"overlayOpenedBy\":{\"click\":false,\"hover\":false,\"focus\":false},\"type\":\"overlay\",\"roleAttribute\":\"\",\"ariaLabel\":\"Menu\"}\'><button aria-haspopup=\"dialog\" aria-label=\"Abrir menu\" class=\"wp-block-navigation__responsive-container-open\" \n				data-wp-on--click=\"actions.openMenuOnClick\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n			><svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 7.5h16v1.5H4z\"></path><path d=\"M4 15h16v1.5H4z\"></path></svg></button>\n				<div class=\"wp-block-navigation__responsive-container\"  id=\"modal-18\" \n				data-wp-class--has-modal-open=\"state.isMenuOpen\"\n				data-wp-class--is-menu-open=\"state.isMenuOpen\"\n				data-wp-watch=\"callbacks.initMenu\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n				data-wp-on--focusout=\"actions.handleMenuFocusout\"\n				tabindex=\"-1\"\n			>\n					<div class=\"wp-block-navigation__responsive-close\" tabindex=\"-1\">\n						<div class=\"wp-block-navigation__responsive-dialog\" \n				data-wp-bind--aria-modal=\"state.ariaModal\"\n				data-wp-bind--aria-label=\"state.ariaLabel\"\n				data-wp-bind--role=\"state.roleAttribute\"\n			>\n							<button aria-label=\"Fechar menu\" class=\"wp-block-navigation__responsive-container-close\" \n				data-wp-on--click=\"actions.closeMenuOnClick\"\n			><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m13.06 12 6.47-6.47-1.06-1.06L12 10.94 5.53 4.47 4.47 5.53 10.94 12l-6.47 6.47 1.06 1.06L12 13.06l6.47 6.47 1.06-1.06L13.06 12Z\"></path></svg></button>\n							<div class=\"wp-block-navigation__responsive-container-content\" \n				data-wp-watch=\"callbacks.focusFirstElement\"\n			 id=\"modal-18-content\">\n								<ul class=\"wp-block-navigation__container is-responsive items-justified-center wp-block-navigation\"><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Home</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">About</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Contact</span></a></li></ul>\n								\n							</div>\n						</div>\n					</div>\n				</div></nav></div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:65:\"Center aligned header with logo, site title and navigation links.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:57:\"core/group,core/navigation,core/site-logo,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:926:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|40\",\"right\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|40\",\"left\":\"var:preset|spacing|30\"}}},\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group alignfull\" style=\"padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:group {\"align\":\"wide\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"center\",\"orientation\":\"vertical\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:site-logo /-->\n\n<!-- wp:site-title {\"style\":{\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|contrast\"}}}},\"textColor\":\"contrast\",\"fontSize\":\"large\"} /-->\n\n<!-- wp:navigation {\"layout\":{\"type\":\"flex\",\"setCascadingProperties\":true,\"justifyContent\":\"center\"}} /--></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:31;O:8:\"stdClass\":7:{s:2:\"id\";i:229084;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Fullwidth header with large font size\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3340:\"\n<div class=\"wp-block-group alignfull has-contrast-color has-text-color has-link-color wp-elements-14 is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-50016974 wp-block-group-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><h1 class=\"wp-block-site-title has-large-font-size\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1>\n\n<nav class=\"has-large-font-size is-responsive items-justified-right wp-block-navigation is-content-justification-right is-layout-flex wp-container-core-navigation-is-layout-f845d360 wp-block-navigation-is-layout-flex\" aria-label=\" 9\" \n		 data-wp-interactive=\"core/navigation\" data-wp-context=\'{\"overlayOpenedBy\":{\"click\":false,\"hover\":false,\"focus\":false},\"type\":\"overlay\",\"roleAttribute\":\"\",\"ariaLabel\":\"Menu\"}\'><button aria-haspopup=\"dialog\" aria-label=\"Abrir menu\" class=\"wp-block-navigation__responsive-container-open\" \n				data-wp-on--click=\"actions.openMenuOnClick\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n			><svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 7.5h16v1.5H4z\"></path><path d=\"M4 15h16v1.5H4z\"></path></svg></button>\n				<div class=\"wp-block-navigation__responsive-container\"  id=\"modal-19\" \n				data-wp-class--has-modal-open=\"state.isMenuOpen\"\n				data-wp-class--is-menu-open=\"state.isMenuOpen\"\n				data-wp-watch=\"callbacks.initMenu\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n				data-wp-on--focusout=\"actions.handleMenuFocusout\"\n				tabindex=\"-1\"\n			>\n					<div class=\"wp-block-navigation__responsive-close\" tabindex=\"-1\">\n						<div class=\"wp-block-navigation__responsive-dialog\" \n				data-wp-bind--aria-modal=\"state.ariaModal\"\n				data-wp-bind--aria-label=\"state.ariaLabel\"\n				data-wp-bind--role=\"state.roleAttribute\"\n			>\n							<button aria-label=\"Fechar menu\" class=\"wp-block-navigation__responsive-container-close\" \n				data-wp-on--click=\"actions.closeMenuOnClick\"\n			><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m13.06 12 6.47-6.47-1.06-1.06L12 10.94 5.53 4.47 4.47 5.53 10.94 12l-6.47 6.47 1.06 1.06L12 13.06l6.47 6.47 1.06-1.06L13.06 12Z\"></path></svg></button>\n							<div class=\"wp-block-navigation__responsive-container-content\" \n				data-wp-watch=\"callbacks.focusFirstElement\"\n			 id=\"modal-19-content\">\n								<ul class=\"wp-block-navigation__container has-large-font-size is-responsive items-justified-right wp-block-navigation\"><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Home</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">About</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Contact</span></a></li></ul>\n								\n							</div>\n						</div>\n					</div>\n				</div></nav></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:80:\"Header with a large site title and navigation links in the same large font size.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:42:\"core/group,core/navigation,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:811:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\",\"right\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|30\",\"left\":\"var:preset|spacing|30\"}},\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|contrast\"}}}},\"textColor\":\"contrast\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\"}} -->\n<div class=\"wp-block-group alignfull has-contrast-color has-text-color has-link-color\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:site-title {\"fontSize\":\"large\"} /-->\n\n<!-- wp:navigation {\"layout\":{\"type\":\"flex\",\"setCascadingProperties\":true,\"justifyContent\":\"right\"},\"fontSize\":\"large\"} /--></div>\n<!-- /wp:group -->\";}i:32;O:8:\"stdClass\":7:{s:2:\"id\";i:229088;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:13:\"Simple header\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3713:\"\n<div class=\"wp-block-group alignfull is-layout-constrained wp-container-core-group-is-layout-9f34fe8c wp-block-group-is-layout-constrained\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-eb8a1b9b wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-layout-flex wp-container-core-group-is-layout-b56d9725 wp-block-group-is-layout-flex\"><div class=\"is-default-size wp-block-site-logo\"><span class=\"custom-logo-link\"><img decoding=\"async\" src=\"https://s.w.org/images/wmark.png\" class=\"custom-logo\" alt=\"Logo do site\"></span></div>\n\n<h1 class=\"has-link-color wp-elements-15 wp-block-site-title\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1></div>\n\n\n<nav class=\"is-responsive items-justified-right wp-block-navigation is-content-justification-right is-layout-flex wp-container-core-navigation-is-layout-f845d360 wp-block-navigation-is-layout-flex\" aria-label=\" 10\" \n		 data-wp-interactive=\"core/navigation\" data-wp-context=\'{\"overlayOpenedBy\":{\"click\":false,\"hover\":false,\"focus\":false},\"type\":\"overlay\",\"roleAttribute\":\"\",\"ariaLabel\":\"Menu\"}\'><button aria-haspopup=\"dialog\" aria-label=\"Abrir menu\" class=\"wp-block-navigation__responsive-container-open\" \n				data-wp-on--click=\"actions.openMenuOnClick\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n			><svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 7.5h16v1.5H4z\"></path><path d=\"M4 15h16v1.5H4z\"></path></svg></button>\n				<div class=\"wp-block-navigation__responsive-container\"  id=\"modal-20\" \n				data-wp-class--has-modal-open=\"state.isMenuOpen\"\n				data-wp-class--is-menu-open=\"state.isMenuOpen\"\n				data-wp-watch=\"callbacks.initMenu\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n				data-wp-on--focusout=\"actions.handleMenuFocusout\"\n				tabindex=\"-1\"\n			>\n					<div class=\"wp-block-navigation__responsive-close\" tabindex=\"-1\">\n						<div class=\"wp-block-navigation__responsive-dialog\" \n				data-wp-bind--aria-modal=\"state.ariaModal\"\n				data-wp-bind--aria-label=\"state.ariaLabel\"\n				data-wp-bind--role=\"state.roleAttribute\"\n			>\n							<button aria-label=\"Fechar menu\" class=\"wp-block-navigation__responsive-container-close\" \n				data-wp-on--click=\"actions.closeMenuOnClick\"\n			><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m13.06 12 6.47-6.47-1.06-1.06L12 10.94 5.53 4.47 4.47 5.53 10.94 12l-6.47 6.47 1.06 1.06L12 13.06l6.47 6.47 1.06-1.06L13.06 12Z\"></path></svg></button>\n							<div class=\"wp-block-navigation__responsive-container-content\" \n				data-wp-watch=\"callbacks.focusFirstElement\"\n			 id=\"modal-20-content\">\n								<ul class=\"wp-block-navigation__container is-responsive items-justified-right wp-block-navigation\"><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Home</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">About</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Contact</span></a></li></ul>\n								\n							</div>\n						</div>\n					</div>\n				</div></nav></div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:51:\"Simple header with logo, site title and navigation.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:57:\"core/group,core/navigation,core/site-logo,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1021:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\",\"right\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|30\",\"left\":\"var:preset|spacing|30\"}}},\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group alignfull\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:group {\"align\":\"wide\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\",\"flexWrap\":\"wrap\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"24px\"}},\"layout\":{\"type\":\"flex\"}} -->\n<div class=\"wp-block-group\"><!-- wp:site-logo /-->\n\n<!-- wp:site-title {\"style\":{\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|contrast\"}}}}} /--></div>\n<!-- /wp:group -->\n\n<!-- wp:navigation {\"layout\":{\"type\":\"flex\",\"setCascadingProperties\":true,\"justifyContent\":\"right\"}} /--></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:33;O:8:\"stdClass\":7:{s:2:\"id\";i:229123;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:33:\"Centered footer with social links\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4266:\"\n<div class=\"wp-block-group alignfull has-contrast-color has-text-color is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-bd7dfa5a wp-block-group-is-layout-flex\" style=\"min-height:30vh;margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--60);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--50)\">\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-4dc8b8ac wp-block-group-is-layout-flex\">\n<p class=\"has-text-align-center wp-block-paragraph\">Proudly powered by <a href=\"https://wordpress.org\">WordPress</a></p>\n\n\n\n<ul class=\"wp-block-social-links has-small-icon-size is-style-logos-only is-nowrap is-layout-flex wp-container-core-social-links-is-layout-0ed9dbc8 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-twitter wp-block-social-link\"><a href=\"#\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M22.23,5.924c-0.736,0.326-1.527,0.547-2.357,0.646c0.847-0.508,1.498-1.312,1.804-2.27 c-0.793,0.47-1.671,0.812-2.606,0.996C18.324,4.498,17.257,4,16.077,4c-2.266,0-4.103,1.837-4.103,4.103 c0,0.322,0.036,0.635,0.106,0.935C8.67,8.867,5.647,7.234,3.623,4.751C3.27,5.357,3.067,6.062,3.067,6.814 c0,1.424,0.724,2.679,1.825,3.415c-0.673-0.021-1.305-0.206-1.859-0.513c0,0.017,0,0.034,0,0.052c0,1.988,1.414,3.647,3.292,4.023 c-0.344,0.094-0.707,0.144-1.081,0.144c-0.264,0-0.521-0.026-0.772-0.074c0.522,1.63,2.038,2.816,3.833,2.85 c-1.404,1.1-3.174,1.756-5.096,1.756c-0.331,0-0.658-0.019-0.979-0.057c1.816,1.164,3.973,1.843,6.29,1.843 c7.547,0,11.675-6.252,11.675-11.675c0-0.178-0.004-0.355-0.012-0.531C20.985,7.47,21.68,6.747,22.23,5.924z\"></path></svg><span class=\"wp-block-social-link-label screen-reader-text\">Twitter</span></a></li>\n\n<li class=\"wp-social-link wp-social-link-instagram wp-block-social-link\"><a href=\"#\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,4.622c2.403,0,2.688,0.009,3.637,0.052c0.877,0.04,1.354,0.187,1.671,0.31c0.42,0.163,0.72,0.358,1.035,0.673 c0.315,0.315,0.51,0.615,0.673,1.035c0.123,0.317,0.27,0.794,0.31,1.671c0.043,0.949,0.052,1.234,0.052,3.637 s-0.009,2.688-0.052,3.637c-0.04,0.877-0.187,1.354-0.31,1.671c-0.163,0.42-0.358,0.72-0.673,1.035 c-0.315,0.315-0.615,0.51-1.035,0.673c-0.317,0.123-0.794,0.27-1.671,0.31c-0.949,0.043-1.233,0.052-3.637,0.052 s-2.688-0.009-3.637-0.052c-0.877-0.04-1.354-0.187-1.671-0.31c-0.42-0.163-0.72-0.358-1.035-0.673 c-0.315-0.315-0.51-0.615-0.673-1.035c-0.123-0.317-0.27-0.794-0.31-1.671C4.631,14.688,4.622,14.403,4.622,12 s0.009-2.688,0.052-3.637c0.04-0.877,0.187-1.354,0.31-1.671c0.163-0.42,0.358-0.72,0.673-1.035 c0.315-0.315,0.615-0.51,1.035-0.673c0.317-0.123,0.794-0.27,1.671-0.31C9.312,4.631,9.597,4.622,12,4.622 M12,3 C9.556,3,9.249,3.01,8.289,3.054C7.331,3.098,6.677,3.25,6.105,3.472C5.513,3.702,5.011,4.01,4.511,4.511 c-0.5,0.5-0.808,1.002-1.038,1.594C3.25,6.677,3.098,7.331,3.054,8.289C3.01,9.249,3,9.556,3,12c0,2.444,0.01,2.751,0.054,3.711 c0.044,0.958,0.196,1.612,0.418,2.185c0.23,0.592,0.538,1.094,1.038,1.594c0.5,0.5,1.002,0.808,1.594,1.038 c0.572,0.222,1.227,0.375,2.185,0.418C9.249,20.99,9.556,21,12,21s2.751-0.01,3.711-0.054c0.958-0.044,1.612-0.196,2.185-0.418 c0.592-0.23,1.094-0.538,1.594-1.038c0.5-0.5,0.808-1.002,1.038-1.594c0.222-0.572,0.375-1.227,0.418-2.185 C20.99,14.751,21,14.444,21,12s-0.01-2.751-0.054-3.711c-0.044-0.958-0.196-1.612-0.418-2.185c-0.23-0.592-0.538-1.094-1.038-1.594 c-0.5-0.5-1.002-0.808-1.594-1.038c-0.572-0.222-1.227-0.375-2.185-0.418C14.751,3.01,14.444,3,12,3L12,3z M12,7.378 c-2.552,0-4.622,2.069-4.622,4.622S9.448,16.622,12,16.622s4.622-2.069,4.622-4.622S14.552,7.378,12,7.378z M12,15 c-1.657,0-3-1.343-3-3s1.343-3,3-3s3,1.343,3,3S13.657,15,12,15z M16.804,6.116c-0.596,0-1.08,0.484-1.08,1.08 s0.484,1.08,1.08,1.08c0.596,0,1.08-0.484,1.08-1.08S17.401,6.116,16.804,6.116z\"></path></svg><span class=\"wp-block-social-link-label screen-reader-text\">Instagram</span></a></li></ul>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:82:\"Centered footer with the sentence \"Proudly powered by WordPress\" and social links.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:25:\"core/group,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1495:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"right\":\"var:preset|spacing|50\",\"bottom\":\"var:preset|spacing|60\",\"left\":\"var:preset|spacing|50\",\"top\":\"var:preset|spacing|60\"},\"blockGap\":\"var:preset|spacing|40\",\"margin\":{\"top\":\"0\",\"bottom\":\"0\"}},\"dimensions\":{\"minHeight\":\"30vh\"}},\"textColor\":\"contrast\",\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"justifyContent\":\"center\",\"verticalAlignment\":\"center\"}} -->\n<div class=\"wp-block-group alignfull has-contrast-color has-text-color\" style=\"min-height:30vh;margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--60);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--50)\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"24px\"}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"center\"} -->\n<p class=\"has-text-align-center\">Proudly powered by <a href=\"https://wordpress.org\">WordPress</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:social-links {\"size\":\"has-small-icon-size\",\"style\":{\"spacing\":{\"blockGap\":{\"top\":\"8px\",\"left\":\"8px\"}}},\"className\":\"is-style-logos-only\",\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\"}} -->\n<ul class=\"wp-block-social-links has-small-icon-size is-style-logos-only\"><!-- wp:social-link {\"url\":\"#\",\"service\":\"twitter\"} /-->\n\n<!-- wp:social-link {\"url\":\"#\",\"service\":\"instagram\"} /--></ul>\n<!-- /wp:social-links --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:34;O:8:\"stdClass\":7:{s:2:\"id\";i:229127;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:47:\"Footer with search, site title, and credit line\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3287:\"\n<div class=\"wp-block-group alignfull has-background is-layout-constrained wp-container-core-group-is-layout-6cf33c04 wp-block-group-is-layout-constrained\" style=\"background-color:#00000008;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--40)\">\n<div class=\"wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-b572c875 wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group wp-container-content-9cfa9a5a is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-b4f291b5 wp-block-group-is-layout-constrained\">\n<p class=\"has-text-align-left wp-block-paragraph\" style=\"font-size:0.9rem;font-style:normal;font-weight:600;letter-spacing:1px;text-transform:uppercase\">Search</p>\n\n\n<form role=\"search\" method=\"get\" action=\"https://wordpress.org/patterns/\" class=\"wp-block-search__button-outside wp-block-search__icon-button wp-block-search\" ><label class=\"wp-block-search__label screen-reader-text\" for=\"wp-block-search__input-21\" >Search</label><div class=\"wp-block-search__inside-wrapper\"  style=\"width: 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><input class=\"wp-block-search__input\" id=\"wp-block-search__input-21\" placeholder=\"\" value=\"\" type=\"search\" name=\"s\" required  style=\"border-width: 1px\"/><button aria-label=\"Search\" class=\"wp-block-search__button has-icon wp-element-button\" type=\"submit\"  style=\"border-width: 1px\"><svg class=\"search-icon\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\">\n					<path d=\"M13 5c-3.3 0-6 2.7-6 6 0 1.4.5 2.7 1.3 3.7l-3.8 3.8 1.1 1.1 3.8-3.8c1 .8 2.3 1.3 3.7 1.3 3.3 0 6-2.7 6-6S16.3 5 13 5zm0 10.5c-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5-2 4.5-4.5 4.5z\"></path>\n				</svg></button></div></form></div>\n\n\n\n<div class=\"wp-block-group is-content-justification-right is-nowrap is-layout-flex wp-container-core-group-is-layout-8f3b73a3 wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-bd946717 wp-block-group-is-layout-flex\">\n<p class=\"has-text-align-left wp-block-paragraph\" style=\"font-size:0.9rem;font-style:normal;font-weight:600;letter-spacing:1px;text-transform:uppercase\">Social</p>\n\n\n\n<div class=\"wp-block-group has-small-font-size is-vertical is-content-justification-left is-layout-flex wp-container-core-group-is-layout-53054535 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\"><a href=\"#\">Facebook</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"#\">Instagram</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"#\">Twitter</a></p>\n</div>\n</div>\n</div>\n</div>\n\n\n\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-eb8a1b9b wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-layout-flex wp-block-group-is-layout-flex\"><h1 class=\"wp-block-site-title has-small-font-size\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1></div>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"> Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:88:\"Footer with search field and site title on the left, and small credit line on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:65:\"core/group,core/paragraph,core/search,core/site-title,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:3254:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"right\":\"var:preset|spacing|40\",\"left\":\"var:preset|spacing|40\",\"top\":\"var:preset|spacing|50\",\"bottom\":\"var:preset|spacing|50\"}},\"color\":{\"background\":\"#00000008\"}},\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group alignfull has-background\" style=\"background-color:#00000008;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--40)\"><!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"blockGap\":\"var:preset|spacing|60\"}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"wrap\",\"justifyContent\":\"space-between\",\"verticalAlignment\":\"top\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:group {\"style\":{\"layout\":{\"selfStretch\":\"fill\",\"flexSize\":null}},\"layout\":{\"type\":\"constrained\",\"justifyContent\":\"left\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"left\",\"style\":{\"typography\":{\"textTransform\":\"uppercase\",\"fontSize\":\"0.9rem\",\"letterSpacing\":\"1px\",\"fontStyle\":\"normal\",\"fontWeight\":\"600\"}}} -->\n<p class=\"has-text-align-left\" style=\"font-size:0.9rem;font-style:normal;font-weight:600;letter-spacing:1px;text-transform:uppercase\">Search</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:search {\"label\":\"Search\",\"showLabel\":false,\"width\":100,\"widthUnit\":\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\",\"buttonText\":\"Search\",\"buttonUseIcon\":true,\"style\":{\"border\":{\"width\":\"1px\"}}} /--></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"style\":{\"spacing\":[]},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\",\"justifyContent\":\"right\",\"verticalAlignment\":\"top\"}} -->\n<div class=\"wp-block-group\"><!-- wp:group {\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"left\",\"style\":{\"typography\":{\"textTransform\":\"uppercase\",\"fontSize\":\"0.9rem\",\"letterSpacing\":\"1px\",\"fontStyle\":\"normal\",\"fontWeight\":\"600\"}}} -->\n<p class=\"has-text-align-left\" style=\"font-size:0.9rem;font-style:normal;font-weight:600;letter-spacing:1px;text-transform:uppercase\">Social</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"8px\"}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"justifyContent\":\"left\"},\"fontSize\":\"small\"} -->\n<div class=\"wp-block-group has-small-font-size\"><!-- wp:paragraph -->\n<p><a href=\"#\">Facebook</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"#\">Instagram</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"#\">Twitter</a></p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\n\n<!-- wp:spacer {\"height\":\"48px\"} -->\n<div style=\"height:48px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:group {\"align\":\"wide\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\",\"flexWrap\":\"wrap\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:group {\"layout\":{\"type\":\"flex\"}} -->\n<div class=\"wp-block-group\"><!-- wp:site-title {\"fontSize\":\"small\"} /--></div>\n<!-- /wp:group -->\n\n<!-- wp:paragraph {\"fontSize\":\"small\"} -->\n<p class=\"has-small-font-size\"> Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:35;O:8:\"stdClass\":7:{s:2:\"id\";i:229131;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:38:\"Footer with site title and credit line\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:913:\"\n<div class=\"wp-block-group alignfull has-background-color is-layout-constrained wp-container-core-group-is-layout-889d818a wp-block-group-is-layout-constrained\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-eb8a1b9b wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-layout-flex wp-block-group-is-layout-flex\"><h1 class=\"wp-block-site-title has-small-font-size\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1></div>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"> Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:64:\"Footer with site title on the left and credit line on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:41:\"core/group,core/paragraph,core/site-title\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1095:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|40\",\"right\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|40\",\"left\":\"var:preset|spacing|30\"},\"margin\":{\"top\":\"0\",\"bottom\":\"0\"}}},\"className\":\"has-background-color\",\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group alignfull has-background-color\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:group {\"align\":\"wide\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\",\"flexWrap\":\"wrap\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:group {\"layout\":{\"type\":\"flex\"}} -->\n<div class=\"wp-block-group\"><!-- wp:site-title {\"fontSize\":\"small\"} /--></div>\n<!-- /wp:group -->\n\n<!-- wp:paragraph {\"fontSize\":\"small\"} -->\n<p class=\"has-small-font-size\"> Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:36;O:8:\"stdClass\":7:{s:2:\"id\";i:229135;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:38:\"Footer with navigation and credit line\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3554:\"\n<div class=\"wp-block-group alignfull has-background-color is-layout-constrained wp-container-core-group-is-layout-889d818a wp-block-group-is-layout-constrained\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-eb8a1b9b wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-layout-flex wp-block-group-is-layout-flex\"><nav class=\"has-small-font-size is-responsive items-justified-left wp-block-navigation is-content-justification-left is-layout-flex wp-container-core-navigation-is-layout-e1d7bd4a wp-block-navigation-is-layout-flex\" aria-label=\" 11\" \n		 data-wp-interactive=\"core/navigation\" data-wp-context=\'{\"overlayOpenedBy\":{\"click\":false,\"hover\":false,\"focus\":false},\"type\":\"overlay\",\"roleAttribute\":\"\",\"ariaLabel\":\"Menu\"}\'><button aria-haspopup=\"dialog\" aria-label=\"Abrir menu\" class=\"wp-block-navigation__responsive-container-open\" \n				data-wp-on--click=\"actions.openMenuOnClick\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n			><svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 7.5h16v1.5H4z\"></path><path d=\"M4 15h16v1.5H4z\"></path></svg></button>\n				<div class=\"wp-block-navigation__responsive-container\"  id=\"modal-22\" \n				data-wp-class--has-modal-open=\"state.isMenuOpen\"\n				data-wp-class--is-menu-open=\"state.isMenuOpen\"\n				data-wp-watch=\"callbacks.initMenu\"\n				data-wp-on--keydown=\"actions.handleMenuKeydown\"\n				data-wp-on--focusout=\"actions.handleMenuFocusout\"\n				tabindex=\"-1\"\n			>\n					<div class=\"wp-block-navigation__responsive-close\" tabindex=\"-1\">\n						<div class=\"wp-block-navigation__responsive-dialog\" \n				data-wp-bind--aria-modal=\"state.ariaModal\"\n				data-wp-bind--aria-label=\"state.ariaLabel\"\n				data-wp-bind--role=\"state.roleAttribute\"\n			>\n							<button aria-label=\"Fechar menu\" class=\"wp-block-navigation__responsive-container-close\" \n				data-wp-on--click=\"actions.closeMenuOnClick\"\n			><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m13.06 12 6.47-6.47-1.06-1.06L12 10.94 5.53 4.47 4.47 5.53 10.94 12l-6.47 6.47 1.06 1.06L12 13.06l6.47 6.47 1.06-1.06L13.06 12Z\"></path></svg></button>\n							<div class=\"wp-block-navigation__responsive-container-content\" \n				data-wp-watch=\"callbacks.focusFirstElement\"\n			 id=\"modal-22-content\">\n								<ul class=\"wp-block-navigation__container has-small-font-size is-responsive items-justified-left wp-block-navigation\"><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Home</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">About</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Contact</span></a></li></ul>\n								\n							</div>\n						</div>\n					</div>\n				</div></nav></div>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"> Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:64:\"Footer with navigation on the left and credit line on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:41:\"core/group,core/navigation,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1174:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|40\",\"right\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|40\",\"left\":\"var:preset|spacing|30\"},\"margin\":{\"top\":\"0\",\"bottom\":\"0\"}}},\"className\":\"has-background-color\",\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group alignfull has-background-color\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:group {\"align\":\"wide\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\",\"flexWrap\":\"wrap\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:group {\"layout\":{\"type\":\"flex\"}} -->\n<div class=\"wp-block-group\"><!-- wp:navigation {\"layout\":{\"type\":\"flex\",\"setCascadingProperties\":true,\"justifyContent\":\"left\"},\"fontSize\":\"small\"} /--></div>\n<!-- /wp:group -->\n\n<!-- wp:paragraph {\"fontSize\":\"small\"} -->\n<p class=\"has-small-font-size\"> Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:37;O:8:\"stdClass\":7:{s:2:\"id\";i:229139;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:56:\"Fullwidth footer with background color and three columns\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3125:\"\n<div class=\"wp-block-group alignfull has-background-color has-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-16 is-vertical is-content-justification-stretch is-layout-flex wp-container-core-group-is-layout-8f544b26 wp-block-group-is-layout-flex\" style=\"min-height:40vh;margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--60);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--40)\">\n<div class=\"wp-block-columns alignwide has-small-font-size is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-align-center wp-block-paragraph\">Location</p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">2020 Lomita Blvd,&nbsp;<br>Torrance, CA 90101<br>United States</p>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-align-center wp-block-paragraph\">Pages</p>\n\n\n<nav class=\"has-small-font-size items-justified-center is-vertical no-wrap wp-block-navigation is-content-justification-center is-nowrap is-layout-flex wp-container-core-navigation-is-layout-f78a169d wp-block-navigation-is-layout-flex\" aria-label=\" 12\"><ul class=\"wp-block-navigation__container has-small-font-size items-justified-center is-vertical no-wrap wp-block-navigation\"><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Home</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">About</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Contact</span></a></li></ul></nav>\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-align-center wp-block-paragraph\">Follow us</p>\n\n\n\n<div class=\"wp-block-group is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-36971928 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\"><a href=\"#\">Facebook</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"#\">Instagram</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"#\">Twitter</a></p>\n</div>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n</div>\n\n\n\n<div class=\"wp-block-group alignwide is-content-justification-center is-layout-flex wp-container-core-group-is-layout-5bbf7c30 wp-block-group-is-layout-flex\">\n<p class=\"has-text-align-center has-small-font-size wp-block-paragraph\"> Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:57:\"Text-only footer with background color and three columns.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:78:\"core/column,core/columns,core/group,core/navigation,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:3225:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"elements\":{\"link\":{\"color\":{\"text\":\"var:preset|color|white\"}}},\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|60\",\"right\":\"var:preset|spacing|40\",\"bottom\":\"var:preset|spacing|60\",\"left\":\"var:preset|spacing|40\"},\"margin\":{\"top\":\"0\",\"bottom\":\"0\"},\"blockGap\":\"var:preset|spacing|30\"},\"dimensions\":{\"minHeight\":\"40vh\"}},\"backgroundColor\":\"black\",\"textColor\":\"white\",\"className\":\"has-background-color\",\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"justifyContent\":\"stretch\",\"verticalAlignment\":\"center\"}} -->\n<div class=\"wp-block-group alignfull has-background-color has-white-color has-black-background-color has-text-color has-background has-link-color\" style=\"min-height:40vh;margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--60);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--40)\"><!-- wp:columns {\"align\":\"wide\",\"fontSize\":\"small\"} -->\n<div class=\"wp-block-columns alignwide has-small-font-size\"><!-- wp:column -->\n<div class=\"wp-block-column\"><!-- wp:paragraph {\"align\":\"center\"} -->\n<p class=\"has-text-align-center\">Location</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"center\"} -->\n<p class=\"has-text-align-center\">2020 Lomita Blvd,&nbsp;<br>Torrance, CA 90101<br>United States</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:spacer {\"height\":\"24px\"} -->\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:column -->\n\n<!-- wp:column -->\n<div class=\"wp-block-column\"><!-- wp:paragraph {\"align\":\"center\"} -->\n<p class=\"has-text-align-center\">Pages</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:navigation {\"overlayMenu\":\"never\",\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"justifyContent\":\"center\",\"flexWrap\":\"nowrap\"},\"style\":{\"spacing\":{\"blockGap\":\"8px\"}},\"fontSize\":\"small\"} /-->\n\n<!-- wp:spacer {\"height\":\"24px\"} -->\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:column -->\n\n<!-- wp:column -->\n<div class=\"wp-block-column\"><!-- wp:paragraph {\"align\":\"center\"} -->\n<p class=\"has-text-align-center\">Follow us</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"8px\"}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"justifyContent\":\"center\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph -->\n<p><a href=\"#\">Facebook</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"#\">Instagram</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"#\">Twitter</a></p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group -->\n\n<!-- wp:spacer {\"height\":\"24px\"} -->\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\n\n<!-- wp:group {\"align\":\"wide\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"center\",\"flexWrap\":\"wrap\"}} -->\n<div class=\"wp-block-group alignwide\"><!-- wp:paragraph {\"align\":\"center\",\"fontSize\":\"small\"} -->\n<p class=\"has-text-align-center has-small-font-size\"> Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:38;O:8:\"stdClass\":7:{s:2:\"id\";i:229143;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:33:\"Centered footer with social links\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4173:\"\n<div class=\"wp-block-group alignfull has-contrast-color has-text-color is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-bd7dfa5a wp-block-group-is-layout-flex\" style=\"min-height:40vh;margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--60);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--50)\"><div style=\"margin-bottom:6px\" class=\"is-default-size aligncenter wp-block-site-logo\"><span class=\"custom-logo-link\"><img decoding=\"async\" src=\"https://s.w.org/images/wmark.png\" class=\"custom-logo\" alt=\"Logo do site\"></span></div>\n\n\n<p class=\"has-text-align-center has-medium-font-size wp-block-paragraph\">Proudly powered by <a href=\"https://wordpress.org\">WordPress</a></p>\n\n\n\n<ul class=\"wp-block-social-links has-normal-icon-size is-style-logos-only is-nowrap is-layout-flex wp-container-core-social-links-is-layout-0b9dcabe wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-facebook wp-block-social-link\"><a href=\"#\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z\"></path></svg><span class=\"wp-block-social-link-label screen-reader-text\">Facebook</span></a></li>\n\n<li class=\"wp-social-link wp-social-link-twitter wp-block-social-link\"><a href=\"#\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M22.23,5.924c-0.736,0.326-1.527,0.547-2.357,0.646c0.847-0.508,1.498-1.312,1.804-2.27 c-0.793,0.47-1.671,0.812-2.606,0.996C18.324,4.498,17.257,4,16.077,4c-2.266,0-4.103,1.837-4.103,4.103 c0,0.322,0.036,0.635,0.106,0.935C8.67,8.867,5.647,7.234,3.623,4.751C3.27,5.357,3.067,6.062,3.067,6.814 c0,1.424,0.724,2.679,1.825,3.415c-0.673-0.021-1.305-0.206-1.859-0.513c0,0.017,0,0.034,0,0.052c0,1.988,1.414,3.647,3.292,4.023 c-0.344,0.094-0.707,0.144-1.081,0.144c-0.264,0-0.521-0.026-0.772-0.074c0.522,1.63,2.038,2.816,3.833,2.85 c-1.404,1.1-3.174,1.756-5.096,1.756c-0.331,0-0.658-0.019-0.979-0.057c1.816,1.164,3.973,1.843,6.29,1.843 c7.547,0,11.675-6.252,11.675-11.675c0-0.178-0.004-0.355-0.012-0.531C20.985,7.47,21.68,6.747,22.23,5.924z\"></path></svg><span class=\"wp-block-social-link-label screen-reader-text\">Twitter</span></a></li>\n\n<li class=\"wp-social-link wp-social-link-wordpress wp-block-social-link\"><a href=\"#\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12.158,12.786L9.46,20.625c0.806,0.237,1.657,0.366,2.54,0.366c1.047,0,2.051-0.181,2.986-0.51 c-0.024-0.038-0.046-0.079-0.065-0.124L12.158,12.786z M3.009,12c0,3.559,2.068,6.634,5.067,8.092L3.788,8.341 C3.289,9.459,3.009,10.696,3.009,12z M18.069,11.546c0-1.112-0.399-1.881-0.741-2.48c-0.456-0.741-0.883-1.368-0.883-2.109 c0-0.826,0.627-1.596,1.51-1.596c0.04,0,0.078,0.005,0.116,0.007C16.472,3.904,14.34,3.009,12,3.009 c-3.141,0-5.904,1.612-7.512,4.052c0.211,0.007,0.41,0.011,0.579,0.011c0.94,0,2.396-0.114,2.396-0.114 C7.947,6.93,8.004,7.642,7.52,7.699c0,0-0.487,0.057-1.029,0.085l3.274,9.739l1.968-5.901l-1.401-3.838 C9.848,7.756,9.389,7.699,9.389,7.699C8.904,7.67,8.961,6.93,9.446,6.958c0,0,1.484,0.114,2.368,0.114 c0.94,0,2.397-0.114,2.397-0.114c0.485-0.028,0.542,0.684,0.057,0.741c0,0-0.488,0.057-1.029,0.085l3.249,9.665l0.897-2.996 C17.841,13.284,18.069,12.316,18.069,11.546z M19.889,7.686c0.039,0.286,0.06,0.593,0.06,0.924c0,0.912-0.171,1.938-0.684,3.22 l-2.746,7.94c2.673-1.558,4.47-4.454,4.47-7.771C20.991,10.436,20.591,8.967,19.889,7.686z M12,22C6.486,22,2,17.514,2,12 C2,6.486,6.486,2,12,2c5.514,0,10,4.486,10,10C22,17.514,17.514,22,12,22z\"></path></svg><span class=\"wp-block-social-link-label screen-reader-text\">WordPress</span></a></li></ul>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:71:\"Footer with centered site title, tagline, social links and credit line.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:75:\"core/group,core/paragraph,core/site-logo,core/social-link,core/social-links\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1532:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"right\":\"var:preset|spacing|50\",\"bottom\":\"var:preset|spacing|60\",\"left\":\"var:preset|spacing|50\",\"top\":\"var:preset|spacing|60\"},\"blockGap\":\"var:preset|spacing|40\",\"margin\":{\"top\":\"0\",\"bottom\":\"0\"}},\"dimensions\":{\"minHeight\":\"40vh\"}},\"textColor\":\"contrast\",\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"justifyContent\":\"center\",\"verticalAlignment\":\"center\"}} -->\n<div class=\"wp-block-group alignfull has-contrast-color has-text-color\" style=\"min-height:40vh;margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--60);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--50)\"><!-- wp:site-logo {\"align\":\"center\",\"style\":{\"spacing\":{\"margin\":{\"bottom\":\"6px\"}}}} /-->\n\n<!-- wp:paragraph {\"align\":\"center\",\"fontSize\":\"medium\"} -->\n<p class=\"has-text-align-center has-medium-font-size\">Proudly powered by <a href=\"https://wordpress.org\">WordPress</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:social-links {\"size\":\"has-normal-icon-size\",\"style\":{\"spacing\":{\"blockGap\":{\"top\":\"12px\",\"left\":\"12px\"}}},\"className\":\"is-style-logos-only\",\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\"}} -->\n<ul class=\"wp-block-social-links has-normal-icon-size is-style-logos-only\"><!-- wp:social-link {\"url\":\"#\",\"service\":\"facebook\"} /-->\n\n<!-- wp:social-link {\"url\":\"#\",\"service\":\"twitter\"} /-->\n\n<!-- wp:social-link {\"url\":\"#\",\"service\":\"wordpress\"} /--></ul>\n<!-- /wp:social-links --></div>\n<!-- /wp:group -->\";}i:39;O:8:\"stdClass\":7:{s:2:\"id\";i:229147;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:52:\"Fullwidth footer with navigation, credit, and social\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4683:\"\n<div class=\"wp-block-group alignfull has-background-color is-layout-flow wp-block-group-is-layout-flow\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group alignfull has-small-font-size is-content-justification-space-between is-nowrap is-layout-flex wp-container-core-group-is-layout-477afd24 wp-block-group-is-layout-flex\"><h1 class=\"wp-block-site-title has-small-font-size wp-container-content-b0223bd5\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1>\n\n\n<div class=\"wp-block-group wp-container-content-9cfa9a5a is-vertical is-content-justification-center is-layout-flex wp-container-core-group-is-layout-7c09a6da wp-block-group-is-layout-flex\">\n<p class=\"has-text-align-center has-small-font-size wp-block-paragraph\"> Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n</div>\n\n\n\n<ul class=\"wp-block-social-links has-small-icon-size is-style-logos-only wp-container-content-b0223bd5 is-content-justification-right is-nowrap is-layout-flex wp-container-core-social-links-is-layout-31c4c88e wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-twitter wp-block-social-link\"><a href=\"#\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M22.23,5.924c-0.736,0.326-1.527,0.547-2.357,0.646c0.847-0.508,1.498-1.312,1.804-2.27 c-0.793,0.47-1.671,0.812-2.606,0.996C18.324,4.498,17.257,4,16.077,4c-2.266,0-4.103,1.837-4.103,4.103 c0,0.322,0.036,0.635,0.106,0.935C8.67,8.867,5.647,7.234,3.623,4.751C3.27,5.357,3.067,6.062,3.067,6.814 c0,1.424,0.724,2.679,1.825,3.415c-0.673-0.021-1.305-0.206-1.859-0.513c0,0.017,0,0.034,0,0.052c0,1.988,1.414,3.647,3.292,4.023 c-0.344,0.094-0.707,0.144-1.081,0.144c-0.264,0-0.521-0.026-0.772-0.074c0.522,1.63,2.038,2.816,3.833,2.85 c-1.404,1.1-3.174,1.756-5.096,1.756c-0.331,0-0.658-0.019-0.979-0.057c1.816,1.164,3.973,1.843,6.29,1.843 c7.547,0,11.675-6.252,11.675-11.675c0-0.178-0.004-0.355-0.012-0.531C20.985,7.47,21.68,6.747,22.23,5.924z\"></path></svg><span class=\"wp-block-social-link-label screen-reader-text\">Twitter</span></a></li>\n\n<li class=\"wp-social-link wp-social-link-instagram wp-block-social-link\"><a href=\"#\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,4.622c2.403,0,2.688,0.009,3.637,0.052c0.877,0.04,1.354,0.187,1.671,0.31c0.42,0.163,0.72,0.358,1.035,0.673 c0.315,0.315,0.51,0.615,0.673,1.035c0.123,0.317,0.27,0.794,0.31,1.671c0.043,0.949,0.052,1.234,0.052,3.637 s-0.009,2.688-0.052,3.637c-0.04,0.877-0.187,1.354-0.31,1.671c-0.163,0.42-0.358,0.72-0.673,1.035 c-0.315,0.315-0.615,0.51-1.035,0.673c-0.317,0.123-0.794,0.27-1.671,0.31c-0.949,0.043-1.233,0.052-3.637,0.052 s-2.688-0.009-3.637-0.052c-0.877-0.04-1.354-0.187-1.671-0.31c-0.42-0.163-0.72-0.358-1.035-0.673 c-0.315-0.315-0.51-0.615-0.673-1.035c-0.123-0.317-0.27-0.794-0.31-1.671C4.631,14.688,4.622,14.403,4.622,12 s0.009-2.688,0.052-3.637c0.04-0.877,0.187-1.354,0.31-1.671c0.163-0.42,0.358-0.72,0.673-1.035 c0.315-0.315,0.615-0.51,1.035-0.673c0.317-0.123,0.794-0.27,1.671-0.31C9.312,4.631,9.597,4.622,12,4.622 M12,3 C9.556,3,9.249,3.01,8.289,3.054C7.331,3.098,6.677,3.25,6.105,3.472C5.513,3.702,5.011,4.01,4.511,4.511 c-0.5,0.5-0.808,1.002-1.038,1.594C3.25,6.677,3.098,7.331,3.054,8.289C3.01,9.249,3,9.556,3,12c0,2.444,0.01,2.751,0.054,3.711 c0.044,0.958,0.196,1.612,0.418,2.185c0.23,0.592,0.538,1.094,1.038,1.594c0.5,0.5,1.002,0.808,1.594,1.038 c0.572,0.222,1.227,0.375,2.185,0.418C9.249,20.99,9.556,21,12,21s2.751-0.01,3.711-0.054c0.958-0.044,1.612-0.196,2.185-0.418 c0.592-0.23,1.094-0.538,1.594-1.038c0.5-0.5,0.808-1.002,1.038-1.594c0.222-0.572,0.375-1.227,0.418-2.185 C20.99,14.751,21,14.444,21,12s-0.01-2.751-0.054-3.711c-0.044-0.958-0.196-1.612-0.418-2.185c-0.23-0.592-0.538-1.094-1.038-1.594 c-0.5-0.5-1.002-0.808-1.594-1.038c-0.572-0.222-1.227-0.375-2.185-0.418C14.751,3.01,14.444,3,12,3L12,3z M12,7.378 c-2.552,0-4.622,2.069-4.622,4.622S9.448,16.622,12,16.622s4.622-2.069,4.622-4.622S14.552,7.378,12,7.378z M12,15 c-1.657,0-3-1.343-3-3s1.343-3,3-3s3,1.343,3,3S13.657,15,12,15z M16.804,6.116c-0.596,0-1.08,0.484-1.08,1.08 s0.484,1.08,1.08,1.08c0.596,0,1.08-0.484,1.08-1.08S17.401,6.116,16.804,6.116z\"></path></svg><span class=\"wp-block-social-link-label screen-reader-text\">Instagram</span></a></li></ul>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:87:\"Footer with site title on the left, credit in the middle and social links on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:76:\"core/group,core/paragraph,core/site-title,core/social-link,core/social-links\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1869:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|50\",\"right\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|50\",\"left\":\"var:preset|spacing|30\"},\"margin\":{\"top\":\"0\",\"bottom\":\"0\"}}},\"className\":\"has-background-color\",\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group alignfull has-background-color\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"blockGap\":\"0\"}},\"layout\":{\"type\":\"flex\",\"justifyContent\":\"space-between\",\"flexWrap\":\"nowrap\"},\"fontSize\":\"small\"} -->\n<div class=\"wp-block-group alignfull has-small-font-size\"><!-- wp:site-title {\"style\":{\"layout\":{\"selfStretch\":\"fixed\",\"flexSize\":\"25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"}},\"fontSize\":\"small\"} /-->\n\n<!-- wp:group {\"style\":{\"layout\":{\"selfStretch\":\"fill\",\"flexSize\":null}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"justifyContent\":\"center\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"center\",\"fontSize\":\"small\"} -->\n<p class=\"has-text-align-center has-small-font-size\"> Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group -->\n\n<!-- wp:social-links {\"size\":\"has-small-icon-size\",\"style\":{\"spacing\":{\"blockGap\":{\"top\":\"0\",\"left\":\"12px\"}},\"layout\":{\"selfStretch\":\"fixed\",\"flexSize\":\"25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"}},\"className\":\"is-style-logos-only\",\"layout\":{\"type\":\"flex\",\"flexWrap\":\"nowrap\",\"justifyContent\":\"right\"}} -->\n<ul class=\"wp-block-social-links has-small-icon-size is-style-logos-only\"><!-- wp:social-link {\"url\":\"#\",\"service\":\"twitter\"} /-->\n\n<!-- wp:social-link {\"url\":\"#\",\"service\":\"instagram\"} /--></ul>\n<!-- /wp:social-links --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:40;O:8:\"stdClass\":7:{s:2:\"id\";i:229151;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:19:\"Left-aligned footer\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3048:\"\n<div class=\"wp-block-group alignfull is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-ea752118 wp-block-group-is-layout-flex\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--30)\">\n<div class=\"wp-block-group wp-container-content-9cfa9a5a is-vertical is-layout-flex wp-container-core-group-is-layout-79ad9e6d wp-block-group-is-layout-flex\"><h1 class=\"wp-block-site-title has-medium-font-size\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1>\n\n\n<p class=\"has-text-align-left wp-block-paragraph\">2020 Lomita Blvd,&nbsp;<br>Torrance, CA 90101<br>United States</p>\n\n\n\n<p class=\"has-text-align-left has-small-font-size wp-block-paragraph\">Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n\n\n\n<div class=\"wp-block-group is-content-justification-right is-layout-flex wp-container-core-group-is-layout-735f15fc wp-block-group-is-layout-flex\">\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-bd946717 wp-block-group-is-layout-flex\">\n<p class=\"has-text-align-left wp-block-paragraph\">Pages</p>\n\n\n<nav class=\"has-small-font-size items-justified-left is-vertical no-wrap wp-block-navigation is-content-justification-left is-nowrap is-layout-flex wp-container-core-navigation-is-layout-4d6072d6 wp-block-navigation-is-layout-flex\" aria-label=\" 13\"><ul class=\"wp-block-navigation__container has-small-font-size items-justified-left is-vertical no-wrap wp-block-navigation\"><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Home</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">About</span></a></li><li class=\"wp-block-navigation-item wp-block-navigation-link\"><a class=\"wp-block-navigation-item__content\"  href=\"#\"><span class=\"wp-block-navigation-item__label\">Contact</span></a></li></ul></nav>\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n\n\n\n<div class=\"wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-bd946717 wp-block-group-is-layout-flex\">\n<p class=\"has-text-align-left wp-block-paragraph\">Social</p>\n\n\n\n<div class=\"wp-block-group is-vertical is-content-justification-left is-layout-flex wp-container-core-group-is-layout-53054535 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\"><a href=\"#\">Facebook</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"#\">Instagram</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"#\">Twitter</a></p>\n</div>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:44:\"Left-aligned footer with just a credit line.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:69:\"core/group,core/navigation,core/paragraph,core/site-title,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2939:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"spacing\":{\"margin\":{\"top\":\"0\",\"bottom\":\"0\"},\"padding\":{\"top\":\"var:preset|spacing|50\",\"right\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|50\",\"left\":\"var:preset|spacing|30\"}}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"wrap\",\"justifyContent\":\"space-between\",\"verticalAlignment\":\"top\"}} -->\n<div class=\"wp-block-group alignfull\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:group {\"style\":{\"layout\":{\"selfStretch\":\"fill\",\"flexSize\":null}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"verticalAlignment\":\"top\"}} -->\n<div class=\"wp-block-group\"><!-- wp:site-title {\"fontSize\":\"medium\"} /-->\n\n<!-- wp:paragraph {\"align\":\"left\"} -->\n<p class=\"has-text-align-left\">2020 Lomita Blvd,&nbsp;<br>Torrance, CA 90101<br>United States</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"align\":\"left\",\"fontSize\":\"small\"} -->\n<p class=\"has-text-align-left has-small-font-size\">Proudly powered by <a rel=\"nofollow\" href=\"https://wordpress.org\">WordPress</a> </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:spacer {\"height\":\"24px\"} -->\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"var:preset|spacing|50\"}},\"layout\":{\"type\":\"flex\",\"flexWrap\":\"wrap\",\"justifyContent\":\"right\",\"verticalAlignment\":\"top\"}} -->\n<div class=\"wp-block-group\"><!-- wp:group {\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"left\"} -->\n<p class=\"has-text-align-left\">Pages</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:navigation {\"overlayMenu\":\"never\",\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"justifyContent\":\"left\",\"flexWrap\":\"nowrap\"},\"style\":{\"spacing\":{\"blockGap\":\"8px\"}},\"fontSize\":\"small\"} /-->\n\n<!-- wp:spacer {\"height\":\"24px\"} -->\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"align\":\"left\"} -->\n<p class=\"has-text-align-left\">Social</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"8px\"}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"justifyContent\":\"left\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph -->\n<p><a href=\"#\">Facebook</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"#\">Instagram</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"#\">Twitter</a></p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group -->\n\n<!-- wp:spacer {\"height\":\"24px\"} -->\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:41;O:8:\"stdClass\":7:{s:2:\"id\";i:201;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:32:\"Three columns with offset images\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1358:\"\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<figure class=\"wp-block-image size-large is-style-default\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/architecture-01.jpg\" alt=\"Close-up, abstract view of geometric architecture.\" /></figure>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<div style=\"height:500px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div style=\"height:150px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/architecture-02.jpg\" alt=\"Close-up, angled view of a window on a white building.\" /></figure>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:45{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<figure class=\"wp-block-image size-large is-style-default\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/architecture-03.jpg\" alt=\"Close-up of the corner of a white, geometric building with both sharp points and round corners.\" /></figure>\n\n\n\n<div style=\"height:285px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:33:\"Three columns with offset images.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:47:\"core/column,core/columns,core/image,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"gallery\";i:1;s:6:\"images\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1753:\"<!-- wp:columns {\"align\":\"wide\"} -->\n<div class=\"wp-block-columns alignwide\"><!-- wp:column {\"width\":\"25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"none\",\"className\":\"is-style-default\"} -->\n<figure class=\"wp-block-image size-large is-style-default\"><img src=\"https://s.w.org/images/core/5.8/architecture-01.jpg\" alt=\"Close-up, abstract view of geometric architecture.\" /></figure>\n<!-- /wp:image --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"width\":\"25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:spacer {\"height\":500} -->\n<div style=\"height:500px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:spacer {\"height\":150} -->\n<div style=\"height:150px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://s.w.org/images/core/5.8/architecture-02.jpg\" alt=\"Close-up, angled view of a window on a white building.\" /></figure>\n<!-- /wp:image --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"width\":\"45{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:45{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"none\",\"className\":\"is-style-default\"} -->\n<figure class=\"wp-block-image size-large is-style-default\"><img src=\"https://s.w.org/images/core/5.8/architecture-03.jpg\" alt=\"Close-up of the corner of a white, geometric building with both sharp points and round corners.\" /></figure>\n<!-- /wp:image -->\n\n<!-- wp:spacer {\"height\":285} -->\n<div style=\"height:285px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\";}i:42;O:8:\"stdClass\":7:{s:2:\"id\";i:199;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:34:\"Three columns with images and text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3680:\"\n<div class=\"wp-block-group alignfull has-background is-layout-flow wp-block-group-is-layout-flow\" style=\"background-color:#f5eac1;padding-top:6vw;padding-right:6vw;padding-bottom:6vw;padding-left:6vw\">\n<div class=\"wp-block-group is-vertical is-nowrap is-layout-flex wp-container-core-group-is-layout-f19201c6 wp-block-group-is-layout-flex\" style=\"padding-right:0;padding-left:0\">\n<h6 class=\"wp-block-heading has-text-color\" id=\"ecosystem\" style=\"color:#000000;font-size:16px\">ECOSYSTEM</h6>\n\n\n\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#000000;font-size:6vw;font-style:normal;font-weight:700;letter-spacing:0px;line-height:0.9;text-decoration:none;text-transform:none\">Positive growth.</p>\n</div>\n\n\n\n<div style=\"height:1vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-group alignwide is-vertical is-nowrap is-layout-flex wp-container-core-group-is-layout-493f451d wp-block-group-is-layout-flex\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-886db315 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.38{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#000000;font-size:17px\"><em>Nature</em>, in the common sense, refers to essences unchanged by man; space, the air, the river, the leaf.&nbsp;<em>Art</em>&nbsp;is applied to the mixture of his will with the same things, as in a house, a canal, a statue, a picture. </p>\n\n\n\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#000000;font-size:17px\">But his operations taken together are so insignificant, a little chipping, baking, patching, and washing, that in an impression so grand as that of the world on the human mind, they do not vary the result.</p>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<div style=\"height:2vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/outside-01.jpg\" alt=\"The sun setting through a dense forest.\" /></figure>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.62{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/outside-02.jpg\" alt=\"Wind turbines standing on a grassy plain, against a blue sky.\" /></figure>\n</div>\n</div>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-90cda669 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:69{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/outside-03.jpg\" alt=\"The sun shining over a ridge leading down into the shore. In the distance, a car drives down a road.\" /></figure>\n</div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<div style=\"height:2vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#000000;font-size:17px\">Undoubtedly we have no questions to ask which are unanswerable. We must trust the perfection of the creation so far, as to believe that whatever curiosity the order of things has awakened in our minds, the order of things can satisfy. Every man&#8217;s condition is a solution in hieroglyphic to those inquiries he would put.</p>\n</div>\n</div>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:77:\"Three columns with images and text, with vertical spacing for an offset look.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:86:\"core/column,core/columns,core/group,core/heading,core/image,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:4:{i:0;s:7:\"columns\";i:1;s:7:\"gallery\";i:2;s:6:\"images\";i:3;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:5124:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"color\":{\"background\":\"#f5eac1\"},\"spacing\":{\"padding\":{\"top\":\"6vw\",\"bottom\":\"6vw\",\"left\":\"6vw\",\"right\":\"6vw\"}}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group alignfull has-background\" style=\"background-color:#f5eac1;padding-top:6vw;padding-right:6vw;padding-bottom:6vw;padding-left:6vw\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"16px\",\"padding\":{\"right\":\"0\",\"left\":\"0\"}}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"flexWrap\":\"nowrap\"}} -->\n<div class=\"wp-block-group\" style=\"padding-right:0;padding-left:0\"><!-- wp:heading {\"level\":6,\"style\":{\"color\":{\"text\":\"#000000\"},\"typography\":{\"fontSize\":\"16px\"}},\"anchor\":\"ecosystem\"} -->\n<h6 class=\"wp-block-heading has-text-color\" id=\"ecosystem\" style=\"color:#000000;font-size:16px\">ECOSYSTEM</h6>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"style\":{\"typography\":{\"lineHeight\":\"0.9\",\"fontSize\":\"6vw\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"textTransform\":\"none\",\"textDecoration\":\"none\",\"letterSpacing\":\"0px\"},\"color\":{\"text\":\"#000000\"}}} -->\n<p class=\"has-text-color\" style=\"color:#000000;font-size:6vw;font-style:normal;font-weight:700;letter-spacing:0px;line-height:0.9;text-decoration:none;text-transform:none\">Positive growth.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group -->\n\n<!-- wp:spacer {\"height\":\"1vw\"} -->\n<div style=\"height:1vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"blockGap\":\"3vw\",\"padding\":{\"top\":\"0\",\"bottom\":\"0\",\"left\":\"0\",\"right\":\"0\"}}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"flexWrap\":\"nowrap\"}} -->\n<div class=\"wp-block-group alignwide\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\"><!-- wp:columns {\"align\":\"wide\",\"style\":{\"spacing\":{\"blockGap\":{\"top\":\"3vw\",\"left\":\"3vw\"}}}} -->\n<div class=\"wp-block-columns alignwide\"><!-- wp:column {\"width\":\"33.38{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:33.38{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:paragraph {\"style\":{\"color\":{\"text\":\"#000000\"},\"typography\":{\"fontSize\":\"17px\"}}} -->\n<p class=\"has-text-color\" style=\"color:#000000;font-size:17px\"><em>Nature</em>, in the common sense, refers to essences unchanged by man; space, the air, the river, the leaf.&nbsp;<em>Art</em>&nbsp;is applied to the mixture of his will with the same things, as in a house, a canal, a statue, a picture. </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"style\":{\"color\":{\"text\":\"#000000\"},\"typography\":{\"fontSize\":\"17px\"}}} -->\n<p class=\"has-text-color\" style=\"color:#000000;font-size:17px\">But his operations taken together are so insignificant, a little chipping, baking, patching, and washing, that in an impression so grand as that of the world on the human mind, they do not vary the result.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"width\":\"33{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:33{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:spacer {\"height\":\"2vw\"} -->\n<div style=\"height:2vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://s.w.org/images/core/5.8/outside-01.jpg\" alt=\"The sun setting through a dense forest.\" /></figure>\n<!-- /wp:image --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"width\":\"33.62{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:33.62{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://s.w.org/images/core/5.8/outside-02.jpg\" alt=\"Wind turbines standing on a grassy plain, against a blue sky.\" /></figure>\n<!-- /wp:image --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\n\n<!-- wp:columns {\"align\":\"wide\",\"style\":{\"spacing\":{\"blockGap\":{\"left\":\"3vw\"}}}} -->\n<div class=\"wp-block-columns alignwide\"><!-- wp:column {\"width\":\"69{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:69{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://s.w.org/images/core/5.8/outside-03.jpg\" alt=\"The sun shining over a ridge leading down into the shore. In the distance, a car drives down a road.\" /></figure>\n<!-- /wp:image --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"verticalAlignment\":\"center\",\"width\":\"33{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column is-vertically-aligned-center\" style=\"flex-basis:33{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:spacer {\"height\":\"2vw\"} -->\n<div style=\"height:2vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:paragraph {\"style\":{\"color\":{\"text\":\"#000000\"},\"typography\":{\"fontSize\":\"17px\"}}} -->\n<p class=\"has-text-color\" style=\"color:#000000;font-size:17px\">Undoubtedly we have no questions to ask which are unanswerable. We must trust the perfection of the creation so far, as to believe that whatever curiosity the order of things has awakened in our minds, the order of things can satisfy. Every man\'s condition is a solution in hieroglyphic to those inquiries he would put.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:43;O:8:\"stdClass\":7:{s:2:\"id\";i:197;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:39:\"Two columns of text with offset heading\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2353:\"\n<div class=\"wp-block-group alignfull has-background is-layout-flow wp-block-group-is-layout-flow\" style=\"background-color:#f2f0e9\">\n<div style=\"height:70px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#000000;font-size:30px;line-height:1.1\"><strong>Oceanic Inspiration</strong></p>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<hr class=\"wp-block-separator has-text-color has-background is-style-wide\" style=\"background-color:#000000;color:#000000\" />\n</div>\n</div>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"></div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-color has-extra-small-font-size wp-block-paragraph\" style=\"color:#000000\">Winding veils round their heads, the women walked on deck. They were now moving steadily down the river, passing the dark shapes of ships at anchor, and London was a swarm of lights with a pale yellow canopy drooping above it. There were the lights of the great theatres, the lights of the long streets, lights that indicated huge squares of domestic comfort, lights that hung high in air.</p>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"has-text-color has-extra-small-font-size wp-block-paragraph\" style=\"color:#000000\">No darkness would ever settle upon those lamps, as no darkness had settled upon them for hundreds of years. It seemed dreadful that the town should blaze for ever in the same spot; dreadful at least to people going away to adventure upon the sea, and beholding it as a circumscribed mound, eternally burnt, eternally scarred. From the deck of the ship the great city appeared a crouched and cowardly figure, a sedentary miser.</p>\n</div>\n</div>\n\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:43:\"Two columns of text with an offset heading.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:77:\"core/column,core/columns,core/group,core/paragraph,core/separator,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"columns\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2837:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"color\":{\"background\":\"#f2f0e9\"}}} -->\n<div class=\"wp-block-group alignfull has-background\" style=\"background-color:#f2f0e9\"><!-- wp:spacer {\"height\":70} -->\n<div style=\"height:70px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:columns {\"verticalAlignment\":\"center\",\"align\":\"wide\"} -->\n<div class=\"wp-block-columns alignwide are-vertically-aligned-center\"><!-- wp:column {\"width\":\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:paragraph {\"style\":{\"typography\":{\"lineHeight\":\"1.1\",\"fontSize\":\"30px\"},\"color\":{\"text\":\"#000000\"}}} -->\n<p class=\"has-text-color\" style=\"color:#000000;font-size:30px;line-height:1.1\"><strong>Oceanic Inspiration</strong></p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"width\":\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:separator {\"customColor\":\"#000000\",\"className\":\"is-style-wide\"} -->\n<hr class=\"wp-block-separator has-text-color has-background is-style-wide\" style=\"background-color:#000000;color:#000000\" />\n<!-- /wp:separator --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\n\n<!-- wp:columns {\"align\":\"wide\"} -->\n<div class=\"wp-block-columns alignwide\"><!-- wp:column -->\n<div class=\"wp-block-column\"></div>\n<!-- /wp:column -->\n\n<!-- wp:column -->\n<div class=\"wp-block-column\"><!-- wp:paragraph {\"style\":{\"color\":{\"text\":\"#000000\"}},\"fontSize\":\"extra-small\"} -->\n<p class=\"has-text-color has-extra-small-font-size\" style=\"color:#000000\">Winding veils round their heads, the women walked on deck. They were now moving steadily down the river, passing the dark shapes of ships at anchor, and London was a swarm of lights with a pale yellow canopy drooping above it. There were the lights of the great theatres, the lights of the long streets, lights that indicated huge squares of domestic comfort, lights that hung high in air.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column -->\n\n<!-- wp:column -->\n<div class=\"wp-block-column\"><!-- wp:paragraph {\"style\":{\"color\":{\"text\":\"#000000\"}},\"fontSize\":\"extra-small\"} -->\n<p class=\"has-text-color has-extra-small-font-size\" style=\"color:#000000\">No darkness would ever settle upon those lamps, as no darkness had settled upon them for hundreds of years. It seemed dreadful that the town should blaze for ever in the same spot; dreadful at least to people going away to adventure upon the sea, and beholding it as a circumscribed mound, eternally burnt, eternally scarred. From the deck of the ship the great city appeared a crouched and cowardly figure, a sedentary miser.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\n\n<!-- wp:spacer {\"height\":40} -->\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:group -->\";}i:44;O:8:\"stdClass\":7:{s:2:\"id\";i:196;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:41:\"Media and text in a full height container\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1484:\"\n<div class=\"wp-block-cover alignfull is-light\" style=\"min-height:100vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#ffffff\"></span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile is-vertically-aligned-center is-image-fill\" style=\"grid-template-columns:56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} auto\"><figure class=\"wp-block-media-text__media\" style=\"background-image:url(https://s.w.org/images/core/5.8/soil.jpg);background-position:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/soil.jpg\" alt=\"Close-up of dried, cracked earth.\" /></figure><div class=\"wp-block-media-text__content\">\n<h2 class=\"wp-block-heading has-text-color\" style=\"color:#000000;font-size:32px\"><strong>What&#8217;s the problem?</strong></h2>\n\n\n\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#000000;font-size:17px\">Trees are more important today than ever before. More than 10,000 products are reportedly made from trees. Through chemistry, the humble woodpile is yielding chemicals, plastics and fabrics that were beyond comprehension when an axe first felled a Texas tree.</p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-fill\"><a class=\"wp-block-button__link wp-element-button\">Learn more</a></div>\n</div>\n</div></div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:77:\"Media and text block with image to the left and text and button to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:79:\"core/button,core/buttons,core/cover,core/heading,core/media-text,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2015:\"<!-- wp:cover {\"customOverlayColor\":\"#ffffff\",\"minHeight\":100,\"minHeightUnit\":\"vh\",\"contentPosition\":\"center center\",\"isDark\":false,\"align\":\"full\"} -->\n<div class=\"wp-block-cover alignfull is-light\" style=\"min-height:100vh\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-100 has-background-dim\" style=\"background-color:#ffffff\"></span><div class=\"wp-block-cover__inner-container\"><!-- wp:media-text {\"mediaLink\":\"https://s.w.org/images/core/5.8/soil.jpg\",\"mediaType\":\"image\",\"mediaWidth\":56,\"verticalAlignment\":\"center\",\"imageFill\":true} -->\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile is-vertically-aligned-center is-image-fill\" style=\"grid-template-columns:56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} auto\"><figure class=\"wp-block-media-text__media\" style=\"background-image:url(https://s.w.org/images/core/5.8/soil.jpg);background-position:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><img src=\"https://s.w.org/images/core/5.8/soil.jpg\" alt=\"Close-up of dried, cracked earth.\" /></figure><div class=\"wp-block-media-text__content\"><!-- wp:heading {\"style\":{\"typography\":{\"fontSize\":\"32px\"},\"color\":{\"text\":\"#000000\"}}} -->\n<h2 class=\"wp-block-heading has-text-color\" style=\"color:#000000;font-size:32px\"><strong>What\'s the problem?</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"style\":{\"typography\":{\"fontSize\":\"17px\"},\"color\":{\"text\":\"#000000\"}}} -->\n<p class=\"has-text-color\" style=\"color:#000000;font-size:17px\">Trees are more important today than ever before. More than 10,000 products are reportedly made from trees. Through chemistry, the humble woodpile is yielding chemicals, plastics and fabrics that were beyond comprehension when an axe first felled a Texas tree.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:buttons -->\n<div class=\"wp-block-buttons\"><!-- wp:button {\"className\":\"is-style-fill\"} -->\n<div class=\"wp-block-button is-style-fill\"><a class=\"wp-block-button__link wp-element-button\">Learn more</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div></div>\n<!-- /wp:media-text --></div></div>\n<!-- /wp:cover -->\";}i:45;O:8:\"stdClass\":7:{s:2:\"id\";i:195;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:38:\"Media and text with image on the right\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:765:\"\n<div class=\"wp-block-media-text alignfull has-media-on-the-right is-stacked-on-mobile is-vertically-aligned-center is-style-default\" style=\"grid-template-columns:auto 56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div class=\"wp-block-media-text__content\">\n<h2 class=\"wp-block-heading has-text-color\" style=\"color:#000000\"><strong>Shore with Blue Sea</strong></h2>\n\n\n\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#636363;font-size:17px;line-height:1.1\">Eleanor Harris&nbsp;(American, 1901-1942)</p>\n</div><figure class=\"wp-block-media-text__media\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/art-02.jpg\" alt=\"A green and brown rural landscape leading into a bright blue ocean and slightly cloudy sky, done in oil paints.\" /></figure></div>\n\n\n\n<p class=\"wp-block-paragraph\"></p>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:66:\"Media and text block with image to the right and text to the left.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:43:\"core/heading,core/media-text,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1155:\"<!-- wp:media-text {\"align\":\"full\",\"mediaPosition\":\"right\",\"mediaLink\":\"#\",\"mediaType\":\"image\",\"mediaWidth\":56,\"verticalAlignment\":\"center\",\"className\":\"is-style-default\"} -->\n<div class=\"wp-block-media-text alignfull has-media-on-the-right is-stacked-on-mobile is-vertically-aligned-center is-style-default\" style=\"grid-template-columns:auto 56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div class=\"wp-block-media-text__content\"><!-- wp:heading {\"style\":{\"color\":{\"text\":\"#000000\"}}} -->\n<h2 class=\"wp-block-heading has-text-color\" style=\"color:#000000\"><strong>Shore with Blue Sea</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"style\":{\"typography\":{\"lineHeight\":\"1.1\",\"fontSize\":\"17px\"},\"color\":{\"text\":\"#636363\"}}} -->\n<p class=\"has-text-color\" style=\"color:#636363;font-size:17px;line-height:1.1\">Eleanor Harris&nbsp;(American, 1901-1942)</p>\n<!-- /wp:paragraph --></div><figure class=\"wp-block-media-text__media\"><img src=\"https://s.w.org/images/core/5.8/art-02.jpg\" alt=\"A green and brown rural landscape leading into a bright blue ocean and slightly cloudy sky, done in oil paints.\" /></figure></div>\n<!-- /wp:media-text -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\";}i:46;O:8:\"stdClass\":7:{s:2:\"id\";i:192;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Media and text with image on the left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:630:\"\n<div class=\"wp-block-media-text alignfull is-stacked-on-mobile is-vertically-aligned-center\"><figure class=\"wp-block-media-text__media\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/architecture-04.jpg\" alt=\"Close-up, abstract view of architecture.\" /></figure><div class=\"wp-block-media-text__content\">\n<h3 class=\"wp-block-heading has-text-align-center has-text-color\" style=\"color:#000000\"><strong>Open Spaces</strong></h3>\n\n\n\n<p class=\"has-text-align-center has-extra-small-font-size wp-block-paragraph\"><a href=\"#\">See case study <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">↗</span></a></p>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:66:\"Media and text block with image to the left and text to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:43:\"core/heading,core/media-text,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:844:\"<!-- wp:media-text {\"align\":\"full\",\"mediaType\":\"image\",\"verticalAlignment\":\"center\"} -->\n<div class=\"wp-block-media-text alignfull is-stacked-on-mobile is-vertically-aligned-center\"><figure class=\"wp-block-media-text__media\"><img src=\"https://s.w.org/images/core/5.8/architecture-04.jpg\" alt=\"Close-up, abstract view of architecture.\" /></figure><div class=\"wp-block-media-text__content\"><!-- wp:heading {\"textAlign\":\"center\",\"level\":3,\"style\":{\"color\":{\"text\":\"#000000\"}}} -->\n<h3 class=\"wp-block-heading has-text-align-center has-text-color\" style=\"color:#000000\"><strong>Open Spaces</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"align\":\"center\",\"fontSize\":\"extra-small\"} -->\n<p class=\"has-text-align-center has-extra-small-font-size\"><a href=\"#\">See case study ↗</a></p>\n<!-- /wp:paragraph --></div></div>\n<!-- /wp:media-text -->\";}i:47;O:8:\"stdClass\":7:{s:2:\"id\";i:186;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:35:\"Large header with text and a button\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1596:\"\n<div class=\"wp-block-cover alignfull has-parallax\" style=\"min-height:100vh;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-40 has-background-dim\" style=\"background-color:#000000\"></span><div role=\"img\" class=\"wp-block-cover__image-background has-parallax\" style=\"background-position:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};background-image:url(https://s.w.org/images/core/5.8/art-01.jpg)\"></div><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<h2 class=\"wp-block-heading alignwide has-white-color has-text-color\" style=\"font-size:48px;line-height:1.2\"><strong><em>Overseas:</em></strong><br><strong><em>1500 — 1960</em></strong></h2>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#ffffff\">An exhibition about the different representations of the ocean throughout time, between the sixteenth and the twentieth century. Taking place in our Open Room in <em>Floor 2</em>.</p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-outline is-style-outline--23\"><a class=\"wp-block-button__link has-text-color has-background wp-element-button\" style=\"color:#ffffff;background-color:#000000\">Visit</a></div>\n</div>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"></div>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:62:\"Large header with background image and text and button on top.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:88:\"core/button,core/buttons,core/column,core/columns,core/cover,core/heading,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2053:\"<!-- wp:cover {\"url\":\"https://s.w.org/images/core/5.8/art-01.jpg\",\"hasParallax\":true,\"dimRatio\":40,\"customOverlayColor\":\"#000000\",\"minHeight\":100,\"minHeightUnit\":\"vh\",\"contentPosition\":\"center center\",\"align\":\"full\"} -->\n<div class=\"wp-block-cover alignfull has-parallax\" style=\"min-height:100vh\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-40 has-background-dim\" style=\"background-color:#000000\"></span><div role=\"img\" class=\"wp-block-cover__image-background has-parallax\" style=\"background-position:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};background-image:url(https://s.w.org/images/core/5.8/art-01.jpg)\"></div><div class=\"wp-block-cover__inner-container\"><!-- wp:heading {\"style\":{\"typography\":{\"fontSize\":\"48px\",\"lineHeight\":\"1.2\"}},\"className\":\"alignwide has-white-color has-text-color\"} -->\n<h2 class=\"wp-block-heading alignwide has-white-color has-text-color\" style=\"font-size:48px;line-height:1.2\"><strong><em>Overseas:</em></strong><br><strong><em>1500 — 1960</em></strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:columns {\"align\":\"wide\"} -->\n<div class=\"wp-block-columns alignwide\"><!-- wp:column {\"width\":\"60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:paragraph {\"style\":{\"color\":{\"text\":\"#ffffff\"}}} -->\n<p class=\"has-text-color\" style=\"color:#ffffff\">An exhibition about the different representations of the ocean throughout time, between the sixteenth and the twentieth century. Taking place in our Open Room in <em>Floor 2</em>.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:buttons -->\n<div class=\"wp-block-buttons\"><!-- wp:button {\"style\":{\"color\":{\"text\":\"#ffffff\",\"background\":\"#000000\"}},\"className\":\"is-style-outline\"} -->\n<div class=\"wp-block-button is-style-outline\"><a class=\"wp-block-button__link has-text-color has-background wp-element-button\" style=\"color:#ffffff;background-color:#000000\">Visit</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:column -->\n\n<!-- wp:column -->\n<div class=\"wp-block-column\"></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns --></div></div>\n<!-- /wp:cover -->\";}i:48;O:8:\"stdClass\":7:{s:2:\"id\";i:185;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:35:\"Large header with left-aligned text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1388:\"\n<div class=\"wp-block-cover alignfull\" style=\"min-height:800px;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-60 has-background-dim\"></span><img decoding=\"async\" class=\"wp-block-cover__image-background\" alt=\"\" src=\"https://s.w.org/images/core/5.8/forest.jpg\" data-object-fit=\"cover\" /><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<h2 class=\"wp-block-heading alignwide has-text-color\" style=\"color:#ffe074;font-size:64px\">Forest.</h2>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<div style=\"height:330px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#ffe074;font-size:12px;line-height:1.3\"><em>Even a child knows how valuable the forest is. The fresh, breathtaking smell of trees. Echoing birds flying above that dense magnitude. A stable climate, a sustainable diverse life and a source of culture. Yet, forests and other ecosystems hang in the balance, threatened to become croplands, pasture, and plantations.</em></p>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"></div>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:29:\"Cover image with quote on top\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:75:\"core/column,core/columns,core/cover,core/heading,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1698:\"<!-- wp:cover {\"url\":\"https://s.w.org/images/core/5.8/forest.jpg\",\"dimRatio\":60,\"minHeight\":800,\"align\":\"full\"} -->\n<div class=\"wp-block-cover alignfull\" style=\"min-height:800px\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-60 has-background-dim\"></span><img class=\"wp-block-cover__image-background\" alt=\"\" src=\"https://s.w.org/images/core/5.8/forest.jpg\" data-object-fit=\"cover\" /><div class=\"wp-block-cover__inner-container\"><!-- wp:heading {\"align\":\"wide\",\"style\":{\"color\":{\"text\":\"#ffe074\"},\"typography\":{\"fontSize\":\"64px\"}}} -->\n<h2 class=\"wp-block-heading alignwide has-text-color\" style=\"color:#ffe074;font-size:64px\">Forest.</h2>\n<!-- /wp:heading -->\n\n<!-- wp:columns {\"align\":\"wide\"} -->\n<div class=\"wp-block-columns alignwide\"><!-- wp:column {\"width\":\"55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:spacer {\"height\":\"330px\"} -->\n<div style=\"height:330px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:paragraph {\"style\":{\"color\":{\"text\":\"#ffe074\"},\"typography\":{\"lineHeight\":\"1.3\",\"fontSize\":\"12px\"}}} -->\n<p class=\"has-text-color\" style=\"color:#ffe074;font-size:12px;line-height:1.3\"><em>Even a child knows how valuable the forest is. The fresh, breathtaking smell of trees. Echoing birds flying above that dense magnitude. A stable climate, a sustainable diverse life and a source of culture. Yet, forests and other ecosystems hang in the balance, threatened to become croplands, pasture, and plantations.</em></p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column -->\n\n<!-- wp:column -->\n<div class=\"wp-block-column\"></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns --></div></div>\n<!-- /wp:cover -->\";}i:49;O:8:\"stdClass\":7:{s:2:\"id\";i:184;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:7:\"Heading\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:526:\"\n<h2 class=\"alignwide wp-block-heading\" id=\"we-re-a-studio-in-berlin-with-an-international-practice-in-architecture-urban-planning-and-interior-design-we-believe-in-sharing-knowledge-and-promoting-dialogue-to-increase-the-creative-potential-of-collaboration\" style=\"font-size:48px;line-height:1.1\">We&#8217;re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.</h2>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:17:\"large text, title\";s:16:\"wpop_description\";s:12:\"Heading text\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:1:{i:0;s:12:\"core/heading\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:12:\"core/heading\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:621:\"<!-- wp:heading {\"align\":\"wide\",\"style\":{\"typography\":{\"fontSize\":\"48px\",\"lineHeight\":\"1.1\"}}} -->\n<h2 class=\"alignwide\" id=\"we-re-a-studio-in-berlin-with-an-international-practice-in-architecture-urban-planning-and-interior-design-we-believe-in-sharing-knowledge-and-promoting-dialogue-to-increase-the-creative-potential-of-collaboration\" style=\"font-size:48px;line-height:1.1\">We\'re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.</h2>\n<!-- /wp:heading -->\";}i:50;O:8:\"stdClass\":7:{s:2:\"id\";i:29;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:29:\"Two columns of text and title\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1600:\"\n<h2 class=\"wp-block-heading\" style=\"font-size:38px;line-height:1.4\"><strong>The voyage had begun, and had begun happily with a soft blue sky, and a calm sea.</strong></h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"wp-block-paragraph\" style=\"font-size:18px\">They followed her on to the deck. All the smoke and the houses had disappeared, and the ship was out in a wide space of sea very fresh and clear though pale in the early light. They had left London sitting on its mud. A very thin line of shadow tapered on the horizon, scarcely thick enough to stand the burden of Paris, which nevertheless rested upon it. They were free of roads, free of mankind, and the same exhilaration at their freedom ran through them all.</p>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"wp-block-paragraph\" style=\"font-size:18px\">The ship was making her way steadily through small waves which slapped her and then fizzled like effervescing water, leaving a little border of bubbles and foam on either side. The colourless October sky above was thinly clouded as if by the trail of wood-fire smoke, and the air was wonderfully salt and brisk. Indeed it was too cold to stand still. Mrs. Ambrose drew her arm within her husband&#8217;s, and as they moved off it could be seen from the way in which her sloping cheek turned up to his that she had something private to communicate.</p>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:47:\"Two columns of text preceded by a long heading.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:52:\"core/column,core/columns,core/heading,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"columns\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1711:\"<!-- wp:heading {\"style\":{\"typography\":{\"fontSize\":38,\"lineHeight\":\"1.4\"}}} -->\n<h2 style=\"font-size:38px;line-height:1.4\"><strong>The voyage had begun, and had begun happily with a soft blue sky, and a calm sea.</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:columns -->\n<div class=\"wp-block-columns\"><!-- wp:column -->\n<div class=\"wp-block-column\"><!-- wp:paragraph {\"style\":{\"typography\":{\"fontSize\":18}}} -->\n<p style=\"font-size:18px\">They followed her on to the deck. All the smoke and the houses had disappeared, and the ship was out in a wide space of sea very fresh and clear though pale in the early light. They had left London sitting on its mud. A very thin line of shadow tapered on the horizon, scarcely thick enough to stand the burden of Paris, which nevertheless rested upon it. They were free of roads, free of mankind, and the same exhilaration at their freedom ran through them all.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column -->\n\n<!-- wp:column -->\n<div class=\"wp-block-column\"><!-- wp:paragraph {\"style\":{\"typography\":{\"fontSize\":18}}} -->\n<p style=\"font-size:18px\">The ship was making her way steadily through small waves which slapped her and then fizzled like effervescing water, leaving a little border of bubbles and foam on either side. The colourless October sky above was thinly clouded as if by the trail of wood-fire smoke, and the air was wonderfully salt and brisk. Indeed it was too cold to stand still. Mrs. Ambrose drew her arm within her husband\'s, and as they moved off it could be seen from the way in which her sloping cheek turned up to his that she had something private to communicate.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\";}i:51;O:8:\"stdClass\":7:{s:2:\"id\";i:19;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:23:\"Two images side by side\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:571:\"\n<figure class=\"wp-block-gallery alignwide has-nested-images columns-default is-cropped wp-block-gallery-24 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/nature-above-01.jpg\" alt=\"An aerial view of waves crashing against a shore.\" /></figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/nature-above-02.jpg\" alt=\"An aerial view of a field. A road runs through the upper right corner.\" /></figure>\n</figure>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:41:\"An image gallery with two example images.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:23:\"core/gallery,core/image\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:7:\"gallery\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:704:\"<!-- wp:gallery {\"linkTo\":\"none\",\"align\":\"wide\"} -->\n<figure class=\"wp-block-gallery alignwide has-nested-images columns-default is-cropped\"><!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://s.w.org/images/core/5.8/nature-above-01.jpg\" alt=\"An aerial view of waves crashing against a shore.\" /></figure>\n<!-- /wp:image -->\n\n<!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://s.w.org/images/core/5.8/nature-above-02.jpg\" alt=\"An aerial view of a field. A road runs through the upper right corner.\" /></figure>\n<!-- /wp:image --></figure>\n<!-- /wp:gallery -->\";}}', 'off');
INSERT INTO `wp_options` VALUES ('884', '_site_transient_timeout_wp_remote_block_patterns_7388b2c07c085b37d76db59767aa69fd', '1783311306', 'off');
INSERT INTO `wp_options` VALUES ('885', '_site_transient_wp_remote_block_patterns_7388b2c07c085b37d76db59767aa69fd', 'a:16:{i:0;O:8:\"stdClass\":7:{s:2:\"id\";i:623227;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:26:\"Three column pricing table\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3843:\"\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-2966e5ee wp-block-columns-is-layout-flex\" style=\"margin-bottom:0\">\n<div class=\"wp-block-column has-text-color has-background has-link-color wp-elements-1 is-layout-flow wp-block-column-is-layout-flow\" style=\"color:#000000;background-color:#ffe97d;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<h2 class=\"wp-block-heading\" id=\"single\" style=\"font-size:40px\"><strong>Single</strong></h2>\n\n\n\n<p class=\"has-normal-font-size wp-block-paragraph\" style=\"line-height:1.5\"><strong>Enrich our growing community.</strong> </p>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-css-opacity has-background is-style-wide\" style=\"background-color:#000000;color:#000000\" />\n\n\n\n<ul class=\"has-normal-font-size wp-block-list\">\n<li>General admission and member discounts for one adult</li>\n\n\n\n<li>One free ticket per special exhibition</li>\n\n\n\n<li>Two single-use guest passes per year</li>\n</ul>\n\n\n\n<div class=\"wp-block-buttons alignfull is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-f68c927c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link has-white-color has-text-color has-background no-border-radius wp-element-button\" style=\"background-color:#000000\">$110 / year</a></div>\n</div>\n</div>\n\n\n\n<div class=\"wp-block-column has-text-color has-background has-link-color wp-elements-2 is-layout-flow wp-block-column-is-layout-flow\" style=\"color:#000000;background-color:#d1d1e1;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<h2 class=\"wp-block-heading\" id=\"family\" style=\"font-size:40px\"><strong>Família</strong></h2>\n\n\n\n<p class=\"has-normal-font-size wp-block-paragraph\" style=\"line-height:1.5\"><strong>Support special exhibitions.</strong></p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\" />\n\n\n\n<ul class=\"has-normal-font-size wp-block-list\">\n<li>General admission and member discounts for two adults</li>\n\n\n\n<li>Four free tickets per special exhibition</li>\n\n\n\n<li>Four single-use guest passes per year</li>\n</ul>\n\n\n\n<div class=\"wp-block-buttons alignfull is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-f68c927c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100 is-style-fill\"><a class=\"wp-block-button__link has-white-color has-text-color has-background no-border-radius wp-element-button\" style=\"background-color:#000000\">$200 / year</a></div>\n</div>\n</div>\n\n\n\n<div class=\"wp-block-column has-text-color has-background has-link-color wp-elements-3 is-layout-flow wp-block-column-is-layout-flow\" style=\"color:#000000;background-color:#c0ebf1;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<h2 class=\"wp-block-heading\" id=\"patron\" style=\"font-size:40px\"><strong>Patron</strong></h2>\n\n\n\n<p class=\"has-normal-font-size wp-block-paragraph\"><strong>Take support to the next level.</strong></p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\" />\n\n\n\n<ul class=\"has-normal-font-size wp-block-list\">\n<li>General admission and member discounts for two adults</li>\n\n\n\n<li>Five free tickets per special exhibition</li>\n\n\n\n<li>Six single-use guest passes per year</li>\n</ul>\n\n\n\n<div class=\"wp-block-buttons alignfull is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-f68c927c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link has-white-color has-text-color has-background no-border-radius wp-element-button\" style=\"background-color:#000000\">$400 / year</a></div>\n</div>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:272:\"Three equal-width columns set up as a pricing table. The left column has a yellow background, the middle column has a light purple background, and the right column has a light blue background. Each column contains a heading, subheading, separator, list, and then a button.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:1:{i:0;s:0:\"\";}s:11:\"wpop_locale\";s:5:\"pt_BR\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:117:\"core/button,core/buttons,core/column,core/columns,core/heading,core/list,core/list-item,core/paragraph,core/separator\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:6127:\"<!-- wp:columns {\"align\":\"wide\",\"style\":{\"spacing\":{\"margin\":{\"bottom\":\"0\"}}}} -->\n<div class=\"wp-block-columns alignwide\" style=\"margin-bottom:0\"><!-- wp:column {\"style\":{\"color\":{\"background\":\"#ffe97d\",\"text\":\"#000000\"},\"elements\":{\"link\":{\"color\":{\"text\":\"#000000\"}}},\"spacing\":{\"padding\":{\"top\":\"2em\",\"right\":\"2em\",\"bottom\":\"2em\",\"left\":\"2em\"}}}} -->\n<div class=\"wp-block-column has-text-color has-background has-link-color\" style=\"color:#000000;background-color:#ffe97d;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\"><!-- wp:heading {\"style\":{\"typography\":{\"fontSize\":\"40px\"}},\"anchor\":\"single\"} -->\n<h2 class=\"wp-block-heading\" id=\"single\" style=\"font-size:40px\"><strong>Single</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"style\":{\"typography\":{\"lineHeight\":\"1.5\"}},\"fontSize\":\"normal\"} -->\n<p class=\"has-normal-font-size\" style=\"line-height:1.5\"><strong>Enrich our growing community.</strong> </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator {\"opacity\":\"css\",\"style\":{\"color\":{\"background\":\"#000000\"}},\"className\":\"is-style-wide\"} -->\n<hr class=\"wp-block-separator has-text-color has-css-opacity has-background is-style-wide\" style=\"background-color:#000000;color:#000000\" />\n<!-- /wp:separator -->\n\n<!-- wp:list {\"fontSize\":\"normal\"} -->\n<ul class=\"has-normal-font-size\"><!-- wp:list-item -->\n<li>General admission and member discounts for one adult</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>One free ticket per special exhibition</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Two single-use guest passes per year</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:buttons {\"align\":\"full\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"center\",\"orientation\":\"horizontal\"}} -->\n<div class=\"wp-block-buttons alignfull\"><!-- wp:button {\"textColor\":\"white\",\"width\":100,\"style\":{\"color\":{\"background\":\"#000000\"},\"border\":{\"radius\":0}}} -->\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link has-white-color has-text-color has-background no-border-radius wp-element-button\" style=\"background-color:#000000\">$110 / year</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"style\":{\"color\":{\"background\":\"#d1d1e1\",\"text\":\"#000000\"},\"elements\":{\"link\":{\"color\":{\"text\":\"#000000\"}}},\"spacing\":{\"padding\":{\"top\":\"2em\",\"right\":\"2em\",\"bottom\":\"2em\",\"left\":\"2em\"}}}} -->\n<div class=\"wp-block-column has-text-color has-background has-link-color\" style=\"color:#000000;background-color:#d1d1e1;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\"><!-- wp:heading {\"style\":{\"typography\":{\"fontSize\":\"40px\"}},\"anchor\":\"family\"} -->\n<h2 class=\"wp-block-heading\" id=\"family\" style=\"font-size:40px\"><strong>Família</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"style\":{\"typography\":{\"lineHeight\":\"1.5\"}},\"fontSize\":\"normal\"} -->\n<p class=\"has-normal-font-size\" style=\"line-height:1.5\"><strong>Support special exhibitions.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator {\"opacity\":\"css\",\"className\":\"is-style-wide\"} -->\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\" />\n<!-- /wp:separator -->\n\n<!-- wp:list {\"fontSize\":\"normal\"} -->\n<ul class=\"has-normal-font-size\"><!-- wp:list-item -->\n<li>General admission and member discounts for two adults</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Four free tickets per special exhibition</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Four single-use guest passes per year</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:buttons {\"align\":\"full\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"center\",\"orientation\":\"horizontal\"}} -->\n<div class=\"wp-block-buttons alignfull\"><!-- wp:button {\"textColor\":\"white\",\"width\":100,\"style\":{\"color\":{\"background\":\"#000000\"},\"border\":{\"radius\":0}},\"className\":\"is-style-fill\"} -->\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100 is-style-fill\"><a class=\"wp-block-button__link has-white-color has-text-color has-background no-border-radius wp-element-button\" style=\"background-color:#000000\">$200 / year</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"style\":{\"color\":{\"background\":\"#c0ebf1\",\"text\":\"#000000\"},\"elements\":{\"link\":{\"color\":{\"text\":\"#000000\"}}},\"spacing\":{\"padding\":{\"top\":\"2em\",\"right\":\"2em\",\"bottom\":\"2em\",\"left\":\"2em\"}}}} -->\n<div class=\"wp-block-column has-text-color has-background has-link-color\" style=\"color:#000000;background-color:#c0ebf1;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\"><!-- wp:heading {\"style\":{\"typography\":{\"fontSize\":\"40px\"}},\"anchor\":\"patron\"} -->\n<h2 class=\"wp-block-heading\" id=\"patron\" style=\"font-size:40px\"><strong>Patron</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"fontSize\":\"normal\"} -->\n<p class=\"has-normal-font-size\"><strong>Take support to the next level.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator {\"opacity\":\"css\",\"className\":\"is-style-wide\"} -->\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\" />\n<!-- /wp:separator -->\n\n<!-- wp:list {\"fontSize\":\"normal\"} -->\n<ul class=\"has-normal-font-size\"><!-- wp:list-item -->\n<li>General admission and member discounts for two adults</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Five free tickets per special exhibition</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Six single-use guest passes per year</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:buttons {\"align\":\"full\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"center\",\"orientation\":\"horizontal\"}} -->\n<div class=\"wp-block-buttons alignfull\"><!-- wp:button {\"textColor\":\"white\",\"width\":100,\"style\":{\"color\":{\"background\":\"#000000\"},\"border\":{\"radius\":0}}} -->\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link has-white-color has-text-color has-background no-border-radius wp-element-button\" style=\"background-color:#000000\">$400 / year</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\";}i:1;O:8:\"stdClass\":7:{s:2:\"id\";i:623235;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:6:\"Evento\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1676:\"\n<div class=\"wp-block-media-text alignfull has-media-on-the-right is-stacked-on-mobile is-vertically-aligned-top has-text-color has-background has-link-color wp-elements-4\" style=\"color:#fffdc7;background-color:#121c1c;grid-template-columns:auto 60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div class=\"wp-block-media-text__content\">\n<div class=\"wp-block-group has-link-color wp-elements-5 is-layout-flow wp-block-group-is-layout-flow\" style=\"padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<h2 class=\"wp-block-heading\" style=\"font-size:48px;font-weight:700;line-height:1.15\">Opening <br>Party</h2>\n\n\n\n<p class=\"has-text-color has-link-color wp-elements-6 wp-block-paragraph\" style=\"color:#fffdc7\"><strong><a href=\"#\">RSVP <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">→</span></a></strong></p>\n</div>\n</div><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1-1024x1024.jpg\" alt=\"\" class=\"wp-image-590 size-full\" srcset=\"https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1-1024x1024.jpg 1024w, https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1-300x300.jpg 300w, https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1-150x150.jpg 150w, https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1-768x768.jpg 768w, https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1-1536x1536.jpg 1536w, https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1.jpg 1572w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></figure></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:1:{i:0;s:0:\"\";}s:11:\"wpop_locale\";s:5:\"pt_BR\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:54:\"core/group,core/heading,core/media-text,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:6:\"images\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1617:\"<!-- wp:media-text {\"align\":\"full\",\"mediaPosition\":\"right\",\"mediaId\":590,\"mediaLink\":\"https://wordpress.org/patterns/image-from-rawpixel-id-430289-jpeg-1/\",\"mediaType\":\"image\",\"mediaWidth\":60,\"verticalAlignment\":\"top\",\"style\":{\"color\":{\"background\":\"#121c1c\",\"text\":\"#fffdc7\"},\"elements\":{\"link\":{\"color\":{\"text\":\"#fffdc7\"}}}}} -->\n<div class=\"wp-block-media-text alignfull has-media-on-the-right is-stacked-on-mobile is-vertically-aligned-top has-text-color has-background has-link-color\" style=\"color:#fffdc7;background-color:#121c1c;grid-template-columns:auto 60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div class=\"wp-block-media-text__content\"><!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"2em\",\"right\":\"2em\",\"bottom\":\"2em\",\"left\":\"2em\"}},\"elements\":{\"link\":{\"color\":{\"text\":\"#fffdc7\"}}}}} -->\n<div class=\"wp-block-group has-link-color\" style=\"padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\"><!-- wp:heading {\"style\":{\"typography\":{\"fontWeight\":\"700\",\"fontSize\":\"48px\",\"lineHeight\":\"1.15\"}}} -->\n<h2 class=\"wp-block-heading\" style=\"font-size:48px;font-weight:700;line-height:1.15\">Opening <br>Party</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"style\":{\"elements\":{\"link\":{\"color\":{\"text\":\"#fffdc7\"}}},\"color\":{\"text\":\"#fffdc7\"}}} -->\n<p class=\"has-text-color has-link-color\" style=\"color:#fffdc7\"><strong><a href=\"#\">RSVP →</a></strong></p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div><figure class=\"wp-block-media-text__media\"><img src=\"https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1-1024x1024.jpg\" alt=\"\" class=\"wp-image-590 size-full\" /></figure></div>\n<!-- /wp:media-text -->\";}i:2;O:8:\"stdClass\":7:{s:2:\"id\";i:623261;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:10:\"cabeçalho\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:526:\"\n<h2 class=\"alignwide wp-block-heading\" id=\"we-re-a-studio-in-berlin-with-an-international-practice-in-architecture-urban-planning-and-interior-design-we-believe-in-sharing-knowledge-and-promoting-dialogue-to-increase-the-creative-potential-of-collaboration\" style=\"font-size:48px;line-height:1.1\">We&#8217;re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.</h2>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:17:\"large text, title\";s:16:\"wpop_description\";s:12:\"Heading text\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:1:{i:0;s:12:\"core/heading\";}s:11:\"wpop_locale\";s:5:\"pt_BR\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:12:\"core/heading\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:621:\"<!-- wp:heading {\"align\":\"wide\",\"style\":{\"typography\":{\"fontSize\":\"48px\",\"lineHeight\":\"1.1\"}}} -->\n<h2 class=\"alignwide\" id=\"we-re-a-studio-in-berlin-with-an-international-practice-in-architecture-urban-planning-and-interior-design-we-believe-in-sharing-knowledge-and-promoting-dialogue-to-increase-the-creative-potential-of-collaboration\" style=\"font-size:48px;line-height:1.1\">We\'re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.</h2>\n<!-- /wp:heading -->\";}i:3;O:8:\"stdClass\":7:{s:2:\"id\";i:207567;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:11:\"Link in Bio\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:6659:\"\n<div class=\"wp-block-group has-white-background-color has-background is-layout-flow wp-block-group-is-layout-flow\" style=\"padding-top:var(--wp--preset--spacing--80);padding-right:0;padding-bottom:var(--wp--preset--spacing--80);padding-left:0\"><h1 style=\"font-style:normal;font-weight:700\" class=\"has-text-align-center wp-block-site-title has-medium-font-size\"><a href=\"https://wordpress.org/patterns\" target=\"_self\" rel=\"home\">Padrões</a></h1>\n\n<p class=\"has-text-align-center wp-block-site-tagline\">Beautifully designed patterns ready to go with a simple copy/paste</p>\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-36078703 wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link wp-element-button\">Watch my latest videos</a></div>\n\n\n\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link wp-element-button\">Buy merch</a></div>\n\n\n\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link wp-element-button\">Support me on Patreon</a></div>\n\n\n\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100 is-style-fill\"><a class=\"wp-block-button__link wp-element-button\">Get tickets for my show</a></div>\n</div>\n\n\n\n<ul class=\"wp-block-social-links has-normal-icon-size has-icon-color has-icon-background-color is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-dd89b5f3 wp-block-social-links-is-layout-flex\" style=\"padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)\"><li style=\"color:#000000;background-color:#ffffff\" class=\"wp-social-link wp-social-link-instagram has-black-color has-white-background-color wp-block-social-link\"><a href=\"https://wordpress.org/patterns/\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,4.622c2.403,0,2.688,0.009,3.637,0.052c0.877,0.04,1.354,0.187,1.671,0.31c0.42,0.163,0.72,0.358,1.035,0.673 c0.315,0.315,0.51,0.615,0.673,1.035c0.123,0.317,0.27,0.794,0.31,1.671c0.043,0.949,0.052,1.234,0.052,3.637 s-0.009,2.688-0.052,3.637c-0.04,0.877-0.187,1.354-0.31,1.671c-0.163,0.42-0.358,0.72-0.673,1.035 c-0.315,0.315-0.615,0.51-1.035,0.673c-0.317,0.123-0.794,0.27-1.671,0.31c-0.949,0.043-1.233,0.052-3.637,0.052 s-2.688-0.009-3.637-0.052c-0.877-0.04-1.354-0.187-1.671-0.31c-0.42-0.163-0.72-0.358-1.035-0.673 c-0.315-0.315-0.51-0.615-0.673-1.035c-0.123-0.317-0.27-0.794-0.31-1.671C4.631,14.688,4.622,14.403,4.622,12 s0.009-2.688,0.052-3.637c0.04-0.877,0.187-1.354,0.31-1.671c0.163-0.42,0.358-0.72,0.673-1.035 c0.315-0.315,0.615-0.51,1.035-0.673c0.317-0.123,0.794-0.27,1.671-0.31C9.312,4.631,9.597,4.622,12,4.622 M12,3 C9.556,3,9.249,3.01,8.289,3.054C7.331,3.098,6.677,3.25,6.105,3.472C5.513,3.702,5.011,4.01,4.511,4.511 c-0.5,0.5-0.808,1.002-1.038,1.594C3.25,6.677,3.098,7.331,3.054,8.289C3.01,9.249,3,9.556,3,12c0,2.444,0.01,2.751,0.054,3.711 c0.044,0.958,0.196,1.612,0.418,2.185c0.23,0.592,0.538,1.094,1.038,1.594c0.5,0.5,1.002,0.808,1.594,1.038 c0.572,0.222,1.227,0.375,2.185,0.418C9.249,20.99,9.556,21,12,21s2.751-0.01,3.711-0.054c0.958-0.044,1.612-0.196,2.185-0.418 c0.592-0.23,1.094-0.538,1.594-1.038c0.5-0.5,0.808-1.002,1.038-1.594c0.222-0.572,0.375-1.227,0.418-2.185 C20.99,14.751,21,14.444,21,12s-0.01-2.751-0.054-3.711c-0.044-0.958-0.196-1.612-0.418-2.185c-0.23-0.592-0.538-1.094-1.038-1.594 c-0.5-0.5-1.002-0.808-1.594-1.038c-0.572-0.222-1.227-0.375-2.185-0.418C14.751,3.01,14.444,3,12,3L12,3z M12,7.378 c-2.552,0-4.622,2.069-4.622,4.622S9.448,16.622,12,16.622s4.622-2.069,4.622-4.622S14.552,7.378,12,7.378z M12,15 c-1.657,0-3-1.343-3-3s1.343-3,3-3s3,1.343,3,3S13.657,15,12,15z M16.804,6.116c-0.596,0-1.08,0.484-1.08,1.08 s0.484,1.08,1.08,1.08c0.596,0,1.08-0.484,1.08-1.08S17.401,6.116,16.804,6.116z\"></path></svg><span class=\"wp-block-social-link-label screen-reader-text\">Instagram</span></a></li>\n\n<li style=\"color:#000000;background-color:#ffffff\" class=\"wp-social-link wp-social-link-bandcamp has-black-color has-white-background-color wp-block-social-link\"><a href=\"https://wordpress.org/patterns/\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M15.27 17.289 3 17.289 8.73 6.711 21 6.711 15.27 17.289\"></path></svg><span class=\"wp-block-social-link-label screen-reader-text\">Bandcamp</span></a></li>\n\n<li style=\"color:#000000;background-color:#ffffff\" class=\"wp-social-link wp-social-link-twitter has-black-color has-white-background-color wp-block-social-link\"><a href=\"https://wordpress.org/patterns/\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M22.23,5.924c-0.736,0.326-1.527,0.547-2.357,0.646c0.847-0.508,1.498-1.312,1.804-2.27 c-0.793,0.47-1.671,0.812-2.606,0.996C18.324,4.498,17.257,4,16.077,4c-2.266,0-4.103,1.837-4.103,4.103 c0,0.322,0.036,0.635,0.106,0.935C8.67,8.867,5.647,7.234,3.623,4.751C3.27,5.357,3.067,6.062,3.067,6.814 c0,1.424,0.724,2.679,1.825,3.415c-0.673-0.021-1.305-0.206-1.859-0.513c0,0.017,0,0.034,0,0.052c0,1.988,1.414,3.647,3.292,4.023 c-0.344,0.094-0.707,0.144-1.081,0.144c-0.264,0-0.521-0.026-0.772-0.074c0.522,1.63,2.038,2.816,3.833,2.85 c-1.404,1.1-3.174,1.756-5.096,1.756c-0.331,0-0.658-0.019-0.979-0.057c1.816,1.164,3.973,1.843,6.29,1.843 c7.547,0,11.675-6.252,11.675-11.675c0-0.178-0.004-0.355-0.012-0.531C20.985,7.47,21.68,6.747,22.23,5.924z\"></path></svg><span class=\"wp-block-social-link-label screen-reader-text\">Twitter</span></a></li>\n\n<li style=\"color:#000000;background-color:#ffffff\" class=\"wp-social-link wp-social-link-twitch has-black-color has-white-background-color wp-block-social-link\"><a href=\"https://wordpress.org/patterns/\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M16.499,8.089h-1.636v4.91h1.636V8.089z M12,8.089h-1.637v4.91H12V8.089z M4.228,3.178L3,6.451v13.092h4.499V22h2.456 l2.454-2.456h3.681L21,14.636V3.178H4.228z M19.364,13.816l-2.864,2.865H12l-2.453,2.453V16.68H5.863V4.814h13.501V13.816z\"></path></svg><span class=\"wp-block-social-link-label screen-reader-text\">Twitch</span></a></li></ul>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:116:\"core/button,core/buttons,core/group,core/site-tagline,core/site-title,core/social-link,core/social-links,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:2665:\"<!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|80\",\"right\":\"0\",\"bottom\":\"var:preset|spacing|80\",\"left\":\"0\"}}},\"backgroundColor\":\"white\",\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group has-white-background-color has-background\" style=\"padding-top:var(--wp--preset--spacing--80);padding-right:0;padding-bottom:var(--wp--preset--spacing--80);padding-left:0\"><!-- wp:site-title {\"textAlign\":\"center\",\"style\":{\"typography\":{\"fontStyle\":\"normal\",\"fontWeight\":\"700\"}},\"fontSize\":\"medium\"} /-->\n\n<!-- wp:site-tagline {\"textAlign\":\"center\"} /-->\n\n<!-- wp:spacer {\"height\":\"20px\"} -->\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:buttons {\"layout\":{\"type\":\"flex\",\"justifyContent\":\"center\"}} -->\n<div class=\"wp-block-buttons\"><!-- wp:button {\"width\":100} -->\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link wp-element-button\">Watch my latest videos</a></div>\n<!-- /wp:button -->\n\n<!-- wp:button {\"width\":100} -->\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link wp-element-button\">Buy merch</a></div>\n<!-- /wp:button -->\n\n<!-- wp:button {\"width\":100} -->\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link wp-element-button\">Support me on Patreon</a></div>\n<!-- /wp:button -->\n\n<!-- wp:button {\"width\":100,\"className\":\"is-style-fill\"} -->\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100 is-style-fill\"><a class=\"wp-block-button__link wp-element-button\">Get tickets for my show</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons -->\n\n<!-- wp:social-links {\"iconColor\":\"black\",\"iconColorValue\":\"#000000\",\"iconBackgroundColor\":\"white\",\"iconBackgroundColorValue\":\"#ffffff\",\"size\":\"has-normal-icon-size\",\"style\":{\"spacing\":{\"blockGap\":{\"top\":\"0\",\"left\":\"0\"},\"padding\":{\"top\":\"var:preset|spacing|60\",\"bottom\":\"var:preset|spacing|60\"}}},\"layout\":{\"type\":\"flex\",\"justifyContent\":\"center\"}} -->\n<ul class=\"wp-block-social-links has-normal-icon-size has-icon-color has-icon-background-color\" style=\"padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)\"><!-- wp:social-link {\"url\":\"https://wordpress.org/patterns/\",\"service\":\"instagram\"} /-->\n\n<!-- wp:social-link {\"url\":\"https://wordpress.org/patterns/\",\"service\":\"bandcamp\"} /-->\n\n<!-- wp:social-link {\"url\":\"https://wordpress.org/patterns/\",\"service\":\"twitter\"} /-->\n\n<!-- wp:social-link {\"url\":\"https://wordpress.org/patterns/\",\"service\":\"twitch\"} /--></ul>\n<!-- /wp:social-links --></div>\n<!-- /wp:group -->\";}i:4;O:8:\"stdClass\":7:{s:2:\"id\";i:732;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:21:\"Simple call to action\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1010:\"\n<div class=\"wp-block-group alignfull has-text-color has-background is-layout-flow wp-block-group-is-layout-flow\" style=\"background-color:#ffffff;color:#000000\">\n<div style=\"height:64px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<p class=\"has-text-align-center has-small-font-size wp-block-paragraph\" style=\"line-height:.9\"><strong>GET IN TOUCH</strong></p>\n\n\n\n<h2 class=\"has-text-align-center wp-block-heading\" id=\"schedule-a-visit\" style=\"font-size:59px;line-height:1.15\"><strong>Schedule a Visit</strong></h2>\n\n\n\n<div class=\"wp-block-buttons is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-f68c927c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-width wp-block-button__width-50\"><a class=\"wp-block-button__link has-text-color has-background\" style=\"border-radius:50px;background-color:#000000;color:#ffffff\">Contact us</a></div>\n</div>\n\n\n\n<div style=\"height:64px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:89:\"A container with a white background. Inside is a centered paragraph, heading, and button.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:75:\"core/button,core/buttons,core/group,core/heading,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:7:\"buttons\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1506:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"color\":{\"text\":\"#000000\",\"background\":\"#ffffff\"}}} -->\n<div class=\"wp-block-group alignfull has-text-color has-background\" style=\"background-color:#ffffff;color:#000000\"><!-- wp:spacer {\"height\":64} -->\n<div style=\"height:64px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:paragraph {\"align\":\"center\",\"style\":{\"typography\":{\"lineHeight\":\".9\"}},\"fontSize\":\"small\"} -->\n<p class=\"has-text-align-center has-small-font-size\" style=\"line-height:.9\"><strong>GET IN TOUCH</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"textAlign\":\"center\",\"style\":{\"typography\":{\"fontSize\":59,\"lineHeight\":\"1.15\"}}} -->\n<h2 class=\"has-text-align-center\" id=\"schedule-a-visit\" style=\"font-size:59px;line-height:1.15\"><strong>Schedule a Visit</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:buttons {\"layout\":{\"type\":\"flex\",\"justifyContent\":\"center\",\"orientation\":\"horizontal\"}} -->\n<div class=\"wp-block-buttons\"><!-- wp:button {\"width\":50,\"style\":{\"color\":{\"background\":\"#000000\",\"text\":\"#ffffff\"},\"border\":{\"radius\":\"50px\"}}} -->\n<div class=\"wp-block-button has-custom-width wp-block-button__width-50\"><a class=\"wp-block-button__link has-text-color has-background\" style=\"border-radius:50px;background-color:#000000;color:#ffffff\">Contact us</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons -->\n\n<!-- wp:spacer {\"height\":64} -->\n<div style=\"height:64px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer --></div>\n<!-- /wp:group -->\";}i:5;O:8:\"stdClass\":7:{s:2:\"id\";i:678;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:26:\"Three column pricing table\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3841:\"\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-2966e5ee wp-block-columns-is-layout-flex\" style=\"margin-bottom:0\">\n<div class=\"wp-block-column has-text-color has-background has-link-color wp-elements-7 is-layout-flow wp-block-column-is-layout-flow\" style=\"color:#000000;background-color:#ffe97d;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<h2 class=\"wp-block-heading\" id=\"single\" style=\"font-size:40px\"><strong>Single</strong></h2>\n\n\n\n<p class=\"has-normal-font-size wp-block-paragraph\" style=\"line-height:1.5\"><strong>Enrich our growing community.</strong> </p>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-css-opacity has-background is-style-wide\" style=\"background-color:#000000;color:#000000\" />\n\n\n\n<ul class=\"has-normal-font-size wp-block-list\">\n<li>General admission and member discounts for one adult</li>\n\n\n\n<li>One free ticket per special exhibition</li>\n\n\n\n<li>Two single-use guest passes per year</li>\n</ul>\n\n\n\n<div class=\"wp-block-buttons alignfull is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-f68c927c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link has-white-color has-text-color has-background no-border-radius wp-element-button\" style=\"background-color:#000000\">$110 / year</a></div>\n</div>\n</div>\n\n\n\n<div class=\"wp-block-column has-text-color has-background has-link-color wp-elements-8 is-layout-flow wp-block-column-is-layout-flow\" style=\"color:#000000;background-color:#d1d1e1;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<h2 class=\"wp-block-heading\" id=\"family\" style=\"font-size:40px\"><strong>Family</strong></h2>\n\n\n\n<p class=\"has-normal-font-size wp-block-paragraph\" style=\"line-height:1.5\"><strong>Support special exhibitions.</strong></p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\" />\n\n\n\n<ul class=\"has-normal-font-size wp-block-list\">\n<li>General admission and member discounts for two adults</li>\n\n\n\n<li>Four free tickets per special exhibition</li>\n\n\n\n<li>Four single-use guest passes per year</li>\n</ul>\n\n\n\n<div class=\"wp-block-buttons alignfull is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-f68c927c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100 is-style-fill\"><a class=\"wp-block-button__link has-white-color has-text-color has-background no-border-radius wp-element-button\" style=\"background-color:#000000\">$200 / year</a></div>\n</div>\n</div>\n\n\n\n<div class=\"wp-block-column has-text-color has-background has-link-color wp-elements-9 is-layout-flow wp-block-column-is-layout-flow\" style=\"color:#000000;background-color:#c0ebf1;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<h2 class=\"wp-block-heading\" id=\"patron\" style=\"font-size:40px\"><strong>Patron</strong></h2>\n\n\n\n<p class=\"has-normal-font-size wp-block-paragraph\"><strong>Take support to the next level.</strong></p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\" />\n\n\n\n<ul class=\"has-normal-font-size wp-block-list\">\n<li>General admission and member discounts for two adults</li>\n\n\n\n<li>Five free tickets per special exhibition</li>\n\n\n\n<li>Six single-use guest passes per year</li>\n</ul>\n\n\n\n<div class=\"wp-block-buttons alignfull is-horizontal is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-f68c927c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link has-white-color has-text-color has-background no-border-radius wp-element-button\" style=\"background-color:#000000\">$400 / year</a></div>\n</div>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:272:\"Three equal-width columns set up as a pricing table. The left column has a yellow background, the middle column has a light purple background, and the right column has a light blue background. Each column contains a heading, subheading, separator, list, and then a button.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:117:\"core/button,core/buttons,core/column,core/columns,core/heading,core/list,core/list-item,core/paragraph,core/separator\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:6125:\"<!-- wp:columns {\"align\":\"wide\",\"style\":{\"spacing\":{\"margin\":{\"bottom\":\"0\"}}}} -->\n<div class=\"wp-block-columns alignwide\" style=\"margin-bottom:0\"><!-- wp:column {\"style\":{\"color\":{\"background\":\"#ffe97d\",\"text\":\"#000000\"},\"elements\":{\"link\":{\"color\":{\"text\":\"#000000\"}}},\"spacing\":{\"padding\":{\"top\":\"2em\",\"right\":\"2em\",\"bottom\":\"2em\",\"left\":\"2em\"}}}} -->\n<div class=\"wp-block-column has-text-color has-background has-link-color\" style=\"color:#000000;background-color:#ffe97d;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\"><!-- wp:heading {\"style\":{\"typography\":{\"fontSize\":\"40px\"}},\"anchor\":\"single\"} -->\n<h2 class=\"wp-block-heading\" id=\"single\" style=\"font-size:40px\"><strong>Single</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"style\":{\"typography\":{\"lineHeight\":\"1.5\"}},\"fontSize\":\"normal\"} -->\n<p class=\"has-normal-font-size\" style=\"line-height:1.5\"><strong>Enrich our growing community.</strong> </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator {\"opacity\":\"css\",\"style\":{\"color\":{\"background\":\"#000000\"}},\"className\":\"is-style-wide\"} -->\n<hr class=\"wp-block-separator has-text-color has-css-opacity has-background is-style-wide\" style=\"background-color:#000000;color:#000000\" />\n<!-- /wp:separator -->\n\n<!-- wp:list {\"fontSize\":\"normal\"} -->\n<ul class=\"has-normal-font-size\"><!-- wp:list-item -->\n<li>General admission and member discounts for one adult</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>One free ticket per special exhibition</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Two single-use guest passes per year</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:buttons {\"align\":\"full\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"center\",\"orientation\":\"horizontal\"}} -->\n<div class=\"wp-block-buttons alignfull\"><!-- wp:button {\"textColor\":\"white\",\"width\":100,\"style\":{\"color\":{\"background\":\"#000000\"},\"border\":{\"radius\":0}}} -->\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link has-white-color has-text-color has-background no-border-radius wp-element-button\" style=\"background-color:#000000\">$110 / year</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"style\":{\"color\":{\"background\":\"#d1d1e1\",\"text\":\"#000000\"},\"elements\":{\"link\":{\"color\":{\"text\":\"#000000\"}}},\"spacing\":{\"padding\":{\"top\":\"2em\",\"right\":\"2em\",\"bottom\":\"2em\",\"left\":\"2em\"}}}} -->\n<div class=\"wp-block-column has-text-color has-background has-link-color\" style=\"color:#000000;background-color:#d1d1e1;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\"><!-- wp:heading {\"style\":{\"typography\":{\"fontSize\":\"40px\"}},\"anchor\":\"family\"} -->\n<h2 class=\"wp-block-heading\" id=\"family\" style=\"font-size:40px\"><strong>Family</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"style\":{\"typography\":{\"lineHeight\":\"1.5\"}},\"fontSize\":\"normal\"} -->\n<p class=\"has-normal-font-size\" style=\"line-height:1.5\"><strong>Support special exhibitions.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator {\"opacity\":\"css\",\"className\":\"is-style-wide\"} -->\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\" />\n<!-- /wp:separator -->\n\n<!-- wp:list {\"fontSize\":\"normal\"} -->\n<ul class=\"has-normal-font-size\"><!-- wp:list-item -->\n<li>General admission and member discounts for two adults</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Four free tickets per special exhibition</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Four single-use guest passes per year</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:buttons {\"align\":\"full\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"center\",\"orientation\":\"horizontal\"}} -->\n<div class=\"wp-block-buttons alignfull\"><!-- wp:button {\"textColor\":\"white\",\"width\":100,\"style\":{\"color\":{\"background\":\"#000000\"},\"border\":{\"radius\":0}},\"className\":\"is-style-fill\"} -->\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100 is-style-fill\"><a class=\"wp-block-button__link has-white-color has-text-color has-background no-border-radius wp-element-button\" style=\"background-color:#000000\">$200 / year</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"style\":{\"color\":{\"background\":\"#c0ebf1\",\"text\":\"#000000\"},\"elements\":{\"link\":{\"color\":{\"text\":\"#000000\"}}},\"spacing\":{\"padding\":{\"top\":\"2em\",\"right\":\"2em\",\"bottom\":\"2em\",\"left\":\"2em\"}}}} -->\n<div class=\"wp-block-column has-text-color has-background has-link-color\" style=\"color:#000000;background-color:#c0ebf1;padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\"><!-- wp:heading {\"style\":{\"typography\":{\"fontSize\":\"40px\"}},\"anchor\":\"patron\"} -->\n<h2 class=\"wp-block-heading\" id=\"patron\" style=\"font-size:40px\"><strong>Patron</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"fontSize\":\"normal\"} -->\n<p class=\"has-normal-font-size\"><strong>Take support to the next level.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator {\"opacity\":\"css\",\"className\":\"is-style-wide\"} -->\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\" />\n<!-- /wp:separator -->\n\n<!-- wp:list {\"fontSize\":\"normal\"} -->\n<ul class=\"has-normal-font-size\"><!-- wp:list-item -->\n<li>General admission and member discounts for two adults</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Five free tickets per special exhibition</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Six single-use guest passes per year</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:buttons {\"align\":\"full\",\"layout\":{\"type\":\"flex\",\"justifyContent\":\"center\",\"orientation\":\"horizontal\"}} -->\n<div class=\"wp-block-buttons alignfull\"><!-- wp:button {\"textColor\":\"white\",\"width\":100,\"style\":{\"color\":{\"background\":\"#000000\"},\"border\":{\"radius\":0}}} -->\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link has-white-color has-text-color has-background no-border-radius wp-element-button\" style=\"background-color:#000000\">$400 / year</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\";}i:6;O:8:\"stdClass\":7:{s:2:\"id\";i:669;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:31:\"Image and quote on a background\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2385:\"\n<div class=\"wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile is-vertically-aligned-center has-background\" style=\"background-color:#f1f5c7\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https://s.w.org/patterns/files/2021/06/pear-1-1024x1024.png\" alt=\"\" class=\"wp-image-5263 size-full\" srcset=\"https://s.w.org/patterns/files/2021/06/pear-1-1024x1024.png 1024w, https://s.w.org/patterns/files/2021/06/pear-1-300x300.png 300w, https://s.w.org/patterns/files/2021/06/pear-1-150x150.png 150w, https://s.w.org/patterns/files/2021/06/pear-1-768x768.png 768w, https://s.w.org/patterns/files/2021/06/pear-1.png 1300w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></figure><div class=\"wp-block-media-text__content\">\n<div class=\"wp-block-group is-layout-flow wp-block-group-is-layout-flow\" style=\"padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<p class=\"wp-block-paragraph\" style=\"font-size:36px;line-height:1.2\"><strong>Even the bitterest fruit has sugar in it.</strong></p>\n\n\n\n<p class=\"has-extra-small-font-size wp-block-paragraph\">– Terry a O&#8217;Neal</p>\n</div>\n</div></div>\n\n\n\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile is-vertically-aligned-center has-background\" style=\"background-color:#fffdea\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https://s.w.org/patterns/files/2021/06/pear-half-1024x1024.png\" alt=\"\" class=\"wp-image-673 size-full\" srcset=\"https://s.w.org/patterns/files/2021/06/pear-half-1024x1024.png 1024w, https://s.w.org/patterns/files/2021/06/pear-half-300x300.png 300w, https://s.w.org/patterns/files/2021/06/pear-half-150x150.png 150w, https://s.w.org/patterns/files/2021/06/pear-half-768x768.png 768w, https://s.w.org/patterns/files/2021/06/pear-half.png 1300w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></figure><div class=\"wp-block-media-text__content\">\n<div class=\"wp-block-group is-layout-flow wp-block-group-is-layout-flow\" style=\"padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<p class=\"wp-block-paragraph\" style=\"font-size:36px;line-height:1.2\"><strong>The trees that are slow to grow bear the best fruit.</strong></p>\n\n\n\n<p class=\"has-extra-small-font-size wp-block-paragraph\">– Molière</p>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:221:\"Two media and text blocks. The top one has a pale green background. The text is on the left and contains a quote, and the image is on the right. The next block underneath has the image on the left, and quote on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:41:\"core/group,core/media-text,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"images\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:2404:\"<!-- wp:media-text {\"mediaPosition\":\"right\",\"mediaId\":5263,\"mediaLink\":\"https://wordpress.org/patterns/pattern/image-and-quote-on-a-background/pear-3/\",\"mediaType\":\"image\",\"verticalAlignment\":\"center\",\"style\":{\"color\":{\"background\":\"#f1f5c7\"}}} -->\n<div class=\"wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile is-vertically-aligned-center has-background\" style=\"background-color:#f1f5c7\"><figure class=\"wp-block-media-text__media\"><img src=\"https://s.w.org/patterns/files/2021/06/pear-1-1024x1024.png\" alt=\"\" class=\"wp-image-5263 size-full\" /></figure><div class=\"wp-block-media-text__content\"><!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"2em\",\"right\":\"2em\",\"bottom\":\"2em\",\"left\":\"2em\"}}}} -->\n<div class=\"wp-block-group\" style=\"padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\"><!-- wp:paragraph {\"style\":{\"typography\":{\"lineHeight\":\"1.2\",\"fontSize\":\"36px\"}}} -->\n<p style=\"font-size:36px;line-height:1.2\"><strong>Even the bitterest fruit has sugar in it.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"fontSize\":\"extra-small\"} -->\n<p class=\"has-extra-small-font-size\">– Terry a O\'Neal</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div></div>\n<!-- /wp:media-text -->\n\n<!-- wp:media-text {\"mediaId\":673,\"mediaLink\":\"https://wordpress.org/patterns/pear-half/\",\"mediaType\":\"image\",\"verticalAlignment\":\"center\",\"style\":{\"color\":{\"background\":\"#fffdea\"}}} -->\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile is-vertically-aligned-center has-background\" style=\"background-color:#fffdea\"><figure class=\"wp-block-media-text__media\"><img src=\"https://s.w.org/patterns/files/2021/06/pear-half-1024x1024.png\" alt=\"\" class=\"wp-image-673 size-full\" /></figure><div class=\"wp-block-media-text__content\"><!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"2em\",\"right\":\"2em\",\"bottom\":\"2em\",\"left\":\"2em\"}}}} -->\n<div class=\"wp-block-group\" style=\"padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\"><!-- wp:paragraph {\"style\":{\"typography\":{\"lineHeight\":\"1.2\",\"fontSize\":\"36px\"}}} -->\n<p style=\"font-size:36px;line-height:1.2\"><strong>The trees that are slow to grow bear the best fruit.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"fontSize\":\"extra-small\"} -->\n<p class=\"has-extra-small-font-size\">– Molière</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div></div>\n<!-- /wp:media-text -->\";}i:7;O:8:\"stdClass\":7:{s:2:\"id\";i:591;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:5:\"Event\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1679:\"\n<div class=\"wp-block-media-text alignfull has-media-on-the-right is-stacked-on-mobile is-vertically-aligned-top has-text-color has-background has-link-color wp-elements-10\" style=\"color:#fffdc7;background-color:#121c1c;grid-template-columns:auto 60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div class=\"wp-block-media-text__content\">\n<div class=\"wp-block-group has-link-color wp-elements-11 is-layout-flow wp-block-group-is-layout-flow\" style=\"padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\">\n<h2 class=\"wp-block-heading\" style=\"font-size:48px;font-weight:700;line-height:1.15\">Opening <br>Party</h2>\n\n\n\n<p class=\"has-text-color has-link-color wp-elements-12 wp-block-paragraph\" style=\"color:#fffdc7\"><strong><a href=\"#\">RSVP <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">→</span></a></strong></p>\n</div>\n</div><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1-1024x1024.jpg\" alt=\"\" class=\"wp-image-590 size-full\" srcset=\"https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1-1024x1024.jpg 1024w, https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1-300x300.jpg 300w, https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1-150x150.jpg 150w, https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1-768x768.jpg 768w, https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1-1536x1536.jpg 1536w, https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1.jpg 1572w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></figure></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:54:\"core/group,core/heading,core/media-text,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:6:\"images\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1617:\"<!-- wp:media-text {\"align\":\"full\",\"mediaPosition\":\"right\",\"mediaId\":590,\"mediaLink\":\"https://wordpress.org/patterns/image-from-rawpixel-id-430289-jpeg-1/\",\"mediaType\":\"image\",\"mediaWidth\":60,\"verticalAlignment\":\"top\",\"style\":{\"color\":{\"background\":\"#121c1c\",\"text\":\"#fffdc7\"},\"elements\":{\"link\":{\"color\":{\"text\":\"#fffdc7\"}}}}} -->\n<div class=\"wp-block-media-text alignfull has-media-on-the-right is-stacked-on-mobile is-vertically-aligned-top has-text-color has-background has-link-color\" style=\"color:#fffdc7;background-color:#121c1c;grid-template-columns:auto 60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div class=\"wp-block-media-text__content\"><!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"2em\",\"right\":\"2em\",\"bottom\":\"2em\",\"left\":\"2em\"}},\"elements\":{\"link\":{\"color\":{\"text\":\"#fffdc7\"}}}}} -->\n<div class=\"wp-block-group has-link-color\" style=\"padding-top:2em;padding-right:2em;padding-bottom:2em;padding-left:2em\"><!-- wp:heading {\"style\":{\"typography\":{\"fontWeight\":\"700\",\"fontSize\":\"48px\",\"lineHeight\":\"1.15\"}}} -->\n<h2 class=\"wp-block-heading\" style=\"font-size:48px;font-weight:700;line-height:1.15\">Opening <br>Party</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"style\":{\"elements\":{\"link\":{\"color\":{\"text\":\"#fffdc7\"}}},\"color\":{\"text\":\"#fffdc7\"}}} -->\n<p class=\"has-text-color has-link-color\" style=\"color:#fffdc7\"><strong><a href=\"#\">RSVP →</a></strong></p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div><figure class=\"wp-block-media-text__media\"><img src=\"https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-430289-jpeg-1-1024x1024.jpg\" alt=\"\" class=\"wp-image-590 size-full\" /></figure></div>\n<!-- /wp:media-text -->\";}i:8;O:8:\"stdClass\":7:{s:2:\"id\";i:573;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Image on solid color with description\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1952:\"\n<div class=\"wp-block-columns alignfull is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<div class=\"wp-block-cover has-background-dim\" style=\"background-color:#f6f6f6;min-height:600px;aspect-ratio:unset;\"><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-medium\"><img loading=\"lazy\" decoding=\"async\" width=\"263\" height=\"300\" src=\"https://s.w.org/patterns/files/2021/06/wire-sculpture-263x300.jpg\" alt=\"\" class=\"wp-image-571\" srcset=\"https://s.w.org/patterns/files/2021/06/wire-sculpture-263x300.jpg 263w, https://s.w.org/patterns/files/2021/06/wire-sculpture-898x1024.jpg 898w, https://s.w.org/patterns/files/2021/06/wire-sculpture-768x875.jpg 768w, https://s.w.org/patterns/files/2021/06/wire-sculpture-1347x1536.jpg 1347w, https://s.w.org/patterns/files/2021/06/wire-sculpture.jpg 1658w\" sizes=\"auto, (max-width: 263px) 100vw, 263px\" /></figure></div>\n</div></div>\n</div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:1em;padding-right:1em;padding-bottom:1em;padding-left:1em\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:320px\">\n<p class=\"has-small-font-size wp-block-paragraph\" style=\"line-height:1.6\"><strong>Airplane</strong></p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\" style=\"line-height:1.6\">Copper wire, wood base. I created this piece in late 2008. For this work, I aimed to convey both the industrial heaviness of an airplane, but also the cloudlike floating quality you feel when you’re in one.</p>\n</div>\n</div>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:38:\"Image on solid color with description.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:61:\"core/column,core/columns,core/cover,core/image,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"images\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1826:\"<!-- wp:columns {\"align\":\"full\"} -->\n<div class=\"wp-block-columns alignfull\"><!-- wp:column {\"width\":\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:cover {\"customOverlayColor\":\"#f6f6f6\",\"minHeight\":600} -->\n<div class=\"wp-block-cover has-background-dim\" style=\"background-color:#f6f6f6;min-height:600px\"><div class=\"wp-block-cover__inner-container\"><!-- wp:image {\"align\":\"center\",\"id\":571,\"sizeSlug\":\"medium\",\"linkDestination\":\"none\"} -->\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-medium\"><img src=\"https://s.w.org/patterns/files/2021/06/wire-sculpture-263x300.jpg\" alt=\"\" class=\"wp-image-571\" /></figure></div>\n<!-- /wp:image --></div></div>\n<!-- /wp:cover --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"verticalAlignment\":\"center\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"1em\",\"right\":\"1em\",\"bottom\":\"1em\",\"left\":\"1em\"}}}} -->\n<div class=\"wp-block-column is-vertically-aligned-center\" style=\"padding-top:1em;padding-right:1em;padding-bottom:1em;padding-left:1em\"><!-- wp:columns -->\n<div class=\"wp-block-columns\"><!-- wp:column {\"width\":\"320px\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:320px\"><!-- wp:paragraph {\"style\":{\"typography\":{\"lineHeight\":\"1.6\"}},\"fontSize\":\"small\"} -->\n<p class=\"has-small-font-size\" style=\"line-height:1.6\"><strong>Airplane</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"style\":{\"typography\":{\"lineHeight\":\"1.6\"}},\"fontSize\":\"small\"} -->\n<p class=\"has-small-font-size\" style=\"line-height:1.6\">Copper wire, wood base. I created this piece in late 2008. For this work, I aimed to convey both the industrial heaviness of an airplane, but also the cloudlike floating quality you feel when you’re in one.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\";}i:9;O:8:\"stdClass\":7:{s:2:\"id\";i:526;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:31:\"Offset images with descriptions\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3150:\"\n<div class=\"wp-block-columns alignwide are-vertically-aligned-top is-layout-flex wp-container-core-columns-is-layout-6cb89fa2 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group wp-container-content-231d8afb is-vertical is-content-justification-left is-nowrap is-layout-flex wp-container-core-group-is-layout-bd8ca46f wp-block-group-is-layout-flex\" style=\"margin-top:0;margin-bottom:0\">\n<figure class=\"wp-block-image size-large wp-container-content-0733e5d0\"><img loading=\"lazy\" decoding=\"async\" width=\"793\" height=\"1024\" src=\"https://s.w.org/patterns/files/2021/06/Iris-793x1024.jpg\" alt=\"Beautiful photomechanical prints of White Irises (1887-1897) by Ogawa Kazumasa. Original from The Rijksmuseum. \" class=\"wp-image-525\" srcset=\"https://s.w.org/patterns/files/2021/06/Iris-793x1024.jpg 793w, https://s.w.org/patterns/files/2021/06/Iris-232x300.jpg 232w, https://s.w.org/patterns/files/2021/06/Iris-768x992.jpg 768w, https://s.w.org/patterns/files/2021/06/Iris-1189x1536.jpg 1189w, https://s.w.org/patterns/files/2021/06/Iris-1586x2048.jpg 1586w, https://s.w.org/patterns/files/2021/06/Iris.jpg 1920w\" sizes=\"auto, (max-width: 793px) 100vw, 793px\" /></figure>\n\n\n\n<div class=\"wp-block-group is-vertical is-nowrap is-layout-flex wp-container-core-group-is-layout-dc6934dc wp-block-group-is-layout-flex\">\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>White Irises</strong></p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ogawa Kazumasa</p>\n</div>\n</div>\n</div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-group wp-container-content-231d8afb is-vertical is-layout-flex wp-container-core-group-is-layout-522a621f wp-block-group-is-layout-flex\" style=\"margin-top:0;margin-bottom:0\">\n<div class=\"wp-block-group is-vertical is-nowrap is-layout-flex wp-container-core-group-is-layout-dc6934dc wp-block-group-is-layout-flex\">\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong>Cherry Blossom</strong></p>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\">Ogawa Kazumasa</p>\n</div>\n\n\n\n<figure class=\"wp-block-image size-large\" style=\"font-size:14px\"><img loading=\"lazy\" decoding=\"async\" width=\"707\" height=\"1024\" src=\"https://s.w.org/patterns/files/2021/06/Cherry-Blossom-707x1024.jpg\" alt=\"Beautiful photomechanical prints of Cherry Blossom (1887-1897) by Ogawa Kazumasa. Original from The Rijksmuseum. \" class=\"wp-image-524\" srcset=\"https://s.w.org/patterns/files/2021/06/Cherry-Blossom-707x1024.jpg 707w, https://s.w.org/patterns/files/2021/06/Cherry-Blossom-207x300.jpg 207w, https://s.w.org/patterns/files/2021/06/Cherry-Blossom-768x1112.jpg 768w, https://s.w.org/patterns/files/2021/06/Cherry-Blossom-1061x1536.jpg 1061w, https://s.w.org/patterns/files/2021/06/Cherry-Blossom-1414x2048.jpg 1414w, https://s.w.org/patterns/files/2021/06/Cherry-Blossom-scaled.jpg 1768w\" sizes=\"auto, (max-width: 707px) 100vw, 707px\" /></figure>\n</div>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:58:\"Two offset columns with images and titles within each one.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:73:\"core/column,core/columns,core/group,core/image,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"gallery\";i:1;s:6:\"images\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:2930:\"<!-- wp:columns {\"verticalAlignment\":\"top\",\"align\":\"wide\",\"style\":{\"spacing\":{\"blockGap\":{\"top\":\"var:preset|spacing|40\",\"left\":\"var:preset|spacing|40\"}}}} -->\n<div class=\"wp-block-columns alignwide are-vertically-aligned-top\"><!-- wp:column {\"verticalAlignment\":\"top\"} -->\n<div class=\"wp-block-column is-vertically-aligned-top\"><!-- wp:group {\"style\":{\"layout\":{\"selfStretch\":\"fixed\",\"flexSize\":\"480px\"},\"spacing\":{\"margin\":{\"top\":\"0\",\"bottom\":\"0\"}}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"flexWrap\":\"nowrap\",\"justifyContent\":\"left\"}} -->\n<div class=\"wp-block-group\" style=\"margin-top:0;margin-bottom:0\"><!-- wp:image {\"id\":525,\"sizeSlug\":\"large\",\"linkDestination\":\"none\",\"style\":{\"layout\":{\"selfStretch\":\"fixed\",\"flexSize\":\"50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"}}} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://s.w.org/patterns/files/2021/06/Iris-793x1024.jpg\" alt=\"Beautiful photomechanical prints of White Irises (1887-1897) by Ogawa Kazumasa. Original from The Rijksmuseum. \" class=\"wp-image-525\" /></figure>\n<!-- /wp:image -->\n\n<!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"0\"}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"flexWrap\":\"nowrap\"}} -->\n<div class=\"wp-block-group\"><!-- wp:paragraph {\"fontSize\":\"medium\"} -->\n<p class=\"has-medium-font-size\"><strong>White Irises</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"fontSize\":\"small\"} -->\n<p class=\"has-small-font-size\">Ogawa Kazumasa</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"verticalAlignment\":\"top\"} -->\n<div class=\"wp-block-column is-vertically-aligned-top\"><!-- wp:group {\"style\":{\"layout\":{\"selfStretch\":\"fixed\",\"flexSize\":\"480px\"},\"spacing\":{\"margin\":{\"top\":\"0\",\"bottom\":\"0\"}}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\"}} -->\n<div class=\"wp-block-group\" style=\"margin-top:0;margin-bottom:0\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"0\"}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"flexWrap\":\"nowrap\"}} -->\n<div class=\"wp-block-group\"><!-- wp:spacer {\"height\":\"80px\"} -->\n<div style=\"height:80px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:paragraph {\"fontSize\":\"medium\"} -->\n<p class=\"has-medium-font-size\"><strong>Cherry Blossom</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"fontSize\":\"small\"} -->\n<p class=\"has-small-font-size\">Ogawa Kazumasa</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group -->\n\n<!-- wp:image {\"id\":524,\"sizeSlug\":\"large\",\"linkDestination\":\"none\",\"style\":{\"typography\":{\"fontSize\":\"14px\"}}} -->\n<figure class=\"wp-block-image size-large\" style=\"font-size:14px\"><img src=\"https://s.w.org/patterns/files/2021/06/Cherry-Blossom-707x1024.jpg\" alt=\"Beautiful photomechanical prints of Cherry Blossom (1887-1897) by Ogawa Kazumasa. Original from The Rijksmuseum. \" class=\"wp-image-524\" /></figure>\n<!-- /wp:image --></div>\n<!-- /wp:group --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\";}i:10;O:8:\"stdClass\":7:{s:2:\"id\";i:521;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:45:\"Image with description below and to the right\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1783:\"\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"></div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-539759-jpeg-1-1024x1024.jpg\" alt=\"Vintage Cupid Illustration\" class=\"wp-image-522\" srcset=\"https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-539759-jpeg-1-1024x1024.jpg 1024w, https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-539759-jpeg-1-300x300.jpg 300w, https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-539759-jpeg-1-150x150.jpg 150w, https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-539759-jpeg-1-768x768.jpg 768w, https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-539759-jpeg-1.jpg 1510w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></figure>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"></div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"></div>\n</div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"></div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"wp-block-paragraph\" style=\"font-size:14px\"><strong>Cupid in Flight</strong><br>48” x 48” Giclee print on archival paper.</p>\n</div>\n</div>\n\n\n\n<p class=\"wp-block-paragraph\"></p>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:46:\"Image with description below and to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:50:\"core/column,core/columns,core/image,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"images\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1241:\"<!-- wp:columns -->\n<div class=\"wp-block-columns\"><!-- wp:column {\"width\":\"10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"></div>\n<!-- /wp:column -->\n\n<!-- wp:column -->\n<div class=\"wp-block-column\"><!-- wp:image {\"id\":522,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://s.w.org/patterns/files/2021/06/image-from-rawpixel-id-539759-jpeg-1-1024x1024.jpg\" alt=\"Vintage Cupid Illustration\" class=\"wp-image-522\" /></figure>\n<!-- /wp:image --></div>\n<!-- /wp:column -->\n\n<!-- wp:column -->\n<div class=\"wp-block-column\"></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"width\":\"10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\n\n<!-- wp:columns -->\n<div class=\"wp-block-columns\"><!-- wp:column -->\n<div class=\"wp-block-column\"></div>\n<!-- /wp:column -->\n\n<!-- wp:column -->\n<div class=\"wp-block-column\"><!-- wp:paragraph {\"style\":{\"typography\":{\"fontSize\":\"14px\"}}} -->\n<p style=\"font-size:14px\"><strong>Cupid in Flight</strong><br>48” x 48” Giclee print on archival paper.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\";}i:11;O:8:\"stdClass\":7:{s:2:\"id\";i:502;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:13:\"Event details\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1773:\"\n<figure class=\"wp-block-image alignwide size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1227\" src=\"https://s.w.org/patterns/files/2021/06/Group-17-scaled.jpg\" alt=\"Image of a woman being carried through the air by swans.\" class=\"wp-image-501\" srcset=\"https://s.w.org/patterns/files/2021/06/Group-17-scaled.jpg 2560w, https://s.w.org/patterns/files/2021/06/Group-17-300x144.jpg 300w, https://s.w.org/patterns/files/2021/06/Group-17-1024x491.jpg 1024w, https://s.w.org/patterns/files/2021/06/Group-17-768x368.jpg 768w, https://s.w.org/patterns/files/2021/06/Group-17-1536x736.jpg 1536w, https://s.w.org/patterns/files/2021/06/Group-17-2048x981.jpg 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" /></figure>\n\n\n\n<div class=\"wp-block-columns alignwide are-vertically-aligned-center is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"wp-block-paragraph\" style=\"line-height:2\"><strong>Location:</strong><br>82 Main St. Brooklyn, NY</p>\n</div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"wp-block-paragraph\" style=\"line-height:2\"><strong>Date:</strong><br>October 24, 2021</p>\n</div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link has-text-color has-background wp-element-button\" style=\"color:#efefef;background-color:#262626\">Purchase Tickets</a></div>\n</div>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:14:\"Event details.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:75:\"core/button,core/buttons,core/column,core/columns,core/image,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:14:\"call-to-action\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1642:\"<!-- wp:image {\"align\":\"wide\",\"id\":501,\"sizeSlug\":\"full\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image alignwide size-full\"><img src=\"https://s.w.org/patterns/files/2021/06/Group-17-scaled.jpg\" alt=\"Image of a woman being carried through the air by swans.\" class=\"wp-image-501\" /></figure>\n<!-- /wp:image -->\n\n<!-- wp:columns {\"verticalAlignment\":\"center\",\"align\":\"wide\"} -->\n<div class=\"wp-block-columns alignwide are-vertically-aligned-center\"><!-- wp:column {\"verticalAlignment\":\"center\"} -->\n<div class=\"wp-block-column is-vertically-aligned-center\"><!-- wp:paragraph {\"style\":{\"typography\":{\"lineHeight\":\"2\"}}} -->\n<p style=\"line-height:2\"><strong>Location:</strong><br>82 Main St. Brooklyn, NY</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"verticalAlignment\":\"center\"} -->\n<div class=\"wp-block-column is-vertically-aligned-center\"><!-- wp:paragraph {\"style\":{\"typography\":{\"lineHeight\":\"2\"}}} -->\n<p style=\"line-height:2\"><strong>Date:</strong><br>October 24, 2021</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"verticalAlignment\":\"center\"} -->\n<div class=\"wp-block-column is-vertically-aligned-center\"><!-- wp:buttons -->\n<div class=\"wp-block-buttons\"><!-- wp:button {\"width\":100,\"style\":{\"color\":{\"background\":\"#262626\",\"text\":\"#efefef\"}}} -->\n<div class=\"wp-block-button has-custom-width wp-block-button__width-100\"><a class=\"wp-block-button__link has-text-color has-background wp-element-button\" style=\"color:#efefef;background-color:#262626\">Purchase Tickets</a></div>\n<!-- /wp:button --></div>\n<!-- /wp:buttons --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\";}i:12;O:8:\"stdClass\":7:{s:2:\"id\";i:199;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:34:\"Three columns with images and text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3680:\"\n<div class=\"wp-block-group alignfull has-background is-layout-flow wp-block-group-is-layout-flow\" style=\"background-color:#f5eac1;padding-top:6vw;padding-right:6vw;padding-bottom:6vw;padding-left:6vw\">\n<div class=\"wp-block-group is-vertical is-nowrap is-layout-flex wp-container-core-group-is-layout-f19201c6 wp-block-group-is-layout-flex\" style=\"padding-right:0;padding-left:0\">\n<h6 class=\"wp-block-heading has-text-color\" id=\"ecosystem\" style=\"color:#000000;font-size:16px\">ECOSYSTEM</h6>\n\n\n\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#000000;font-size:6vw;font-style:normal;font-weight:700;letter-spacing:0px;line-height:0.9;text-decoration:none;text-transform:none\">Positive growth.</p>\n</div>\n\n\n\n<div style=\"height:1vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<div class=\"wp-block-group alignwide is-vertical is-nowrap is-layout-flex wp-container-core-group-is-layout-493f451d wp-block-group-is-layout-flex\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-886db315 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.38{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#000000;font-size:17px\"><em>Nature</em>, in the common sense, refers to essences unchanged by man; space, the air, the river, the leaf.&nbsp;<em>Art</em>&nbsp;is applied to the mixture of his will with the same things, as in a house, a canal, a statue, a picture. </p>\n\n\n\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#000000;font-size:17px\">But his operations taken together are so insignificant, a little chipping, baking, patching, and washing, that in an impression so grand as that of the world on the human mind, they do not vary the result.</p>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<div style=\"height:2vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/outside-01.jpg\" alt=\"The sun setting through a dense forest.\" /></figure>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.62{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/outside-02.jpg\" alt=\"Wind turbines standing on a grassy plain, against a blue sky.\" /></figure>\n</div>\n</div>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-90cda669 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:69{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/outside-03.jpg\" alt=\"The sun shining over a ridge leading down into the shore. In the distance, a car drives down a road.\" /></figure>\n</div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<div style=\"height:2vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#000000;font-size:17px\">Undoubtedly we have no questions to ask which are unanswerable. We must trust the perfection of the creation so far, as to believe that whatever curiosity the order of things has awakened in our minds, the order of things can satisfy. Every man&#8217;s condition is a solution in hieroglyphic to those inquiries he would put.</p>\n</div>\n</div>\n</div>\n</div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:77:\"Three columns with images and text, with vertical spacing for an offset look.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:86:\"core/column,core/columns,core/group,core/heading,core/image,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:4:{i:0;s:7:\"columns\";i:1;s:7:\"gallery\";i:2;s:6:\"images\";i:3;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:5124:\"<!-- wp:group {\"align\":\"full\",\"style\":{\"color\":{\"background\":\"#f5eac1\"},\"spacing\":{\"padding\":{\"top\":\"6vw\",\"bottom\":\"6vw\",\"left\":\"6vw\",\"right\":\"6vw\"}}},\"layout\":{\"type\":\"default\"}} -->\n<div class=\"wp-block-group alignfull has-background\" style=\"background-color:#f5eac1;padding-top:6vw;padding-right:6vw;padding-bottom:6vw;padding-left:6vw\"><!-- wp:group {\"style\":{\"spacing\":{\"blockGap\":\"16px\",\"padding\":{\"right\":\"0\",\"left\":\"0\"}}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"flexWrap\":\"nowrap\"}} -->\n<div class=\"wp-block-group\" style=\"padding-right:0;padding-left:0\"><!-- wp:heading {\"level\":6,\"style\":{\"color\":{\"text\":\"#000000\"},\"typography\":{\"fontSize\":\"16px\"}},\"anchor\":\"ecosystem\"} -->\n<h6 class=\"wp-block-heading has-text-color\" id=\"ecosystem\" style=\"color:#000000;font-size:16px\">ECOSYSTEM</h6>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"style\":{\"typography\":{\"lineHeight\":\"0.9\",\"fontSize\":\"6vw\",\"fontStyle\":\"normal\",\"fontWeight\":\"700\",\"textTransform\":\"none\",\"textDecoration\":\"none\",\"letterSpacing\":\"0px\"},\"color\":{\"text\":\"#000000\"}}} -->\n<p class=\"has-text-color\" style=\"color:#000000;font-size:6vw;font-style:normal;font-weight:700;letter-spacing:0px;line-height:0.9;text-decoration:none;text-transform:none\">Positive growth.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group -->\n\n<!-- wp:spacer {\"height\":\"1vw\"} -->\n<div style=\"height:1vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"blockGap\":\"3vw\",\"padding\":{\"top\":\"0\",\"bottom\":\"0\",\"left\":\"0\",\"right\":\"0\"}}},\"layout\":{\"type\":\"flex\",\"orientation\":\"vertical\",\"flexWrap\":\"nowrap\"}} -->\n<div class=\"wp-block-group alignwide\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\"><!-- wp:columns {\"align\":\"wide\",\"style\":{\"spacing\":{\"blockGap\":{\"top\":\"3vw\",\"left\":\"3vw\"}}}} -->\n<div class=\"wp-block-columns alignwide\"><!-- wp:column {\"width\":\"33.38{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:33.38{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:paragraph {\"style\":{\"color\":{\"text\":\"#000000\"},\"typography\":{\"fontSize\":\"17px\"}}} -->\n<p class=\"has-text-color\" style=\"color:#000000;font-size:17px\"><em>Nature</em>, in the common sense, refers to essences unchanged by man; space, the air, the river, the leaf.&nbsp;<em>Art</em>&nbsp;is applied to the mixture of his will with the same things, as in a house, a canal, a statue, a picture. </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph {\"style\":{\"color\":{\"text\":\"#000000\"},\"typography\":{\"fontSize\":\"17px\"}}} -->\n<p class=\"has-text-color\" style=\"color:#000000;font-size:17px\">But his operations taken together are so insignificant, a little chipping, baking, patching, and washing, that in an impression so grand as that of the world on the human mind, they do not vary the result.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"width\":\"33{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:33{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:spacer {\"height\":\"2vw\"} -->\n<div style=\"height:2vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://s.w.org/images/core/5.8/outside-01.jpg\" alt=\"The sun setting through a dense forest.\" /></figure>\n<!-- /wp:image --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"width\":\"33.62{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:33.62{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://s.w.org/images/core/5.8/outside-02.jpg\" alt=\"Wind turbines standing on a grassy plain, against a blue sky.\" /></figure>\n<!-- /wp:image --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns -->\n\n<!-- wp:columns {\"align\":\"wide\",\"style\":{\"spacing\":{\"blockGap\":{\"left\":\"3vw\"}}}} -->\n<div class=\"wp-block-columns alignwide\"><!-- wp:column {\"width\":\"69{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:69{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:image {\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://s.w.org/images/core/5.8/outside-03.jpg\" alt=\"The sun shining over a ridge leading down into the shore. In the distance, a car drives down a road.\" /></figure>\n<!-- /wp:image --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"verticalAlignment\":\"center\",\"width\":\"33{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column is-vertically-aligned-center\" style=\"flex-basis:33{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:spacer {\"height\":\"2vw\"} -->\n<div style=\"height:2vw\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:paragraph {\"style\":{\"color\":{\"text\":\"#000000\"},\"typography\":{\"fontSize\":\"17px\"}}} -->\n<p class=\"has-text-color\" style=\"color:#000000;font-size:17px\">Undoubtedly we have no questions to ask which are unanswerable. We must trust the perfection of the creation so far, as to believe that whatever curiosity the order of things has awakened in our minds, the order of things can satisfy. Every man\'s condition is a solution in hieroglyphic to those inquiries he would put.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns --></div>\n<!-- /wp:group --></div>\n<!-- /wp:group -->\";}i:13;O:8:\"stdClass\":7:{s:2:\"id\";i:192;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Media and text with image on the left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:630:\"\n<div class=\"wp-block-media-text alignfull is-stacked-on-mobile is-vertically-aligned-center\"><figure class=\"wp-block-media-text__media\"><img decoding=\"async\" src=\"https://s.w.org/images/core/5.8/architecture-04.jpg\" alt=\"Close-up, abstract view of architecture.\" /></figure><div class=\"wp-block-media-text__content\">\n<h3 class=\"wp-block-heading has-text-align-center has-text-color\" style=\"color:#000000\"><strong>Open Spaces</strong></h3>\n\n\n\n<p class=\"has-text-align-center has-extra-small-font-size wp-block-paragraph\"><a href=\"#\">See case study <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">↗</span></a></p>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:66:\"Media and text block with image to the left and text to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:43:\"core/heading,core/media-text,core/paragraph\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:844:\"<!-- wp:media-text {\"align\":\"full\",\"mediaType\":\"image\",\"verticalAlignment\":\"center\"} -->\n<div class=\"wp-block-media-text alignfull is-stacked-on-mobile is-vertically-aligned-center\"><figure class=\"wp-block-media-text__media\"><img src=\"https://s.w.org/images/core/5.8/architecture-04.jpg\" alt=\"Close-up, abstract view of architecture.\" /></figure><div class=\"wp-block-media-text__content\"><!-- wp:heading {\"textAlign\":\"center\",\"level\":3,\"style\":{\"color\":{\"text\":\"#000000\"}}} -->\n<h3 class=\"wp-block-heading has-text-align-center has-text-color\" style=\"color:#000000\"><strong>Open Spaces</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"align\":\"center\",\"fontSize\":\"extra-small\"} -->\n<p class=\"has-text-align-center has-extra-small-font-size\"><a href=\"#\">See case study ↗</a></p>\n<!-- /wp:paragraph --></div></div>\n<!-- /wp:media-text -->\";}i:14;O:8:\"stdClass\":7:{s:2:\"id\";i:185;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:35:\"Large header with left-aligned text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1388:\"\n<div class=\"wp-block-cover alignfull\" style=\"min-height:800px;aspect-ratio:unset;\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-60 has-background-dim\"></span><img decoding=\"async\" class=\"wp-block-cover__image-background\" alt=\"\" src=\"https://s.w.org/images/core/5.8/forest.jpg\" data-object-fit=\"cover\" /><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<h2 class=\"wp-block-heading alignwide has-text-color\" style=\"color:#ffe074;font-size:64px\">Forest.</h2>\n\n\n\n<div class=\"wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-0e47273b wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<div style=\"height:330px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n\n\n\n<p class=\"has-text-color wp-block-paragraph\" style=\"color:#ffe074;font-size:12px;line-height:1.3\"><em>Even a child knows how valuable the forest is. The fresh, breathtaking smell of trees. Echoing birds flying above that dense magnitude. A stable climate, a sustainable diverse life and a source of culture. Yet, forests and other ecosystems hang in the balance, threatened to become croplands, pasture, and plantations.</em></p>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"></div>\n</div>\n</div></div>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:29:\"Cover image with quote on top\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:75:\"core/column,core/columns,core/cover,core/heading,core/paragraph,core/spacer\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1698:\"<!-- wp:cover {\"url\":\"https://s.w.org/images/core/5.8/forest.jpg\",\"dimRatio\":60,\"minHeight\":800,\"align\":\"full\"} -->\n<div class=\"wp-block-cover alignfull\" style=\"min-height:800px\"><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim-60 has-background-dim\"></span><img class=\"wp-block-cover__image-background\" alt=\"\" src=\"https://s.w.org/images/core/5.8/forest.jpg\" data-object-fit=\"cover\" /><div class=\"wp-block-cover__inner-container\"><!-- wp:heading {\"align\":\"wide\",\"style\":{\"color\":{\"text\":\"#ffe074\"},\"typography\":{\"fontSize\":\"64px\"}}} -->\n<h2 class=\"wp-block-heading alignwide has-text-color\" style=\"color:#ffe074;font-size:64px\">Forest.</h2>\n<!-- /wp:heading -->\n\n<!-- wp:columns {\"align\":\"wide\"} -->\n<div class=\"wp-block-columns alignwide\"><!-- wp:column {\"width\":\"55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"} -->\n<div class=\"wp-block-column\" style=\"flex-basis:55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><!-- wp:spacer {\"height\":\"330px\"} -->\n<div style=\"height:330px\" aria-hidden=\"true\" class=\"wp-block-spacer\"></div>\n<!-- /wp:spacer -->\n\n<!-- wp:paragraph {\"style\":{\"color\":{\"text\":\"#ffe074\"},\"typography\":{\"lineHeight\":\"1.3\",\"fontSize\":\"12px\"}}} -->\n<p class=\"has-text-color\" style=\"color:#ffe074;font-size:12px;line-height:1.3\"><em>Even a child knows how valuable the forest is. The fresh, breathtaking smell of trees. Echoing birds flying above that dense magnitude. A stable climate, a sustainable diverse life and a source of culture. Yet, forests and other ecosystems hang in the balance, threatened to become croplands, pasture, and plantations.</em></p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:column -->\n\n<!-- wp:column -->\n<div class=\"wp-block-column\"></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns --></div></div>\n<!-- /wp:cover -->\";}i:15;O:8:\"stdClass\":7:{s:2:\"id\";i:184;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:7:\"Heading\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:526:\"\n<h2 class=\"alignwide wp-block-heading\" id=\"we-re-a-studio-in-berlin-with-an-international-practice-in-architecture-urban-planning-and-interior-design-we-believe-in-sharing-knowledge-and-promoting-dialogue-to-increase-the-creative-potential-of-collaboration\" style=\"font-size:48px;line-height:1.1\">We&#8217;re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.</h2>\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":8:{s:13:\"wpop_keywords\";s:17:\"large text, title\";s:16:\"wpop_description\";s:12:\"Heading text\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:1:{i:0;s:12:\"core/heading\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:12:\"core/heading\";s:9:\"footnotes\";s:0:\"\";}s:14:\"category_slugs\";a:1:{i:0;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:621:\"<!-- wp:heading {\"align\":\"wide\",\"style\":{\"typography\":{\"fontSize\":\"48px\",\"lineHeight\":\"1.1\"}}} -->\n<h2 class=\"alignwide\" id=\"we-re-a-studio-in-berlin-with-an-international-practice-in-architecture-urban-planning-and-interior-design-we-believe-in-sharing-knowledge-and-promoting-dialogue-to-increase-the-creative-potential-of-collaboration\" style=\"font-size:48px;line-height:1.1\">We\'re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.</h2>\n<!-- /wp:heading -->\";}}', 'off');
INSERT INTO `wp_options` VALUES ('976', '_transient_timeout_elementor_remote_info_api_data_4.1.4', '1783425280', 'off');
INSERT INTO `wp_options` VALUES ('977', '_transient_elementor_remote_info_api_data_4.1.4', 'a:4:{s:9:\"timestamp\";s:10:\"1783380372\";s:14:\"upgrade_notice\";a:3:{s:7:\"version\";s:5:\"2.0.0\";s:7:\"message\";s:0:\"\";s:11:\"update_link\";s:0:\"\";}s:11:\"pro_widgets\";a:82:{i:0;a:4:{s:4:\"name\";s:6:\"search\";s:5:\"title\";s:6:\"Search\";s:4:\"icon\";s:17:\"eicon-site-search\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:1;a:4:{s:4:\"name\";s:5:\"posts\";s:5:\"title\";s:5:\"Posts\";s:4:\"icon\";s:15:\"eicon-post-list\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:2;a:4:{s:4:\"name\";s:9:\"portfolio\";s:5:\"title\";s:9:\"Portfolio\";s:4:\"icon\";s:18:\"eicon-gallery-grid\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:3;a:4:{s:4:\"name\";s:17:\"link-in-bio-var-2\";s:5:\"title\";s:7:\"Classic\";s:4:\"icon\";s:19:\"eicon-site-identity\";s:10:\"categories\";s:15:\"[\"link-in-bio\"]\";}i:4;a:4:{s:4:\"name\";s:9:\"mega-menu\";s:5:\"title\";s:4:\"Menu\";s:4:\"icon\";s:15:\"eicon-mega-menu\";s:10:\"categories\";s:33:\"[\"pro-elements\",\"theme-elements\"]\";}i:5;a:4:{s:4:\"name\";s:17:\"link-in-bio-var-3\";s:5:\"title\";s:8:\"Showcase\";s:4:\"icon\";s:19:\"eicon-site-identity\";s:10:\"categories\";s:15:\"[\"link-in-bio\"]\";}i:6;a:4:{s:4:\"name\";s:4:\"form\";s:5:\"title\";s:4:\"Form\";s:4:\"icon\";s:21:\"eicon-form-horizontal\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:7;a:4:{s:4:\"name\";s:17:\"link-in-bio-var-4\";s:5:\"title\";s:5:\"Links\";s:4:\"icon\";s:19:\"eicon-site-identity\";s:10:\"categories\";s:15:\"[\"link-in-bio\"]\";}i:8;a:4:{s:4:\"name\";s:9:\"loop-grid\";s:5:\"title\";s:9:\"Loop Grid\";s:4:\"icon\";s:18:\"eicon-loop-builder\";s:10:\"categories\";s:33:\"[\"pro-elements\",\"theme-elements\"]\";}i:9;a:4:{s:4:\"name\";s:17:\"link-in-bio-var-5\";s:5:\"title\";s:8:\"Services\";s:4:\"icon\";s:19:\"eicon-site-identity\";s:10:\"categories\";s:15:\"[\"link-in-bio\"]\";}i:10;a:4:{s:4:\"name\";s:13:\"loop-carousel\";s:5:\"title\";s:13:\"Loop Carousel\";s:4:\"icon\";s:19:\"eicon-carousel-loop\";s:10:\"categories\";s:33:\"[\"pro-elements\",\"theme-elements\"]\";}i:11;a:4:{s:4:\"name\";s:17:\"link-in-bio-var-6\";s:5:\"title\";s:13:\"Portfolio Bio\";s:4:\"icon\";s:19:\"eicon-site-identity\";s:10:\"categories\";s:15:\"[\"link-in-bio\"]\";}i:12;a:4:{s:4:\"name\";s:7:\"gallery\";s:5:\"title\";s:7:\"Gallery\";s:4:\"icon\";s:23:\"eicon-gallery-justified\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:13;a:4:{s:4:\"name\";s:17:\"link-in-bio-var-7\";s:5:\"title\";s:13:\"Business Card\";s:4:\"icon\";s:19:\"eicon-site-identity\";s:10:\"categories\";s:15:\"[\"link-in-bio\"]\";}i:14;a:4:{s:4:\"name\";s:17:\"animated-headline\";s:5:\"title\";s:17:\"Animated Headline\";s:4:\"icon\";s:23:\"eicon-animated-headline\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:15;a:4:{s:4:\"name\";s:10:\"price-list\";s:5:\"title\";s:10:\"Price List\";s:4:\"icon\";s:16:\"eicon-price-list\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:16;a:4:{s:4:\"name\";s:11:\"price-table\";s:5:\"title\";s:11:\"Price Table\";s:4:\"icon\";s:17:\"eicon-price-table\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:17;a:4:{s:4:\"name\";s:8:\"flip-box\";s:5:\"title\";s:8:\"Flip Box\";s:4:\"icon\";s:14:\"eicon-flip-box\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:18;a:4:{s:4:\"name\";s:14:\"call-to-action\";s:5:\"title\";s:14:\"Call to Action\";s:4:\"icon\";s:20:\"eicon-image-rollover\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:19;a:4:{s:4:\"name\";s:14:\"media-carousel\";s:5:\"title\";s:14:\"Media Carousel\";s:4:\"icon\";s:20:\"eicon-media-carousel\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:20;a:4:{s:4:\"name\";s:15:\"nested-carousel\";s:5:\"title\";s:8:\"Carousel\";s:4:\"icon\";s:21:\"eicon-nested-carousel\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:21;a:4:{s:4:\"name\";s:10:\"off-canvas\";s:5:\"title\";s:10:\"Off-Canvas\";s:4:\"icon\";s:16:\"eicon-off-canvas\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:22;a:4:{s:4:\"name\";s:9:\"countdown\";s:5:\"title\";s:9:\"Countdown\";s:4:\"icon\";s:15:\"eicon-countdown\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:23;a:4:{s:4:\"name\";s:13:\"share-buttons\";s:5:\"title\";s:13:\"Share Buttons\";s:4:\"icon\";s:11:\"eicon-share\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:24;a:4:{s:4:\"name\";s:10:\"blockquote\";s:5:\"title\";s:10:\"Blockquote\";s:4:\"icon\";s:16:\"eicon-blockquote\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:25;a:4:{s:4:\"name\";s:6:\"lottie\";s:5:\"title\";s:6:\"Lottie\";s:4:\"icon\";s:12:\"eicon-lottie\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:26;a:4:{s:4:\"name\";s:7:\"hotspot\";s:5:\"title\";s:7:\"Hotspot\";s:4:\"icon\";s:19:\"eicon-image-hotspot\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:27;a:4:{s:4:\"name\";s:13:\"paypal-button\";s:5:\"title\";s:13:\"PayPal Button\";s:4:\"icon\";s:19:\"eicon-paypal-button\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:28;a:4:{s:4:\"name\";s:14:\"code-highlight\";s:5:\"title\";s:14:\"Code Highlight\";s:4:\"icon\";s:20:\"eicon-code-highlight\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:29;a:4:{s:4:\"name\";s:14:\"video-playlist\";s:5:\"title\";s:14:\"Video Playlist\";s:4:\"icon\";s:20:\"eicon-video-playlist\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:30;a:4:{s:4:\"name\";s:8:\"template\";s:5:\"title\";s:8:\"Template\";s:4:\"icon\";s:19:\"eicon-document-file\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:31;a:4:{s:4:\"name\";s:13:\"stripe-button\";s:5:\"title\";s:13:\"Stripe Button\";s:4:\"icon\";s:19:\"eicon-stripe-button\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:32;a:4:{s:4:\"name\";s:16:\"progress-tracker\";s:5:\"title\";s:16:\"Progress Tracker\";s:4:\"icon\";s:22:\"eicon-progress-tracker\";s:10:\"categories\";s:40:\"[\"pro-elements\",\"theme-elements-single\"]\";}i:33;a:4:{s:4:\"name\";s:8:\"nav-menu\";s:5:\"title\";s:8:\"Nav Menu\";s:4:\"icon\";s:14:\"eicon-nav-menu\";s:10:\"categories\";s:33:\"[\"pro-elements\",\"theme-elements\"]\";}i:34;a:4:{s:4:\"name\";s:17:\"table-of-contents\";s:5:\"title\";s:17:\"Table of Contents\";s:4:\"icon\";s:23:\"eicon-table-of-contents\";s:10:\"categories\";s:33:\"[\"pro-elements\",\"theme-elements\"]\";}i:35;a:4:{s:4:\"name\";s:5:\"login\";s:5:\"title\";s:5:\"Login\";s:4:\"icon\";s:15:\"eicon-lock-user\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:36;a:4:{s:4:\"name\";s:6:\"slides\";s:5:\"title\";s:6:\"Slides\";s:4:\"icon\";s:12:\"eicon-slides\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:37;a:4:{s:4:\"name\";s:20:\"testimonial-carousel\";s:5:\"title\";s:20:\"Testimonial Carousel\";s:4:\"icon\";s:26:\"eicon-testimonial-carousel\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:38;a:4:{s:4:\"name\";s:7:\"reviews\";s:5:\"title\";s:7:\"Reviews\";s:4:\"icon\";s:12:\"eicon-review\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:39;a:4:{s:4:\"name\";s:15:\"facebook-button\";s:5:\"title\";s:15:\"Facebook Button\";s:4:\"icon\";s:23:\"eicon-facebook-like-box\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:40;a:4:{s:4:\"name\";s:17:\"facebook-comments\";s:5:\"title\";s:17:\"Facebook Comments\";s:4:\"icon\";s:23:\"eicon-facebook-comments\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:41;a:4:{s:4:\"name\";s:14:\"facebook-embed\";s:5:\"title\";s:14:\"Facebook Embed\";s:4:\"icon\";s:14:\"eicon-fb-embed\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:42;a:4:{s:4:\"name\";s:13:\"facebook-page\";s:5:\"title\";s:13:\"Facebook Page\";s:4:\"icon\";s:13:\"eicon-fb-feed\";s:10:\"categories\";s:16:\"[\"pro-elements\"]\";}i:43;a:4:{s:4:\"name\";s:15:\"theme-site-logo\";s:5:\"title\";s:9:\"Site Logo\";s:4:\"icon\";s:15:\"eicon-site-logo\";s:10:\"categories\";s:18:\"[\"theme-elements\"]\";}i:44;a:4:{s:4:\"name\";s:16:\"theme-site-title\";s:5:\"title\";s:10:\"Site Title\";s:4:\"icon\";s:16:\"eicon-site-title\";s:10:\"categories\";s:18:\"[\"theme-elements\"]\";}i:45;a:4:{s:4:\"name\";s:16:\"theme-page-title\";s:5:\"title\";s:10:\"Page Title\";s:4:\"icon\";s:19:\"eicon-archive-title\";s:10:\"categories\";s:18:\"[\"theme-elements\"]\";}i:46;a:4:{s:4:\"name\";s:16:\"theme-post-title\";s:5:\"title\";s:10:\"Post Title\";s:4:\"icon\";s:16:\"eicon-post-title\";s:10:\"categories\";s:18:\"[\"theme-elements\"]\";}i:47;a:4:{s:4:\"name\";s:18:\"theme-post-excerpt\";s:5:\"title\";s:12:\"Post Excerpt\";s:4:\"icon\";s:18:\"eicon-post-excerpt\";s:10:\"categories\";s:18:\"[\"theme-elements\"]\";}i:48;a:4:{s:4:\"name\";s:25:\"theme-post-featured-image\";s:5:\"title\";s:14:\"Featured Image\";s:4:\"icon\";s:20:\"eicon-featured-image\";s:10:\"categories\";s:18:\"[\"theme-elements\"]\";}i:49;a:4:{s:4:\"name\";s:19:\"theme-archive-title\";s:5:\"title\";s:13:\"Archive Title\";s:4:\"icon\";s:19:\"eicon-archive-title\";s:10:\"categories\";s:18:\"[\"theme-elements\"]\";}i:50;a:4:{s:4:\"name\";s:13:\"archive-posts\";s:5:\"title\";s:13:\"Archive Posts\";s:4:\"icon\";s:19:\"eicon-archive-posts\";s:10:\"categories\";s:18:\"[\"theme-elements\"]\";}i:51;a:4:{s:4:\"name\";s:10:\"author-box\";s:5:\"title\";s:10:\"Author Box\";s:4:\"icon\";s:12:\"eicon-person\";s:10:\"categories\";s:18:\"[\"theme-elements\"]\";}i:52;a:4:{s:4:\"name\";s:13:\"post-comments\";s:5:\"title\";s:13:\"Post Comments\";s:4:\"icon\";s:14:\"eicon-comments\";s:10:\"categories\";s:18:\"[\"theme-elements\"]\";}i:53;a:4:{s:4:\"name\";s:15:\"post-navigation\";s:5:\"title\";s:15:\"Post Navigation\";s:4:\"icon\";s:21:\"eicon-post-navigation\";s:10:\"categories\";s:18:\"[\"theme-elements\"]\";}i:54;a:4:{s:4:\"name\";s:9:\"post-info\";s:5:\"title\";s:9:\"Post Info\";s:4:\"icon\";s:15:\"eicon-post-info\";s:10:\"categories\";s:18:\"[\"theme-elements\"]\";}i:55;a:4:{s:4:\"name\";s:7:\"sitemap\";s:5:\"title\";s:7:\"Sitemap\";s:4:\"icon\";s:13:\"eicon-sitemap\";s:10:\"categories\";s:18:\"[\"theme-elements\"]\";}i:56;a:4:{s:4:\"name\";s:11:\"breadcrumbs\";s:5:\"title\";s:11:\"Breadcrumbs\";s:4:\"icon\";s:11:\"eicon-yoast\";s:10:\"categories\";s:18:\"[\"theme-elements\"]\";}i:57;a:4:{s:4:\"name\";s:21:\"woocommerce-menu-cart\";s:5:\"title\";s:9:\"Menu Cart\";s:4:\"icon\";s:10:\"eicon-cart\";s:10:\"categories\";s:41:\"[\"theme-elements\",\"woocommerce-elements\"]\";}i:58;a:4:{s:4:\"name\";s:19:\"wc-archive-products\";s:5:\"title\";s:16:\"Archive Products\";s:4:\"icon\";s:14:\"eicon-products\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:59;a:4:{s:4:\"name\";s:31:\"woocommerce-archive-description\";s:5:\"title\";s:19:\"Archive Description\";s:4:\"icon\";s:25:\"eicon-product-description\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:60;a:4:{s:4:\"name\";s:20:\"woocommerce-products\";s:5:\"title\";s:8:\"Products\";s:4:\"icon\";s:14:\"eicon-products\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:61;a:4:{s:4:\"name\";s:22:\"woocommerce-breadcrumb\";s:5:\"title\";s:23:\"WooCommerce Breadcrumbs\";s:4:\"icon\";s:25:\"eicon-product-breadcrumbs\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:62;a:4:{s:4:\"name\";s:14:\"wc-add-to-cart\";s:5:\"title\";s:18:\"Custom Add To Cart\";s:4:\"icon\";s:17:\"eicon-woocommerce\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:63;a:4:{s:4:\"name\";s:11:\"wc-elements\";s:5:\"title\";s:17:\"WooCommerce Pages\";s:4:\"icon\";s:19:\"eicon-product-pages\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:64;a:4:{s:4:\"name\";s:13:\"wc-categories\";s:5:\"title\";s:18:\"Product Categories\";s:4:\"icon\";s:24:\"eicon-product-categories\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:65;a:4:{s:4:\"name\";s:25:\"woocommerce-product-title\";s:5:\"title\";s:13:\"Product Title\";s:4:\"icon\";s:19:\"eicon-product-title\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:66;a:4:{s:4:\"name\";s:26:\"woocommerce-product-images\";s:5:\"title\";s:14:\"Product Images\";s:4:\"icon\";s:20:\"eicon-product-images\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:67;a:4:{s:4:\"name\";s:25:\"woocommerce-product-price\";s:5:\"title\";s:13:\"Product Price\";s:4:\"icon\";s:19:\"eicon-product-price\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:68;a:4:{s:4:\"name\";s:31:\"woocommerce-product-add-to-cart\";s:5:\"title\";s:11:\"Add To Cart\";s:4:\"icon\";s:25:\"eicon-product-add-to-cart\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:69;a:4:{s:4:\"name\";s:26:\"woocommerce-product-rating\";s:5:\"title\";s:14:\"Product Rating\";s:4:\"icon\";s:20:\"eicon-product-rating\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:70;a:4:{s:4:\"name\";s:25:\"woocommerce-product-stock\";s:5:\"title\";s:13:\"Product Stock\";s:4:\"icon\";s:19:\"eicon-product-stock\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:71;a:4:{s:4:\"name\";s:24:\"woocommerce-product-meta\";s:5:\"title\";s:12:\"Product Meta\";s:4:\"icon\";s:18:\"eicon-product-meta\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:72;a:4:{s:4:\"name\";s:37:\"woocommerce-product-short-description\";s:5:\"title\";s:17:\"Short Description\";s:4:\"icon\";s:25:\"eicon-product-description\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:73;a:4:{s:4:\"name\";s:29:\"woocommerce-product-data-tabs\";s:5:\"title\";s:17:\"Product Data Tabs\";s:4:\"icon\";s:18:\"eicon-product-tabs\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:74;a:4:{s:4:\"name\";s:42:\"woocommerce-product-additional-information\";s:5:\"title\";s:22:\"Additional Information\";s:4:\"icon\";s:19:\" eicon-product-info\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:75;a:4:{s:4:\"name\";s:27:\"woocommerce-product-related\";s:5:\"title\";s:15:\"Product Related\";s:4:\"icon\";s:21:\"eicon-product-related\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:76;a:4:{s:4:\"name\";s:26:\"woocommerce-product-upsell\";s:5:\"title\";s:7:\"Upsells\";s:4:\"icon\";s:20:\"eicon-product-upsell\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:77;a:4:{s:4:\"name\";s:25:\"woocommerce-checkout-page\";s:5:\"title\";s:8:\"Checkout\";s:4:\"icon\";s:14:\"eicon-checkout\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:78;a:4:{s:4:\"name\";s:16:\"woocommerce-cart\";s:5:\"title\";s:4:\"Cart\";s:4:\"icon\";s:14:\"eicon-woo-cart\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:79;a:4:{s:4:\"name\";s:22:\"woocommerce-my-account\";s:5:\"title\";s:10:\"My Account\";s:4:\"icon\";s:16:\"eicon-my-account\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:80;a:4:{s:4:\"name\";s:28:\"woocommerce-purchase-summary\";s:5:\"title\";s:16:\"Purchase Summary\";s:4:\"icon\";s:22:\"eicon-purchase-summary\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}i:81;a:4:{s:4:\"name\";s:19:\"woocommerce-notices\";s:5:\"title\";s:19:\"WooCommerce Notices\";s:4:\"icon\";s:25:\"eicon-woocommerce-notices\";s:10:\"categories\";s:24:\"[\"woocommerce-elements\"]\";}}s:17:\"canary_deployment\";a:2:{s:11:\"plugin_info\";a:11:{s:2:\"id\";s:23:\"w.org/plugins/elementor\";s:4:\"slug\";s:9:\"elementor\";s:6:\"plugin\";s:23:\"elementor/elementor.php\";s:11:\"new_version\";s:5:\"3.6.0\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/plugin/elementor.3.6.0.zip\";s:3:\"url\";s:40:\"https://wordpress.org/plugins/elementor/\";s:5:\"icons\";a:3:{s:2:\"2x\";s:62:\"https://ps.w.org/elementor/assets/icon-256x256.png?rev=1427768\";s:2:\"1x\";s:54:\"https://ps.w.org/elementor/assets/icon.svg?rev=1426809\";s:3:\"svg\";s:54:\"https://ps.w.org/elementor/assets/icon.svg?rev=1426809\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:65:\"https://ps.w.org/elementor/assets/banner-1544x500.png?rev=1475479\";s:2:\"1x\";s:64:\"https://ps.w.org/elementor/assets/banner-772x250.png?rev=1475479\";}s:11:\"banners_rtl\";a:0:{}s:6:\"tested\";s:3:\"7.0\";s:12:\"requires_php\";s:3:\"5.6\";}s:10:\"conditions\";a:0:{}}}', 'off');
INSERT INTO `wp_options` VALUES ('981', '_site_transient_timeout_theme_roots', '1783383883', 'off');
INSERT INTO `wp_options` VALUES ('982', '_site_transient_theme_roots', 'a:13:{s:5:\"astra\";s:7:\"/themes\";s:9:\"city-blog\";s:7:\"/themes\";s:13:\"generatepress\";s:7:\"/themes\";s:13:\"ideiasti-tech\";s:7:\"/themes\";s:11:\"newsblogger\";s:7:\"/themes\";s:10:\"newscrunch\";s:7:\"/themes\";s:17:\"techblog-ideiasti\";s:7:\"/themes\";s:18:\"technical-blogging\";s:7:\"/themes\";s:15:\"twentytwentyone\";s:7:\"/themes\";s:17:\"twentytwentythree\";s:7:\"/themes\";s:15:\"twentytwentytwo\";s:7:\"/themes\";s:12:\"yuma-blogger\";s:7:\"/themes\";s:4:\"yuma\";s:7:\"/themes\";}', 'off');
INSERT INTO `wp_options` VALUES ('983', '_site_transient_update_themes', 'O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1783382085;s:7:\"checked\";a:13:{s:5:\"astra\";s:6:\"4.12.6\";s:9:\"city-blog\";s:5:\"1.1.3\";s:13:\"generatepress\";s:5:\"3.6.1\";s:13:\"ideiasti-tech\";s:5:\"1.0.0\";s:11:\"newsblogger\";s:7:\"0.2.6.1\";s:10:\"newscrunch\";s:7:\"1.8.6.2\";s:17:\"techblog-ideiasti\";s:5:\"1.0.0\";s:18:\"technical-blogging\";s:3:\"3.1\";s:15:\"twentytwentyone\";s:3:\"1.7\";s:17:\"twentytwentythree\";s:3:\"1.6\";s:15:\"twentytwentytwo\";s:3:\"2.1\";s:12:\"yuma-blogger\";s:5:\"1.0.1\";s:4:\"yuma\";s:5:\"1.2.4\";}s:8:\"response\";a:5:{s:5:\"astra\";a:6:{s:5:\"theme\";s:5:\"astra\";s:11:\"new_version\";s:6:\"4.13.5\";s:3:\"url\";s:35:\"https://wordpress.org/themes/astra/\";s:7:\"package\";s:54:\"https://downloads.wordpress.org/theme/astra.4.13.5.zip\";s:8:\"requires\";s:3:\"5.3\";s:12:\"requires_php\";s:3:\"5.3\";}s:11:\"newsblogger\";a:6:{s:5:\"theme\";s:11:\"newsblogger\";s:11:\"new_version\";s:7:\"0.2.6.4\";s:3:\"url\";s:41:\"https://wordpress.org/themes/newsblogger/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/newsblogger.0.2.6.4.zip\";s:8:\"requires\";s:3:\"5.4\";s:12:\"requires_php\";s:3:\"5.6\";}s:10:\"newscrunch\";a:6:{s:5:\"theme\";s:10:\"newscrunch\";s:11:\"new_version\";s:7:\"1.8.6.5\";s:3:\"url\";s:40:\"https://wordpress.org/themes/newscrunch/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/theme/newscrunch.1.8.6.5.zip\";s:8:\"requires\";s:3:\"5.4\";s:12:\"requires_php\";s:3:\"5.6\";}s:18:\"technical-blogging\";a:6:{s:5:\"theme\";s:18:\"technical-blogging\";s:11:\"new_version\";s:3:\"3.6\";s:3:\"url\";s:48:\"https://wordpress.org/themes/technical-blogging/\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/theme/technical-blogging.3.6.zip\";s:8:\"requires\";s:3:\"5.5\";s:12:\"requires_php\";s:3:\"5.6\";}s:15:\"twentytwentyone\";a:6:{s:5:\"theme\";s:15:\"twentytwentyone\";s:11:\"new_version\";s:3:\"2.8\";s:3:\"url\";s:45:\"https://wordpress.org/themes/twentytwentyone/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/twentytwentyone.2.8.zip\";s:8:\"requires\";s:3:\"5.3\";s:12:\"requires_php\";s:3:\"5.6\";}}s:9:\"no_update\";a:6:{s:9:\"city-blog\";a:6:{s:5:\"theme\";s:9:\"city-blog\";s:11:\"new_version\";s:5:\"1.1.3\";s:3:\"url\";s:39:\"https://wordpress.org/themes/city-blog/\";s:7:\"package\";s:57:\"https://downloads.wordpress.org/theme/city-blog.1.1.3.zip\";s:8:\"requires\";s:3:\"5.0\";s:12:\"requires_php\";s:3:\"7.4\";}s:13:\"generatepress\";a:6:{s:5:\"theme\";s:13:\"generatepress\";s:11:\"new_version\";s:5:\"3.6.1\";s:3:\"url\";s:43:\"https://wordpress.org/themes/generatepress/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/generatepress.3.6.1.zip\";s:8:\"requires\";s:3:\"6.5\";s:12:\"requires_php\";s:3:\"7.4\";}s:17:\"twentytwentythree\";a:6:{s:5:\"theme\";s:17:\"twentytwentythree\";s:11:\"new_version\";s:3:\"1.6\";s:3:\"url\";s:47:\"https://wordpress.org/themes/twentytwentythree/\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/theme/twentytwentythree.1.6.zip\";s:8:\"requires\";s:3:\"6.1\";s:12:\"requires_php\";s:3:\"5.6\";}s:15:\"twentytwentytwo\";a:6:{s:5:\"theme\";s:15:\"twentytwentytwo\";s:11:\"new_version\";s:3:\"2.1\";s:3:\"url\";s:45:\"https://wordpress.org/themes/twentytwentytwo/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/twentytwentytwo.2.1.zip\";s:8:\"requires\";s:3:\"5.9\";s:12:\"requires_php\";s:3:\"5.6\";}s:12:\"yuma-blogger\";a:6:{s:5:\"theme\";s:12:\"yuma-blogger\";s:11:\"new_version\";s:5:\"1.0.1\";s:3:\"url\";s:42:\"https://wordpress.org/themes/yuma-blogger/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/theme/yuma-blogger.1.0.1.zip\";s:8:\"requires\";s:3:\"5.0\";s:12:\"requires_php\";s:3:\"5.6\";}s:4:\"yuma\";a:6:{s:5:\"theme\";s:4:\"yuma\";s:11:\"new_version\";s:5:\"1.2.4\";s:3:\"url\";s:34:\"https://wordpress.org/themes/yuma/\";s:7:\"package\";s:52:\"https://downloads.wordpress.org/theme/yuma.1.2.4.zip\";s:8:\"requires\";s:3:\"5.0\";s:12:\"requires_php\";s:3:\"5.6\";}}s:12:\"translations\";a:0:{}}', 'off');
INSERT INTO `wp_options` VALUES ('990', '_site_transient_timeout_available_translations', '1783393452', 'off');
INSERT INTO `wp_options` VALUES ('991', '_site_transient_available_translations', 'a:132:{s:2:\"af\";a:8:{s:8:\"language\";s:2:\"af\";s:7:\"version\";s:8:\"5.8-beta\";s:7:\"updated\";s:19:\"2021-05-13 15:59:22\";s:12:\"english_name\";s:9:\"Afrikaans\";s:11:\"native_name\";s:9:\"Afrikaans\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/5.8-beta/af.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"af\";i:2;s:3:\"afr\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"Gaan voort\";}}s:2:\"am\";a:8:{s:8:\"language\";s:2:\"am\";s:7:\"version\";s:6:\"6.0.11\";s:7:\"updated\";s:19:\"2022-09-29 20:43:49\";s:12:\"english_name\";s:7:\"Amharic\";s:11:\"native_name\";s:12:\"አማርኛ\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/6.0.11/am.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"am\";i:2;s:3:\"amh\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"ቀጥል\";}}s:3:\"arg\";a:8:{s:8:\"language\";s:3:\"arg\";s:7:\"version\";s:8:\"6.2-beta\";s:7:\"updated\";s:19:\"2022-09-22 16:46:56\";s:12:\"english_name\";s:9:\"Aragonese\";s:11:\"native_name\";s:9:\"Aragonés\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/6.2-beta/arg.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"an\";i:2;s:3:\"arg\";i:3;s:3:\"arg\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continar\";}}s:2:\"ar\";a:8:{s:8:\"language\";s:2:\"ar\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-07-03 15:52:45\";s:12:\"english_name\";s:6:\"Arabic\";s:11:\"native_name\";s:14:\"العربية\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/ar.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ar\";i:2;s:3:\"ara\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"متابعة\";}}s:3:\"ary\";a:8:{s:8:\"language\";s:3:\"ary\";s:7:\"version\";s:6:\"4.8.27\";s:7:\"updated\";s:19:\"2017-01-26 15:42:35\";s:12:\"english_name\";s:15:\"Moroccan Arabic\";s:11:\"native_name\";s:31:\"العربية المغربية\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/translation/core/4.8.27/ary.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ar\";i:3;s:3:\"ary\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:16:\"المتابعة\";}}s:2:\"as\";a:8:{s:8:\"language\";s:2:\"as\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-03-29 23:05:25\";s:12:\"english_name\";s:8:\"Assamese\";s:11:\"native_name\";s:21:\"অসমীয়া\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/as.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"as\";i:2;s:3:\"asm\";i:3;s:3:\"asm\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:3:\"azb\";a:8:{s:8:\"language\";s:3:\"azb\";s:7:\"version\";s:5:\"6.4.8\";s:7:\"updated\";s:19:\"2024-01-19 08:58:31\";s:12:\"english_name\";s:17:\"South Azerbaijani\";s:11:\"native_name\";s:29:\"گؤنئی آذربایجان\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/6.4.8/azb.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"az\";i:3;s:3:\"azb\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:2:\"az\";a:8:{s:8:\"language\";s:2:\"az\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-11-06 00:09:27\";s:12:\"english_name\";s:11:\"Azerbaijani\";s:11:\"native_name\";s:16:\"Azərbaycan dili\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.7.2/az.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"az\";i:2;s:3:\"aze\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:5:\"Davam\";}}s:3:\"bel\";a:8:{s:8:\"language\";s:3:\"bel\";s:7:\"version\";s:6:\"4.9.28\";s:7:\"updated\";s:19:\"2026-06-07 19:51:04\";s:12:\"english_name\";s:10:\"Belarusian\";s:11:\"native_name\";s:29:\"Беларуская мова\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/translation/core/4.9.28/bel.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"be\";i:2;s:3:\"bel\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:20:\"Працягнуць\";}}s:5:\"bg_BG\";a:8:{s:8:\"language\";s:5:\"bg_BG\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-03-02 09:00:09\";s:12:\"english_name\";s:9:\"Bulgarian\";s:11:\"native_name\";s:18:\"Български\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/bg_BG.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"bg\";i:2;s:3:\"bul\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"Напред\";}}s:5:\"bn_BD\";a:8:{s:8:\"language\";s:5:\"bn_BD\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-04-22 11:27:25\";s:12:\"english_name\";s:20:\"Bengali (Bangladesh)\";s:11:\"native_name\";s:15:\"বাংলা\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/bn_BD.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"bn\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:28:\"চালিয়ে যান\";}}s:2:\"bo\";a:8:{s:8:\"language\";s:2:\"bo\";s:7:\"version\";s:8:\"5.8-beta\";s:7:\"updated\";s:19:\"2020-10-30 03:24:38\";s:12:\"english_name\";s:7:\"Tibetan\";s:11:\"native_name\";s:21:\"བོད་ཡིག\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/5.8-beta/bo.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"bo\";i:2;s:3:\"tib\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:33:\"མུ་མཐུད་དུ།\";}}s:5:\"bs_BA\";a:8:{s:8:\"language\";s:5:\"bs_BA\";s:7:\"version\";s:5:\"6.2.9\";s:7:\"updated\";s:19:\"2023-02-22 20:45:53\";s:12:\"english_name\";s:7:\"Bosnian\";s:11:\"native_name\";s:8:\"Bosanski\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.2.9/bs_BA.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"bs\";i:2;s:3:\"bos\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:7:\"Nastavi\";}}s:2:\"ca\";a:8:{s:8:\"language\";s:2:\"ca\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-16 15:25:24\";s:12:\"english_name\";s:7:\"Catalan\";s:11:\"native_name\";s:7:\"Català\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/ca.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ca\";i:2;s:3:\"cat\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continua\";}}s:3:\"ceb\";a:8:{s:8:\"language\";s:3:\"ceb\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-03-02 17:25:51\";s:12:\"english_name\";s:7:\"Cebuano\";s:11:\"native_name\";s:7:\"Cebuano\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.7.2/ceb.zip\";s:3:\"iso\";a:2:{i:2;s:3:\"ceb\";i:3;s:3:\"ceb\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:7:\"Padayun\";}}s:5:\"cs_CZ\";a:8:{s:8:\"language\";s:5:\"cs_CZ\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-20 16:08:59\";s:12:\"english_name\";s:5:\"Czech\";s:11:\"native_name\";s:9:\"Čeština\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/cs_CZ.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"cs\";i:2;s:3:\"ces\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:11:\"Pokračovat\";}}s:2:\"cy\";a:8:{s:8:\"language\";s:2:\"cy\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-01 18:12:33\";s:12:\"english_name\";s:5:\"Welsh\";s:11:\"native_name\";s:7:\"Cymraeg\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/cy.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"cy\";i:2;s:3:\"cym\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Parhau\";}}s:5:\"da_DK\";a:8:{s:8:\"language\";s:5:\"da_DK\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-28 13:56:30\";s:12:\"english_name\";s:6:\"Danish\";s:11:\"native_name\";s:5:\"Dansk\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/da_DK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"da\";i:2;s:3:\"dan\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Fortsæt\";}}s:5:\"de_CH\";a:8:{s:8:\"language\";s:5:\"de_CH\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-18 08:38:18\";s:12:\"english_name\";s:20:\"German (Switzerland)\";s:11:\"native_name\";s:17:\"Deutsch (Schweiz)\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/de_CH.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"de\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Weiter\";}}s:14:\"de_CH_informal\";a:8:{s:8:\"language\";s:14:\"de_CH_informal\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-18 08:40:44\";s:12:\"english_name\";s:30:\"German (Switzerland, Informal)\";s:11:\"native_name\";s:21:\"Deutsch (Schweiz, Du)\";s:7:\"package\";s:71:\"https://downloads.wordpress.org/translation/core/7.0/de_CH_informal.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"de\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Weiter\";}}s:5:\"de_AT\";a:8:{s:8:\"language\";s:5:\"de_AT\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-16 18:46:25\";s:12:\"english_name\";s:16:\"German (Austria)\";s:11:\"native_name\";s:21:\"Deutsch (Österreich)\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/de_AT.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"de\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Weiter\";}}s:5:\"de_DE\";a:8:{s:8:\"language\";s:5:\"de_DE\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-29 22:03:36\";s:12:\"english_name\";s:6:\"German\";s:11:\"native_name\";s:7:\"Deutsch\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/de_DE.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"de\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Weiter\";}}s:12:\"de_DE_formal\";a:8:{s:8:\"language\";s:12:\"de_DE_formal\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-29 22:04:34\";s:12:\"english_name\";s:15:\"German (Formal)\";s:11:\"native_name\";s:13:\"Deutsch (Sie)\";s:7:\"package\";s:69:\"https://downloads.wordpress.org/translation/core/7.0/de_DE_formal.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"de\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Weiter\";}}s:3:\"dsb\";a:8:{s:8:\"language\";s:3:\"dsb\";s:7:\"version\";s:5:\"6.2.9\";s:7:\"updated\";s:19:\"2022-07-16 12:13:09\";s:12:\"english_name\";s:13:\"Lower Sorbian\";s:11:\"native_name\";s:16:\"Dolnoserbšćina\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/6.2.9/dsb.zip\";s:3:\"iso\";a:2:{i:2;s:3:\"dsb\";i:3;s:3:\"dsb\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:5:\"Dalej\";}}s:3:\"dzo\";a:8:{s:8:\"language\";s:3:\"dzo\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-06-29 08:59:03\";s:12:\"english_name\";s:8:\"Dzongkha\";s:11:\"native_name\";s:18:\"རྫོང་ཁ\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.7.2/dzo.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"dz\";i:2;s:3:\"dzo\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:2:\"el\";a:8:{s:8:\"language\";s:2:\"el\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-30 13:23:55\";s:12:\"english_name\";s:5:\"Greek\";s:11:\"native_name\";s:16:\"Ελληνικά\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/el.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"el\";i:2;s:3:\"ell\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:16:\"Συνέχεια\";}}s:5:\"en_CA\";a:8:{s:8:\"language\";s:5:\"en_CA\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-14 16:37:59\";s:12:\"english_name\";s:16:\"English (Canada)\";s:11:\"native_name\";s:16:\"English (Canada)\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/en_CA.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"en_AU\";a:8:{s:8:\"language\";s:5:\"en_AU\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-25 07:19:39\";s:12:\"english_name\";s:19:\"English (Australia)\";s:11:\"native_name\";s:19:\"English (Australia)\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/en_AU.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"en_NZ\";a:8:{s:8:\"language\";s:5:\"en_NZ\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-07-02 07:18:10\";s:12:\"english_name\";s:21:\"English (New Zealand)\";s:11:\"native_name\";s:21:\"English (New Zealand)\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/en_NZ.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"en_ZA\";a:8:{s:8:\"language\";s:5:\"en_ZA\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-07-02 18:45:04\";s:12:\"english_name\";s:22:\"English (South Africa)\";s:11:\"native_name\";s:22:\"English (South Africa)\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/en_ZA.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"en_GB\";a:8:{s:8:\"language\";s:5:\"en_GB\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-19 18:30:50\";s:12:\"english_name\";s:12:\"English (UK)\";s:11:\"native_name\";s:12:\"English (UK)\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/en_GB.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"en\";i:2;s:3:\"eng\";i:3;s:3:\"eng\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:2:\"eo\";a:8:{s:8:\"language\";s:2:\"eo\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-26 10:10:33\";s:12:\"english_name\";s:9:\"Esperanto\";s:11:\"native_name\";s:9:\"Esperanto\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/eo.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"eo\";i:2;s:3:\"epo\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Daŭrigi\";}}s:5:\"es_MX\";a:8:{s:8:\"language\";s:5:\"es_MX\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-19 17:30:48\";s:12:\"english_name\";s:16:\"Spanish (Mexico)\";s:11:\"native_name\";s:19:\"Español de México\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/es_MX.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_ES\";a:8:{s:8:\"language\";s:5:\"es_ES\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-13 15:21:55\";s:12:\"english_name\";s:15:\"Spanish (Spain)\";s:11:\"native_name\";s:8:\"Español\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/es_ES.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_PE\";a:8:{s:8:\"language\";s:5:\"es_PE\";s:7:\"version\";s:6:\"6.9-RC\";s:7:\"updated\";s:19:\"2024-10-16 21:04:12\";s:12:\"english_name\";s:14:\"Spanish (Peru)\";s:11:\"native_name\";s:17:\"Español de Perú\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/6.9-RC/es_PE.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_VE\";a:8:{s:8:\"language\";s:5:\"es_VE\";s:7:\"version\";s:5:\"6.4.8\";s:7:\"updated\";s:19:\"2023-10-16 16:00:04\";s:12:\"english_name\";s:19:\"Spanish (Venezuela)\";s:11:\"native_name\";s:21:\"Español de Venezuela\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.4.8/es_VE.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_EC\";a:8:{s:8:\"language\";s:5:\"es_EC\";s:7:\"version\";s:5:\"6.2.9\";s:7:\"updated\";s:19:\"2023-04-21 13:32:10\";s:12:\"english_name\";s:17:\"Spanish (Ecuador)\";s:11:\"native_name\";s:19:\"Español de Ecuador\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.2.9/es_EC.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_DO\";a:8:{s:8:\"language\";s:5:\"es_DO\";s:7:\"version\";s:6:\"5.8.13\";s:7:\"updated\";s:19:\"2021-10-08 14:32:50\";s:12:\"english_name\";s:28:\"Spanish (Dominican Republic)\";s:11:\"native_name\";s:33:\"Español de República Dominicana\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/5.8.13/es_DO.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_UY\";a:8:{s:8:\"language\";s:5:\"es_UY\";s:7:\"version\";s:8:\"5.8-beta\";s:7:\"updated\";s:19:\"2021-03-31 18:33:26\";s:12:\"english_name\";s:17:\"Spanish (Uruguay)\";s:11:\"native_name\";s:19:\"Español de Uruguay\";s:7:\"package\";s:67:\"https://downloads.wordpress.org/translation/core/5.8-beta/es_UY.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_PR\";a:8:{s:8:\"language\";s:5:\"es_PR\";s:7:\"version\";s:6:\"5.4.19\";s:7:\"updated\";s:19:\"2020-04-29 15:36:59\";s:12:\"english_name\";s:21:\"Spanish (Puerto Rico)\";s:11:\"native_name\";s:23:\"Español de Puerto Rico\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/5.4.19/es_PR.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_CL\";a:8:{s:8:\"language\";s:5:\"es_CL\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-20 21:46:26\";s:12:\"english_name\";s:15:\"Spanish (Chile)\";s:11:\"native_name\";s:17:\"Español de Chile\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/es_CL.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_GT\";a:8:{s:8:\"language\";s:5:\"es_GT\";s:7:\"version\";s:6:\"5.2.23\";s:7:\"updated\";s:19:\"2019-03-02 06:35:01\";s:12:\"english_name\";s:19:\"Spanish (Guatemala)\";s:11:\"native_name\";s:21:\"Español de Guatemala\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/5.2.23/es_GT.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_CR\";a:8:{s:8:\"language\";s:5:\"es_CR\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-22 00:13:06\";s:12:\"english_name\";s:20:\"Spanish (Costa Rica)\";s:11:\"native_name\";s:22:\"Español de Costa Rica\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/es_CR.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_AR\";a:8:{s:8:\"language\";s:5:\"es_AR\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-25 20:57:53\";s:12:\"english_name\";s:19:\"Spanish (Argentina)\";s:11:\"native_name\";s:21:\"Español de Argentina\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/es_AR.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"es_CO\";a:8:{s:8:\"language\";s:5:\"es_CO\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-31 04:15:54\";s:12:\"english_name\";s:18:\"Spanish (Colombia)\";s:11:\"native_name\";s:20:\"Español de Colombia\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/es_CO.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"es\";i:2;s:3:\"spa\";i:3;s:3:\"spa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:2:\"et\";a:8:{s:8:\"language\";s:2:\"et\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-07-02 08:49:32\";s:12:\"english_name\";s:8:\"Estonian\";s:11:\"native_name\";s:5:\"Eesti\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/et.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"et\";i:2;s:3:\"est\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Jätka\";}}s:2:\"eu\";a:8:{s:8:\"language\";s:2:\"eu\";s:7:\"version\";s:6:\"6.9-RC\";s:7:\"updated\";s:19:\"2025-11-05 21:53:17\";s:12:\"english_name\";s:6:\"Basque\";s:11:\"native_name\";s:7:\"Euskara\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/6.9-RC/eu.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"eu\";i:2;s:3:\"eus\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Jarraitu\";}}s:5:\"fa_IR\";a:8:{s:8:\"language\";s:5:\"fa_IR\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-07-05 21:05:12\";s:12:\"english_name\";s:7:\"Persian\";s:11:\"native_name\";s:10:\"فارسی\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/fa_IR.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fa\";i:2;s:3:\"fas\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"ادامه\";}}s:5:\"fa_AF\";a:8:{s:8:\"language\";s:5:\"fa_AF\";s:7:\"version\";s:6:\"6.9-RC\";s:7:\"updated\";s:19:\"2025-02-14 17:29:08\";s:12:\"english_name\";s:21:\"Persian (Afghanistan)\";s:11:\"native_name\";s:31:\"(فارسی (افغانستان\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/6.9-RC/fa_AF.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fa\";i:2;s:3:\"fas\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"ادامه\";}}s:2:\"fi\";a:8:{s:8:\"language\";s:2:\"fi\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-29 05:59:24\";s:12:\"english_name\";s:7:\"Finnish\";s:11:\"native_name\";s:5:\"Suomi\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/fi.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fi\";i:2;s:3:\"fin\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:5:\"Jatka\";}}s:5:\"fr_CA\";a:8:{s:8:\"language\";s:5:\"fr_CA\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-04 21:33:54\";s:12:\"english_name\";s:15:\"French (Canada)\";s:11:\"native_name\";s:19:\"Français du Canada\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/fr_CA.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fr\";i:2;s:3:\"fra\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuer\";}}s:5:\"fr_FR\";a:8:{s:8:\"language\";s:5:\"fr_FR\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-17 09:57:00\";s:12:\"english_name\";s:15:\"French (France)\";s:11:\"native_name\";s:9:\"Français\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/fr_FR.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"fr\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuer\";}}s:5:\"fr_BE\";a:8:{s:8:\"language\";s:5:\"fr_BE\";s:7:\"version\";s:5:\"6.5.8\";s:7:\"updated\";s:19:\"2024-02-01 23:56:53\";s:12:\"english_name\";s:16:\"French (Belgium)\";s:11:\"native_name\";s:21:\"Français de Belgique\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.5.8/fr_BE.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fr\";i:2;s:3:\"fra\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuer\";}}s:3:\"fur\";a:8:{s:8:\"language\";s:3:\"fur\";s:7:\"version\";s:6:\"4.8.27\";s:7:\"updated\";s:19:\"2025-12-20 19:08:53\";s:12:\"english_name\";s:8:\"Friulian\";s:11:\"native_name\";s:8:\"Friulian\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/translation/core/4.8.27/fur.zip\";s:3:\"iso\";a:2:{i:2;s:3:\"fur\";i:3;s:3:\"fur\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:2:\"fy\";a:8:{s:8:\"language\";s:2:\"fy\";s:7:\"version\";s:5:\"6.2.9\";s:7:\"updated\";s:19:\"2025-10-21 16:35:04\";s:12:\"english_name\";s:7:\"Frisian\";s:11:\"native_name\";s:5:\"Frysk\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.2.9/fy.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"fy\";i:2;s:3:\"fry\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Trochgean\";}}s:2:\"gd\";a:8:{s:8:\"language\";s:2:\"gd\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-08-23 17:41:37\";s:12:\"english_name\";s:15:\"Scottish Gaelic\";s:11:\"native_name\";s:9:\"Gàidhlig\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.7.2/gd.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"gd\";i:2;s:3:\"gla\";i:3;s:3:\"gla\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:15:\"Lean air adhart\";}}s:5:\"gl_ES\";a:8:{s:8:\"language\";s:5:\"gl_ES\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-20 16:31:02\";s:12:\"english_name\";s:8:\"Galician\";s:11:\"native_name\";s:6:\"Galego\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/gl_ES.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"gl\";i:2;s:3:\"glg\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:2:\"gu\";a:8:{s:8:\"language\";s:2:\"gu\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-04 10:12:44\";s:12:\"english_name\";s:8:\"Gujarati\";s:11:\"native_name\";s:21:\"ગુજરાતી\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/gu.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"gu\";i:2;s:3:\"guj\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:25:\"ચાલુ રાખો\";}}s:3:\"haz\";a:8:{s:8:\"language\";s:3:\"haz\";s:7:\"version\";s:6:\"4.4.34\";s:7:\"updated\";s:19:\"2015-12-05 00:59:09\";s:12:\"english_name\";s:8:\"Hazaragi\";s:11:\"native_name\";s:15:\"هزاره گی\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/translation/core/4.4.34/haz.zip\";s:3:\"iso\";a:1:{i:3;s:3:\"haz\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"ادامه\";}}s:5:\"he_IL\";a:8:{s:8:\"language\";s:5:\"he_IL\";s:7:\"version\";s:5:\"6.2.9\";s:7:\"updated\";s:19:\"2024-05-04 18:39:24\";s:12:\"english_name\";s:6:\"Hebrew\";s:11:\"native_name\";s:16:\"עִבְרִית\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.2.9/he_IL.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"he\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"המשך\";}}s:5:\"hi_IN\";a:8:{s:8:\"language\";s:5:\"hi_IN\";s:7:\"version\";s:5:\"6.4.8\";s:7:\"updated\";s:19:\"2025-02-06 05:17:11\";s:12:\"english_name\";s:5:\"Hindi\";s:11:\"native_name\";s:18:\"हिन्दी\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.4.8/hi_IN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"hi\";i:2;s:3:\"hin\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:25:\"जारी रखें\";}}s:2:\"hr\";a:8:{s:8:\"language\";s:2:\"hr\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-30 19:23:43\";s:12:\"english_name\";s:8:\"Croatian\";s:11:\"native_name\";s:8:\"Hrvatski\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/hr.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"hr\";i:2;s:3:\"hrv\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:7:\"Nastavi\";}}s:3:\"hsb\";a:8:{s:8:\"language\";s:3:\"hsb\";s:7:\"version\";s:5:\"6.2.9\";s:7:\"updated\";s:19:\"2023-02-22 17:37:32\";s:12:\"english_name\";s:13:\"Upper Sorbian\";s:11:\"native_name\";s:17:\"Hornjoserbšćina\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/6.2.9/hsb.zip\";s:3:\"iso\";a:2:{i:2;s:3:\"hsb\";i:3;s:3:\"hsb\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:4:\"Dale\";}}s:5:\"hu_HU\";a:8:{s:8:\"language\";s:5:\"hu_HU\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-21 16:24:49\";s:12:\"english_name\";s:9:\"Hungarian\";s:11:\"native_name\";s:6:\"Magyar\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/hu_HU.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"hu\";i:2;s:3:\"hun\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"Folytatás\";}}s:2:\"hy\";a:8:{s:8:\"language\";s:2:\"hy\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-12-03 16:21:10\";s:12:\"english_name\";s:8:\"Armenian\";s:11:\"native_name\";s:14:\"Հայերեն\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.7.2/hy.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"hy\";i:2;s:3:\"hye\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:20:\"Շարունակել\";}}s:5:\"id_ID\";a:8:{s:8:\"language\";s:5:\"id_ID\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-06 03:53:34\";s:12:\"english_name\";s:10:\"Indonesian\";s:11:\"native_name\";s:16:\"Bahasa Indonesia\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/id_ID.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"id\";i:2;s:3:\"ind\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Lanjutkan\";}}s:5:\"is_IS\";a:8:{s:8:\"language\";s:5:\"is_IS\";s:7:\"version\";s:6:\"4.9.28\";s:7:\"updated\";s:19:\"2018-12-11 10:40:02\";s:12:\"english_name\";s:9:\"Icelandic\";s:11:\"native_name\";s:9:\"Íslenska\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/4.9.28/is_IS.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"is\";i:2;s:3:\"isl\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Áfram\";}}s:5:\"it_IT\";a:8:{s:8:\"language\";s:5:\"it_IT\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-30 13:55:00\";s:12:\"english_name\";s:7:\"Italian\";s:11:\"native_name\";s:8:\"Italiano\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/it_IT.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"it\";i:2;s:3:\"ita\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continua\";}}s:2:\"ja\";a:8:{s:8:\"language\";s:2:\"ja\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-21 15:32:47\";s:12:\"english_name\";s:8:\"Japanese\";s:11:\"native_name\";s:9:\"日本語\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/ja.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"ja\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"次へ\";}}s:5:\"jv_ID\";a:8:{s:8:\"language\";s:5:\"jv_ID\";s:7:\"version\";s:6:\"4.9.28\";s:7:\"updated\";s:19:\"2019-02-16 23:58:56\";s:12:\"english_name\";s:8:\"Javanese\";s:11:\"native_name\";s:9:\"Basa Jawa\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/4.9.28/jv_ID.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"jv\";i:2;s:3:\"jav\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Nerusaké\";}}s:5:\"ka_GE\";a:8:{s:8:\"language\";s:5:\"ka_GE\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-07-06 13:51:56\";s:12:\"english_name\";s:8:\"Georgian\";s:11:\"native_name\";s:21:\"ქართული\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/ka_GE.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ka\";i:2;s:3:\"kat\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:30:\"გაგრძელება\";}}s:3:\"kab\";a:8:{s:8:\"language\";s:3:\"kab\";s:7:\"version\";s:5:\"6.2.9\";s:7:\"updated\";s:19:\"2023-07-05 11:40:39\";s:12:\"english_name\";s:6:\"Kabyle\";s:11:\"native_name\";s:9:\"Taqbaylit\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/6.2.9/kab.zip\";s:3:\"iso\";a:2:{i:2;s:3:\"kab\";i:3;s:3:\"kab\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Kemmel\";}}s:2:\"kk\";a:8:{s:8:\"language\";s:2:\"kk\";s:7:\"version\";s:6:\"6.9-RC\";s:7:\"updated\";s:19:\"2024-07-18 02:49:24\";s:12:\"english_name\";s:6:\"Kazakh\";s:11:\"native_name\";s:19:\"Қазақ тілі\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/6.9-RC/kk.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"kk\";i:2;s:3:\"kaz\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:20:\"Жалғастыру\";}}s:2:\"km\";a:8:{s:8:\"language\";s:2:\"km\";s:7:\"version\";s:6:\"5.2.23\";s:7:\"updated\";s:19:\"2019-06-10 16:18:28\";s:12:\"english_name\";s:5:\"Khmer\";s:11:\"native_name\";s:27:\"ភាសាខ្មែរ\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/5.2.23/km.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"km\";i:2;s:3:\"khm\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"បន្ត\";}}s:2:\"kn\";a:8:{s:8:\"language\";s:2:\"kn\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-04-09 12:29:53\";s:12:\"english_name\";s:7:\"Kannada\";s:11:\"native_name\";s:15:\"ಕನ್ನಡ\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/kn.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"kn\";i:2;s:3:\"kan\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:30:\"ಮುಂದುವರಿಸು\";}}s:5:\"ko_KR\";a:8:{s:8:\"language\";s:5:\"ko_KR\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-26 04:42:06\";s:12:\"english_name\";s:6:\"Korean\";s:11:\"native_name\";s:9:\"한국어\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/ko_KR.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ko\";i:2;s:3:\"kor\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"계속\";}}s:3:\"ckb\";a:8:{s:8:\"language\";s:3:\"ckb\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-13 19:49:16\";s:12:\"english_name\";s:16:\"Kurdish (Sorani)\";s:11:\"native_name\";s:13:\"كوردی‎\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/translation/core/7.0/ckb.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ku\";i:3;s:3:\"ckb\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:30:\"به‌رده‌وام به‌\";}}s:3:\"kir\";a:8:{s:8:\"language\";s:3:\"kir\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-03-25 22:55:12\";s:12:\"english_name\";s:6:\"Kyrgyz\";s:11:\"native_name\";s:16:\"Кыргызча\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/translation/core/7.0/kir.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"ky\";i:2;s:3:\"kir\";i:3;s:3:\"kir\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:14:\"Улантуу\";}}s:2:\"lo\";a:8:{s:8:\"language\";s:2:\"lo\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-03 11:57:19\";s:12:\"english_name\";s:3:\"Lao\";s:11:\"native_name\";s:21:\"ພາສາລາວ\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/lo.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"lo\";i:2;s:3:\"lao\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:18:\"ຕໍ່​ໄປ\";}}s:5:\"lt_LT\";a:8:{s:8:\"language\";s:5:\"lt_LT\";s:7:\"version\";s:6:\"6.9-RC\";s:7:\"updated\";s:19:\"2025-09-27 20:51:17\";s:12:\"english_name\";s:10:\"Lithuanian\";s:11:\"native_name\";s:15:\"Lietuvių kalba\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/6.9-RC/lt_LT.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"lt\";i:2;s:3:\"lit\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Tęsti\";}}s:2:\"lv\";a:8:{s:8:\"language\";s:2:\"lv\";s:7:\"version\";s:5:\"6.9.4\";s:7:\"updated\";s:19:\"2026-02-20 20:55:46\";s:12:\"english_name\";s:7:\"Latvian\";s:11:\"native_name\";s:16:\"Latviešu valoda\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.9.4/lv.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"lv\";i:2;s:3:\"lav\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Turpināt\";}}s:5:\"mk_MK\";a:8:{s:8:\"language\";s:5:\"mk_MK\";s:7:\"version\";s:6:\"6.0.11\";s:7:\"updated\";s:19:\"2022-10-01 09:23:52\";s:12:\"english_name\";s:10:\"Macedonian\";s:11:\"native_name\";s:31:\"Македонски јазик\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/6.0.11/mk_MK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"mk\";i:2;s:3:\"mkd\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:16:\"Продолжи\";}}s:5:\"ml_IN\";a:8:{s:8:\"language\";s:5:\"ml_IN\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-07-06 19:46:53\";s:12:\"english_name\";s:9:\"Malayalam\";s:11:\"native_name\";s:18:\"മലയാളം\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/ml_IN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ml\";i:2;s:3:\"mal\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:18:\"തുടരുക\";}}s:2:\"mn\";a:8:{s:8:\"language\";s:2:\"mn\";s:7:\"version\";s:5:\"6.5.8\";s:7:\"updated\";s:19:\"2024-06-20 17:22:06\";s:12:\"english_name\";s:9:\"Mongolian\";s:11:\"native_name\";s:12:\"Монгол\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.5.8/mn.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"mn\";i:2;s:3:\"mon\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:2:\"mr\";a:8:{s:8:\"language\";s:2:\"mr\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-20 17:07:02\";s:12:\"english_name\";s:7:\"Marathi\";s:11:\"native_name\";s:15:\"मराठी\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/mr.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"mr\";i:2;s:3:\"mar\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:25:\"सुरु ठेवा\";}}s:5:\"ms_MY\";a:8:{s:8:\"language\";s:5:\"ms_MY\";s:7:\"version\";s:6:\"5.5.18\";s:7:\"updated\";s:19:\"2022-03-11 13:52:22\";s:12:\"english_name\";s:5:\"Malay\";s:11:\"native_name\";s:13:\"Bahasa Melayu\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/5.5.18/ms_MY.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ms\";i:2;s:3:\"msa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Teruskan\";}}s:5:\"my_MM\";a:8:{s:8:\"language\";s:5:\"my_MM\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-02 17:12:46\";s:12:\"english_name\";s:17:\"Myanmar (Burmese)\";s:11:\"native_name\";s:15:\"ဗမာစာ\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/my_MM.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"my\";i:2;s:3:\"mya\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:54:\"ဆက်လက်လုပ်ဆောင်ပါ။\";}}s:5:\"nb_NO\";a:8:{s:8:\"language\";s:5:\"nb_NO\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-27 12:51:38\";s:12:\"english_name\";s:19:\"Norwegian (Bokmål)\";s:11:\"native_name\";s:13:\"Norsk bokmål\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/nb_NO.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"nb\";i:2;s:3:\"nob\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Fortsett\";}}s:5:\"ne_NP\";a:8:{s:8:\"language\";s:5:\"ne_NP\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-15 05:25:34\";s:12:\"english_name\";s:6:\"Nepali\";s:11:\"native_name\";s:18:\"नेपाली\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/ne_NP.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ne\";i:2;s:3:\"nep\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:43:\"जारी राख्नुहोस्\";}}s:5:\"nl_NL\";a:8:{s:8:\"language\";s:5:\"nl_NL\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-03 13:00:03\";s:12:\"english_name\";s:5:\"Dutch\";s:11:\"native_name\";s:10:\"Nederlands\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/nl_NL.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"nl\";i:2;s:3:\"nld\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Doorgaan\";}}s:5:\"nl_BE\";a:8:{s:8:\"language\";s:5:\"nl_BE\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-19 13:55:00\";s:12:\"english_name\";s:15:\"Dutch (Belgium)\";s:11:\"native_name\";s:20:\"Nederlands (België)\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/nl_BE.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"nl\";i:2;s:3:\"nld\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Doorgaan\";}}s:12:\"nl_NL_formal\";a:8:{s:8:\"language\";s:12:\"nl_NL_formal\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-19 19:19:13\";s:12:\"english_name\";s:14:\"Dutch (Formal)\";s:11:\"native_name\";s:20:\"Nederlands (Formeel)\";s:7:\"package\";s:69:\"https://downloads.wordpress.org/translation/core/7.0/nl_NL_formal.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"nl\";i:2;s:3:\"nld\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Doorgaan\";}}s:5:\"nn_NO\";a:8:{s:8:\"language\";s:5:\"nn_NO\";s:7:\"version\";s:8:\"5.8-beta\";s:7:\"updated\";s:19:\"2021-03-18 10:59:16\";s:12:\"english_name\";s:19:\"Norwegian (Nynorsk)\";s:11:\"native_name\";s:13:\"Norsk nynorsk\";s:7:\"package\";s:67:\"https://downloads.wordpress.org/translation/core/5.8-beta/nn_NO.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"nn\";i:2;s:3:\"nno\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Hald fram\";}}s:3:\"oci\";a:8:{s:8:\"language\";s:3:\"oci\";s:7:\"version\";s:6:\"4.8.27\";s:7:\"updated\";s:19:\"2017-08-25 10:03:08\";s:12:\"english_name\";s:7:\"Occitan\";s:11:\"native_name\";s:7:\"Occitan\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/translation/core/4.8.27/oci.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"oc\";i:2;s:3:\"oci\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Contunhar\";}}s:5:\"pa_IN\";a:8:{s:8:\"language\";s:5:\"pa_IN\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2017-01-16 05:19:43\";s:12:\"english_name\";s:15:\"Panjabi (India)\";s:11:\"native_name\";s:18:\"ਪੰਜਾਬੀ\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.7.2/pa_IN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"pa\";i:2;s:3:\"pan\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:25:\"ਜਾਰੀ ਰੱਖੋ\";}}s:5:\"pl_PL\";a:8:{s:8:\"language\";s:5:\"pl_PL\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-07-06 07:31:18\";s:12:\"english_name\";s:6:\"Polish\";s:11:\"native_name\";s:6:\"Polski\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/pl_PL.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"pl\";i:2;s:3:\"pol\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Kontynuuj\";}}s:2:\"ps\";a:8:{s:8:\"language\";s:2:\"ps\";s:7:\"version\";s:6:\"4.3.35\";s:7:\"updated\";s:19:\"2015-12-02 21:41:29\";s:12:\"english_name\";s:6:\"Pashto\";s:11:\"native_name\";s:8:\"پښتو\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.3.35/ps.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ps\";i:2;s:3:\"pus\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:19:\"دوام ورکړه\";}}s:10:\"pt_PT_ao90\";a:8:{s:8:\"language\";s:10:\"pt_PT_ao90\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-08 15:30:26\";s:12:\"english_name\";s:27:\"Portuguese (Portugal, AO90)\";s:11:\"native_name\";s:17:\"Português (AO90)\";s:7:\"package\";s:67:\"https://downloads.wordpress.org/translation/core/7.0/pt_PT_ao90.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"pt\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"pt_BR\";a:8:{s:8:\"language\";s:5:\"pt_BR\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-11 17:52:12\";s:12:\"english_name\";s:19:\"Portuguese (Brazil)\";s:11:\"native_name\";s:20:\"Português do Brasil\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/pt_BR.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"pt\";i:2;s:3:\"por\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"pt_AO\";a:8:{s:8:\"language\";s:5:\"pt_AO\";s:7:\"version\";s:5:\"6.4.8\";s:7:\"updated\";s:19:\"2023-08-21 12:15:00\";s:12:\"english_name\";s:19:\"Portuguese (Angola)\";s:11:\"native_name\";s:20:\"Português de Angola\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.4.8/pt_AO.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"pt\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:5:\"pt_PT\";a:8:{s:8:\"language\";s:5:\"pt_PT\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-08 15:28:47\";s:12:\"english_name\";s:21:\"Portuguese (Portugal)\";s:11:\"native_name\";s:10:\"Português\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/pt_PT.zip\";s:3:\"iso\";a:1:{i:1;s:2:\"pt\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuar\";}}s:3:\"rhg\";a:8:{s:8:\"language\";s:3:\"rhg\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-03-16 13:03:18\";s:12:\"english_name\";s:8:\"Rohingya\";s:11:\"native_name\";s:8:\"Ruáinga\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.7.2/rhg.zip\";s:3:\"iso\";a:1:{i:3;s:3:\"rhg\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"ro_RO\";a:8:{s:8:\"language\";s:5:\"ro_RO\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-26 16:57:28\";s:12:\"english_name\";s:8:\"Romanian\";s:11:\"native_name\";s:8:\"Română\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/ro_RO.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ro\";i:2;s:3:\"ron\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Continuă\";}}s:5:\"ru_RU\";a:8:{s:8:\"language\";s:5:\"ru_RU\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-07-05 14:48:11\";s:12:\"english_name\";s:7:\"Russian\";s:11:\"native_name\";s:14:\"Русский\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/ru_RU.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ru\";i:2;s:3:\"rus\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:20:\"Продолжить\";}}s:3:\"sah\";a:8:{s:8:\"language\";s:3:\"sah\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2017-01-21 02:06:41\";s:12:\"english_name\";s:5:\"Sakha\";s:11:\"native_name\";s:14:\"Сахалыы\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.7.2/sah.zip\";s:3:\"iso\";a:2:{i:2;s:3:\"sah\";i:3;s:3:\"sah\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"Салҕаа\";}}s:3:\"snd\";a:8:{s:8:\"language\";s:3:\"snd\";s:7:\"version\";s:6:\"5.4.19\";s:7:\"updated\";s:19:\"2020-07-07 01:53:37\";s:12:\"english_name\";s:6:\"Sindhi\";s:11:\"native_name\";s:8:\"سنڌي\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/translation/core/5.4.19/snd.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"sd\";i:2;s:3:\"snd\";i:3;s:3:\"snd\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:15:\"اڳتي هلو\";}}s:5:\"si_LK\";a:8:{s:8:\"language\";s:5:\"si_LK\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-11-12 06:00:52\";s:12:\"english_name\";s:7:\"Sinhala\";s:11:\"native_name\";s:15:\"සිංහල\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.7.2/si_LK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"si\";i:2;s:3:\"sin\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:44:\"දිගටම කරගෙන යන්න\";}}s:5:\"sk_SK\";a:8:{s:8:\"language\";s:5:\"sk_SK\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-07-02 03:54:13\";s:12:\"english_name\";s:6:\"Slovak\";s:11:\"native_name\";s:11:\"Slovenčina\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/sk_SK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sk\";i:2;s:3:\"slk\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"Pokračovať\";}}s:3:\"skr\";a:8:{s:8:\"language\";s:3:\"skr\";s:7:\"version\";s:6:\"6.9-RC\";s:7:\"updated\";s:19:\"2025-04-24 16:58:02\";s:12:\"english_name\";s:7:\"Saraiki\";s:11:\"native_name\";s:14:\"سرائیکی\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/translation/core/6.9-RC/skr.zip\";s:3:\"iso\";a:1:{i:3;s:3:\"skr\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:17:\"جاری رکھو\";}}s:5:\"sl_SI\";a:8:{s:8:\"language\";s:5:\"sl_SI\";s:7:\"version\";s:5:\"6.9.4\";s:7:\"updated\";s:19:\"2025-10-29 11:19:02\";s:12:\"english_name\";s:9:\"Slovenian\";s:11:\"native_name\";s:13:\"Slovenščina\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.9.4/sl_SI.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sl\";i:2;s:3:\"slv\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Nadaljuj\";}}s:2:\"sq\";a:8:{s:8:\"language\";s:2:\"sq\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-25 07:37:12\";s:12:\"english_name\";s:8:\"Albanian\";s:11:\"native_name\";s:5:\"Shqip\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/sq.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sq\";i:2;s:3:\"sqi\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"Vazhdo\";}}s:5:\"sr_RS\";a:8:{s:8:\"language\";s:5:\"sr_RS\";s:7:\"version\";s:5:\"6.9.4\";s:7:\"updated\";s:19:\"2025-12-03 15:37:44\";s:12:\"english_name\";s:7:\"Serbian\";s:11:\"native_name\";s:23:\"Српски језик\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.9.4/sr_RS.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sr\";i:2;s:3:\"srp\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:14:\"Настави\";}}s:5:\"sv_SE\";a:8:{s:8:\"language\";s:5:\"sv_SE\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-20 23:48:55\";s:12:\"english_name\";s:7:\"Swedish\";s:11:\"native_name\";s:7:\"Svenska\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/sv_SE.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sv\";i:2;s:3:\"swe\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:9:\"Fortsätt\";}}s:2:\"sw\";a:8:{s:8:\"language\";s:2:\"sw\";s:7:\"version\";s:5:\"6.9.4\";s:7:\"updated\";s:19:\"2026-02-21 11:17:30\";s:12:\"english_name\";s:7:\"Swahili\";s:11:\"native_name\";s:9:\"Kiswahili\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/6.9.4/sw.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"sw\";i:2;s:3:\"swa\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:7:\"Endelea\";}}s:3:\"szl\";a:8:{s:8:\"language\";s:3:\"szl\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-09-24 19:58:14\";s:12:\"english_name\";s:8:\"Silesian\";s:11:\"native_name\";s:17:\"Ślōnskŏ gŏdka\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.7.2/szl.zip\";s:3:\"iso\";a:1:{i:3;s:3:\"szl\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:13:\"Kōntynuować\";}}s:5:\"ta_IN\";a:8:{s:8:\"language\";s:5:\"ta_IN\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2017-01-27 03:22:47\";s:12:\"english_name\";s:5:\"Tamil\";s:11:\"native_name\";s:15:\"தமிழ்\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.7.2/ta_IN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ta\";i:2;s:3:\"tam\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:24:\"தொடரவும்\";}}s:5:\"ta_LK\";a:8:{s:8:\"language\";s:5:\"ta_LK\";s:7:\"version\";s:6:\"4.2.39\";s:7:\"updated\";s:19:\"2015-12-03 01:07:44\";s:12:\"english_name\";s:17:\"Tamil (Sri Lanka)\";s:11:\"native_name\";s:15:\"தமிழ்\";s:7:\"package\";s:65:\"https://downloads.wordpress.org/translation/core/4.2.39/ta_LK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ta\";i:2;s:3:\"tam\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:18:\"தொடர்க\";}}s:2:\"te\";a:8:{s:8:\"language\";s:2:\"te\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2017-01-26 15:47:39\";s:12:\"english_name\";s:6:\"Telugu\";s:11:\"native_name\";s:18:\"తెలుగు\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/translation/core/4.7.2/te.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"te\";i:2;s:3:\"tel\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:30:\"కొనసాగించు\";}}s:2:\"th\";a:8:{s:8:\"language\";s:2:\"th\";s:7:\"version\";s:6:\"5.8.13\";s:7:\"updated\";s:19:\"2022-06-08 04:30:30\";s:12:\"english_name\";s:4:\"Thai\";s:11:\"native_name\";s:9:\"ไทย\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/5.8.13/th.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"th\";i:2;s:3:\"tha\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:15:\"ต่อไป\";}}s:2:\"tl\";a:8:{s:8:\"language\";s:2:\"tl\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-07-02 08:27:46\";s:12:\"english_name\";s:7:\"Tagalog\";s:11:\"native_name\";s:7:\"Tagalog\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/tl.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"tl\";i:2;s:3:\"tgl\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:10:\"Magpatuloy\";}}s:5:\"tr_TR\";a:8:{s:8:\"language\";s:5:\"tr_TR\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-20 13:47:19\";s:12:\"english_name\";s:7:\"Turkish\";s:11:\"native_name\";s:8:\"Türkçe\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/tr_TR.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"tr\";i:2;s:3:\"tur\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:5:\"Devam\";}}s:5:\"tt_RU\";a:8:{s:8:\"language\";s:5:\"tt_RU\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-11-20 20:20:50\";s:12:\"english_name\";s:5:\"Tatar\";s:11:\"native_name\";s:19:\"Татар теле\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/4.7.2/tt_RU.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"tt\";i:2;s:3:\"tat\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:17:\"дәвам итү\";}}s:3:\"tah\";a:8:{s:8:\"language\";s:3:\"tah\";s:7:\"version\";s:5:\"4.7.2\";s:7:\"updated\";s:19:\"2016-03-06 18:39:39\";s:12:\"english_name\";s:8:\"Tahitian\";s:11:\"native_name\";s:10:\"Reo Tahiti\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/4.7.2/tah.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"ty\";i:2;s:3:\"tah\";i:3;s:3:\"tah\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:8:\"Continue\";}}s:5:\"ug_CN\";a:8:{s:8:\"language\";s:5:\"ug_CN\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-06-17 14:09:03\";s:12:\"english_name\";s:6:\"Uighur\";s:11:\"native_name\";s:16:\"ئۇيغۇرچە\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/ug_CN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ug\";i:2;s:3:\"uig\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:26:\"داۋاملاشتۇرۇش\";}}s:2:\"uk\";a:8:{s:8:\"language\";s:2:\"uk\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-07-04 19:51:54\";s:12:\"english_name\";s:9:\"Ukrainian\";s:11:\"native_name\";s:20:\"Українська\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/uk.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"uk\";i:2;s:3:\"ukr\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:20:\"Продовжити\";}}s:2:\"ur\";a:8:{s:8:\"language\";s:2:\"ur\";s:7:\"version\";s:6:\"5.4.19\";s:7:\"updated\";s:19:\"2020-04-09 11:17:33\";s:12:\"english_name\";s:4:\"Urdu\";s:11:\"native_name\";s:8:\"اردو\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/5.4.19/ur.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"ur\";i:2;s:3:\"urd\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:19:\"جاری رکھیں\";}}s:5:\"uz_UZ\";a:8:{s:8:\"language\";s:5:\"uz_UZ\";s:7:\"version\";s:8:\"5.8-beta\";s:7:\"updated\";s:19:\"2021-02-28 12:02:22\";s:12:\"english_name\";s:5:\"Uzbek\";s:11:\"native_name\";s:11:\"O‘zbekcha\";s:7:\"package\";s:67:\"https://downloads.wordpress.org/translation/core/5.8-beta/uz_UZ.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"uz\";i:2;s:3:\"uzb\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:11:\"Davom etish\";}}s:2:\"vi\";a:8:{s:8:\"language\";s:2:\"vi\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-24 01:30:31\";s:12:\"english_name\";s:10:\"Vietnamese\";s:11:\"native_name\";s:14:\"Tiếng Việt\";s:7:\"package\";s:59:\"https://downloads.wordpress.org/translation/core/7.0/vi.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"vi\";i:2;s:3:\"vie\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:12:\"Tiếp tục\";}}s:3:\"yor\";a:8:{s:8:\"language\";s:3:\"yor\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-04-18 05:57:08\";s:12:\"english_name\";s:6:\"Yoruba\";s:11:\"native_name\";s:8:\"Yorùbá\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/translation/core/7.0/yor.zip\";s:3:\"iso\";a:3:{i:1;s:2:\"yo\";i:2;s:3:\"yor\";i:3;s:3:\"yor\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:18:\"Tẹ̀síwájú si\";}}s:5:\"zh_TW\";a:8:{s:8:\"language\";s:5:\"zh_TW\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-04-27 20:54:39\";s:12:\"english_name\";s:16:\"Chinese (Taiwan)\";s:11:\"native_name\";s:12:\"繁體中文\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/zh_TW.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"zh\";i:2;s:3:\"zho\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"繼續\";}}s:5:\"zh_HK\";a:8:{s:8:\"language\";s:5:\"zh_HK\";s:7:\"version\";s:5:\"6.2.9\";s:7:\"updated\";s:19:\"2022-07-15 15:25:03\";s:12:\"english_name\";s:19:\"Chinese (Hong Kong)\";s:11:\"native_name\";s:12:\"香港中文\";s:7:\"package\";s:64:\"https://downloads.wordpress.org/translation/core/6.2.9/zh_HK.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"zh\";i:2;s:3:\"zho\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"繼續\";}}s:5:\"zh_CN\";a:8:{s:8:\"language\";s:5:\"zh_CN\";s:7:\"version\";s:3:\"7.0\";s:7:\"updated\";s:19:\"2026-05-21 05:54:13\";s:12:\"english_name\";s:15:\"Chinese (China)\";s:11:\"native_name\";s:12:\"简体中文\";s:7:\"package\";s:62:\"https://downloads.wordpress.org/translation/core/7.0/zh_CN.zip\";s:3:\"iso\";a:2:{i:1;s:2:\"zh\";i:2;s:3:\"zho\";}s:7:\"strings\";a:1:{s:8:\"continue\";s:6:\"继续\";}}}', 'off');
INSERT INTO `wp_options` VALUES ('993', '_site_transient_timeout_browser_9a57162e11e751523c1e4696bab60779', '1783987590', 'off');
INSERT INTO `wp_options` VALUES ('994', '_site_transient_browser_9a57162e11e751523c1e4696bab60779', 'a:10:{s:4:\"name\";s:5:\"Opera\";s:7:\"version\";s:9:\"132.0.0.0\";s:8:\"platform\";s:7:\"Windows\";s:10:\"update_url\";s:22:\"https://www.opera.com/\";s:7:\"img_src\";s:42:\"http://s.w.org/images/browsers/opera.png?1\";s:11:\"img_src_ssl\";s:43:\"https://s.w.org/images/browsers/opera.png?1\";s:15:\"current_version\";s:5:\"12.18\";s:7:\"upgrade\";b:0;s:8:\"insecure\";b:0;s:6:\"mobile\";b:0;}', 'off');
INSERT INTO `wp_options` VALUES ('995', '_site_transient_timeout_feed_b85365aa61afaf3d4189819a6f57c4c4', '1783425994', 'off');
INSERT INTO `wp_options` VALUES ('996', '_site_transient_feed_b85365aa61afaf3d4189819a6f57c4c4', 'a:6:{s:5:\"child\";a:1:{s:0:\"\";a:1:{s:3:\"rss\";a:1:{i:0;a:6:{s:4:\"data\";s:3:\"\n\n\n\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:7:\"version\";s:3:\"2.0\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:1:{s:7:\"channel\";a:1:{i:0;a:6:{s:4:\"data\";s:52:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\n \n	\n		\n		\n		\n		\n		\n		\n		\n		\n		\n	\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:8:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"Blog – WordPress.org Brasil\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:24:\"https://br.wordpress.org\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:0:\"\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:13:\"lastBuildDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 06 Jul 2026 23:22:54 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"language\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"pt-BR\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:9:\"generator\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"https://wordpress.org/?v=7.1-alpha-62631\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:5:\"image\";a:1:{i:0;a:6:{s:4:\"data\";s:11:\"\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:5:{s:3:\"url\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://s.w.org/favicon.ico?2\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"Blog – WordPress.org Brasil\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:24:\"https://br.wordpress.org\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:5:\"width\";a:1:{i:0;a:5:{s:4:\"data\";s:2:\"32\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:6:\"height\";a:1:{i:0;a:5:{s:4:\"data\";s:2:\"32\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}s:4:\"item\";a:10:{i:0;a:6:{s:4:\"data\";s:70:\"\n		\n		\n					\n		\n		\n		\n				\n\n					\n										\n					\n					\n			\n		\n		\n			\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:6:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:44:\"O que vem por aí para o AI Client no WP 7.1\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:80:\"https://br.wordpress.org/2026/07/03/o-que-vem-por-ai-para-o-ai-client-no-wp-7-1/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:88:\"https://br.wordpress.org/2026/07/03/o-que-vem-por-ai-para-o-ai-client-no-wp-7-1/#respond\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 03 Jul 2026 12:03:17 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://br.wordpress.org/?p=3600\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:349:\"Com o WordPress 7.1 no calendário e a equipe de lançamento anunciada, é hora de começar a planejar o que pretendemos entregar nesta versão. Embora a equipe Core AI já tenha produzido muitos recursos e ferramentas de IA, como o plugin AI, o trabalho principal no core do WordPress, neste momento, é a Abilities API e o AI Client. [&#8230;]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Fellyph Cintra\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:5580:\"\n<p class=\"wp-block-paragraph\">Com o <a href=\"https://make.wordpress.org/core/2026/06/19/roadmap-to-7-1/\">WordPress 7.1</a> no calendário e a equipe de lançamento anunciada, é hora de começar a planejar o que pretendemos entregar nesta versão. Embora a equipe Core AI já tenha produzido muitos recursos e ferramentas de IA, como o plugin AI, o trabalho principal no core do WordPress, neste momento, é a Abilities API e o AI Client. Neste post, vamos nos concentrar no AI Client.</p>\n\n\n\n<p class=\"wp-block-paragraph\">O estado atual do AI Client é ser a peça fundamental para executar IA de forma programática no WordPress. O <a href=\"https://github.com/wordpress/ai\">repositório do plugin de IA</a> tem uma lista crescente de recursos alimentados pelo AI Client. Ainda não há IA visível na interface padrão do WordPress, pois o foco atual é fortalecer o ecossistema de criadores de plugins.</p>\n\n\n\n<p class=\"wp-block-paragraph\">O trabalho planejado para a versão 7.1 será uma continuação desse esforço. Vamos continuar a desenvolver e usar o plugin de IA para explorar e oferecer recursos de IA nativos do WordPress.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Streaming de geração</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ao usar agentes de IA, você talvez tenha notado que o agente envia a resposta de volta por streaming. Isso não é um recurso superficial: é literalmente o servidor transmitindo o texto gerado de volta para você em tempo real. A ideia é dar ao usuário um feedback visual imediato, em vez de apenas oferecer uma experiência do tipo &#8220;aguarde&#8221;.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Fazer isso funcionar no WordPress é mais complicado do que parece. Para que o streaming funcione, o servidor precisa permitir solicitações longas, que podem durar vários minutos. No entanto, a maioria dos servidores atinge o tempo limite após 30 segundos, e o sistema de solicitações do WordPress não oferece suporte a isso por padrão.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Por esse motivo, vamos começar <a href=\"https://github.com/WordPress/php-ai-client/issues/100\">introduzindo streaming</a> no <a href=\"https://github.com/wordpress/php-ai-client/\">PHP AI Client</a>, o framework subjacente que alimenta o AI Client, mas que não é acoplado ao WordPress. Isso significa que o streaming estará disponível no WP 7.1, mas não como algo suportado nativamente pelo WordPress. Isso permitirá que desenvolvedores e provedores de hospedagem investiguem o recurso e comecem a criar suporte para o WordPress em uma versão futura.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Embeddings</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Um conceito um pouco mais profundo na IA é o de embeddings. Em termos simples, um embedding é um valor numérico que um algoritmo atribui a um dado para representar sua similaridade com outros dados. Isso é especialmente útil em pesquisas, já que embeddings podem ajudar a identificar itens relacionados rapidamente, mesmo quando eles não parecem semelhantes à primeira vista.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine, por exemplo, pesquisar por &#8220;como redefino minha senha?&#8221;. Pode haver uma página chamada &#8220;Etapas de recuperação de conta&#8221;, mas você vai notar que essas frases não têm uma única palavra em comum. Ainda assim, elas estão relacionadas em termos de significado. Embeddings oferecem uma forma, baseada em IA, de relacionar esses conceitos, permitindo que uma pesquisa como essa funcione perfeitamente.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Esses embeddings são tratados por meio de um processo específico chamado &#8220;vetorização&#8221;, e versões recentes do MySQL e do MariaDB adicionaram suporte nativo ao <a href=\"https://en.wikipedia.org/wiki/Vector_database\">armazenamento de vetores</a>. No momento, há um experimento sendo desenvolvido no plugin de IA para <a href=\"https://github.com/WordPress/ai/pull/683\">adicionar pesquisa vetorial</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Muitos provedores diferentes oferecem suporte a modelos de IA que geram embeddings. Adicionar suporte a embeddings ao AI Client tornará esse poderoso recurso mais acessível. Isso pode abrir caminho para novas formas incríveis e poderosas de pesquisar conteúdo no WordPress!</p>\n\n\n\n<h2 class=\"wp-block-heading\">Pequenas correções e melhorias</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Isso não é tudo. Também haverá pequenas correções e melhorias compatíveis com versões anteriores, a fim de continuar aprimorando a confiabilidade do AI Client. À medida que o testamos em cenários reais e o aprimoramos, vamos ganhar confiança para incorporar mais recursos ao core.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Obrigado por ler e, como sempre, todo mundo é bem-vindo a entrar no Slack do WordPress e nos encontrar no canal <a href=\"https://wordpress.slack.com/archives/C08TJ8BPULS\">#core-ai</a>! Não importa se você desenvolve ou não. Agradecemos todas as contribuições e perguntas!</p>\n\n\n\n<p class=\"wp-block-paragraph\">Props para <a href=\"https://profiles.wordpress.org/jason_the_adams/\">@jason_the_adams</a> por criar o post original e <a href=\"https://profiles.wordpress.org/justlevine/\">@justlevine</a>, <a href=\"https://profiles.wordpress.org/annezazu/\">@annezazu</a>, <a href=\"https://profiles.wordpress.org/thelovekesh/\">@thelovekesh</a>, <a href=\"https://profiles.wordpress.org/jeffpaul/\">@jeffpaul</a> e <a href=\"https://profiles.wordpress.org/nikskyverge/\">@nikskyverge</a> pela revisão antes da publicação.</p>\n\n\n\n<p class=\"wp-block-paragraph\"></p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:36:\"http://wellformedweb.org/CommentAPI/\";a:1:{s:10:\"commentRss\";a:1:{i:0;a:5:{s:4:\"data\";s:85:\"https://br.wordpress.org/2026/07/03/o-que-vem-por-ai-para-o-ai-client-no-wp-7-1/feed/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:38:\"http://purl.org/rss/1.0/modules/slash/\";a:1:{s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:1:\"0\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"3600\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:1;a:6:{s:4:\"data\";s:73:\"\n		\n		\n					\n		\n		\n		\n				\n		\n\n					\n										\n					\n					\n			\n		\n		\n			\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:6:{s:0:\"\";a:7:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:80:\"A comunidade brasileira de WordPress migrou para o Slack global (Make WordPress)\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:115:\"https://br.wordpress.org/2026/06/26/a-comunidade-brasileira-de-wordpress-migrou-para-o-slack-global-make-wordpress/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:123:\"https://br.wordpress.org/2026/06/26/a-comunidade-brasileira-de-wordpress-migrou-para-o-slack-global-make-wordpress/#respond\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 26 Jun 2026 20:25:32 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"Geral\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://br.wordpress.org/?p=3594\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:363:\"Em maio de 2026, Mary Hubbard convidou as comunidades locais ao redor do mundo para migrar sua comunicação para o Slack do Make WordPress, o bate-papo oficial da comunidade internacional. A proposta era criar pontes mais fortes entre comunidades de diferentes países, sem abrir mão das conversas em idiomas locais. A comunidade brasileira abraçou a [&#8230;]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Daniel Kossmann\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:6039:\"\n<p class=\"wp-block-paragraph\">Em maio de 2026, <a href=\"https://make.wordpress.org/project/2026/05/07/welcome-all-languages-and-communities-to-make-wordpress-slack/\">Mary Hubbard convidou as comunidades locais ao redor do mundo para migrar sua comunicação para o Slack do Make WordPress</a>, o bate-papo oficial da comunidade internacional. A proposta era criar pontes mais fortes entre comunidades de diferentes países, sem abrir mão das conversas em idiomas locais.</p>\n\n\n\n<p class=\"wp-block-paragraph\">A comunidade brasileira abraçou a iniciativa e começou a se organizar. Durante o Dia do Contribuidor do WordCamp Europa 2026, <a href=\"https://br.wordpress.org/2026/06/10/o-brasil-no-wordcamp-europe-2026-conexoes-contribuicoes-e-o-futuro-do-wordpress-em-cracovia/\">esse processo foi oficializado e os canais dedicados à comunidade brasileira foram criados</a>. Somos uma das primeiras comunidades a migrar, ao lado de países como Espanha, Japão e Itália.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Canais criados</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Os seguintes canais já estão disponíveis no <a href=\"https://make.wordpress.org/chat/\">Slack do Make WordPress</a>:</p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>#general-br</strong> &#8211; canal geral para a comunidade brasileira</li>\n\n\n\n<li><strong>#marketing-br</strong> &#8211; canal para o time de marketing da comunidade brasileira</li>\n\n\n\n<li><strong>#community-events-br</strong> &#8211; canal para organizadores de eventos da comunidade brasileira</li>\n\n\n\n<li><strong>#forums-mods-br</strong> &#8211; canal privado para moderadores dos fóruns da comunidade brasileira</li>\n\n\n\n<li><strong>#forums-br</strong> &#8211; canal dos <a href=\"https://br.wordpress.org/support/forums/\">fóruns de suporte da comunidade brasileira</a></li>\n\n\n\n<li><strong>#polyglots-pt-br</strong> &#8211; canal para os tradutores de português do Brasil (pt_BR)</li>\n\n\n\n<li><strong>#polyglots-mods-pt-br</strong> &#8211; canal privado para os moderadores da tradução de português do Brasil (pt_BR)</li>\n\n\n\n<li><strong>#event-wordcamp-brasil</strong> &#8211; canal para os organizadores do <a href=\"https://brasil.wordcamp.org/\">WordCamp Brasil</a></li>\n</ol>\n\n\n\n<h2 class=\"wp-block-heading\">Por que essa migração é importante?</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Até agora, a comunidade brasileira utilizava uma conta gratuita do Slack, que tinha várias limitações. Uma delas era o histórico de mensagens restrito aos últimos 90 dias, dificultando o acesso a conversas anteriores e a preservação da história da comunidade. Com a migração, esse registro é preservado.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Além disso, há várias outras vantagens importantes:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ferramentas profissionais</strong>: acesso ao plano pago do Slack sem custo adicional para a comunidade</li>\n\n\n\n<li><strong>Visibilidade global</strong>: nossas discussões ficam acessíveis para contribuidores do mundo inteiro</li>\n\n\n\n<li><strong>Conexão direta com as equipes do projeto</strong>: fica mais fácil colaborar com todos os times do WordPress</li>\n\n\n\n<li><strong>Integração entre comunidades</strong>: conversamos lado a lado com grupos de outros países, abrindo portas para colaborações internacionais</li>\n\n\n\n<li><strong>Preservação do conhecimento</strong>: decisões e conversas importantes ficam centralizadas e acessíveis no longo prazo</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Dentro de cada canal da comunidade brasileira a comunicação continua em português.</strong> A mudança é de plataforma, não de identidade.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Como participar</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para entrar no Slack do Make WordPress, siga os seguintes passos:</p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https://login.wordpress.org/register\">Crie uma conta no WordPress.org</a>. Caso já tenha uma conta, <a href=\"https://login.wordpress.org/\">faça o login</a>.</li>\n\n\n\n<li>Acesse a <a href=\"https://make.wordpress.org/chat/\">página do Slack Internacional</a> com sua conta do WordPress.org</li>\n\n\n\n<li>Vá até a seção &#8220;Joining the WordPress team on Slack&#8221; e clique no botão para criar sua conta no Slack</li>\n\n\n\n<li>Verifique sua caixa de entrada em busca de um e-mail com o título &#8220;Join the WordPress.org Slack&#8221;</li>\n\n\n\n<li>No e-mail recebido, clique no botão &#8220;Join Now&#8221; para ser redirecionado ao Slack da comunidade</li>\n\n\n\n<li>Informe seu nome e crie uma senha</li>\n\n\n\n<li>Para entrar nos canais, clique no link do canal e depois no botão <code>Join Channel</code> na parte inferior central da tela. Repita o processo para todos os canais abaixo.\n<ul class=\"wp-block-list\">\n<li><a href=\"https://wordpress.slack.com/archives/C0B8AT5SJUR\">#general-br</a></li>\n\n\n\n<li><a href=\"https://wordpress.slack.com/archives/C0B8CN75BCL\">#marketing-br</a></li>\n\n\n\n<li><a href=\"https://wordpress.slack.com/archives/C0B7TL4FQMV\">#community-events-br</a></li>\n\n\n\n<li><a href=\"https://wordpress.slack.com/archives/C0B7TQD4T5M\">#forums-br</a></li>\n\n\n\n<li><a href=\"https://wordpress.slack.com/archives/C0B8B42K6N5\">#polyglots-pt-br</a></li>\n\n\n\n<li><a href=\"https://wordpress.slack.com/archives/C0B7TS1DNRM\">#event-wordcamp-brasil</a></li>\n</ul>\n</li>\n\n\n\n<li>Como alternativa ao links acima, é possível utilizar a busca localizada no meio do topo da tela, digitar o nome do canal e clicar nele (canais possuem um ícone de <code>#</code>), e depois clicar no botão <code>Join Channel</code> na parte inferior central da tela.</li>\n</ol>\n\n\n\n<p class=\"wp-block-paragraph\">Pronto, agora você faz parte do meio oficial de comunicação da comunidade brasileira e global do WordPress!</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<p class=\"wp-block-paragraph\">A migração marca um momento especial para a comunidade brasileira de WordPress, que segue crescendo, contribuindo e se conectando com o WordPress globalmente. Espero você lá no Slack!</p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:36:\"http://wellformedweb.org/CommentAPI/\";a:1:{s:10:\"commentRss\";a:1:{i:0;a:5:{s:4:\"data\";s:120:\"https://br.wordpress.org/2026/06/26/a-comunidade-brasileira-de-wordpress-migrou-para-o-slack-global-make-wordpress/feed/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:38:\"http://purl.org/rss/1.0/modules/slash/\";a:1:{s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:1:\"0\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"3594\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:2;a:6:{s:4:\"data\";s:73:\"\n		\n		\n					\n		\n		\n		\n				\n		\n\n					\n										\n					\n					\n			\n		\n		\n			\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:6:{s:0:\"\";a:7:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:97:\"O Brasil no WordCamp Europa 2026: Conexões, Contribuições e o Futuro do WordPress em Cracóvia\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:128:\"https://br.wordpress.org/2026/06/10/o-brasil-no-wordcamp-europe-2026-conexoes-contribuicoes-e-o-futuro-do-wordpress-em-cracovia/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:137:\"https://br.wordpress.org/2026/06/10/o-brasil-no-wordcamp-europe-2026-conexoes-contribuicoes-e-o-futuro-do-wordpress-em-cracovia/#comments\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 10 Jun 2026 14:18:55 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:9:\"WordCamps\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://br.wordpress.org/?p=3571\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:345:\"O WordCamp Europa é uma das principais conferências de tecnologia do continente europeu. Na primeira semana de junho de 2026, a histórica cidade de Cracóvia, na Polônia, sediou esta edição do evento, que reuniu a comunidade global no ICE Kraków Congress Centre entre os dias 4 e 6 de junho. Com um total de&#160;2.458 ingressos [&#8230;]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Fellyph Cintra\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:14445:\"\n<p class=\"wp-block-paragraph\">O WordCamp Europa é uma das principais conferências de tecnologia do continente europeu. Na primeira semana de junho de 2026, a histórica cidade de Cracóvia, na Polônia, sediou esta edição do evento, que reuniu a comunidade global no ICE Kraków Congress Centre entre os dias 4 e 6 de junho.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://br.wordpress.org/files/2026/06/1780949067280.jpeg\"><img fetchpriority=\"high\" decoding=\"async\" width=\"695\" height=\"1024\" src=\"https://br.wordpress.org/files/2026/06/1780949067280-695x1024.jpeg\" alt=\"\" class=\"wp-image-3577\" srcset=\"https://br.wordpress.org/files/2026/06/1780949067280-695x1024.jpeg 695w, https://br.wordpress.org/files/2026/06/1780949067280-204x300.jpeg 204w, https://br.wordpress.org/files/2026/06/1780949067280-768x1131.jpeg 768w, https://br.wordpress.org/files/2026/06/1780949067280-1042x1536.jpeg 1042w, https://br.wordpress.org/files/2026/06/1780949067280.jpeg 1170w\" sizes=\"(max-width: 695px) 100vw, 695px\" /></a></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Com um total de&nbsp;<strong>2.458 ingressos vendidos&nbsp;e participantes de&nbsp;81 países</strong>, o evento reforçou a importância da colaboração internacional no ecossistema do WordPress. Nas redes sociais (Facebook e Instagram), o evento alcançou a marca de&nbsp;<strong>140 mil visualizações</strong>. </p>\n\n\n\n<p class=\"wp-block-paragraph\">A cidade de Cracóvia se destacou pela receptividade, pela organização e por sua comunidade ativa, proporcionando um ambiente propício à troca de conhecimentos e ao fortalecimento de parcerias.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<h2 class=\"wp-block-heading\">Um Marco para a Comunidade Brasileira no Slack Global</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes mesmo do início das atividades oficiais, as conexões entre os membros da comunidade brasileira já trouxeram novidades importantes. Durante o dia do contribuidor, Daniel Kossmann (organizador do PainelWP e membro ativo da comunidade brasileira) compartilhou uma atualização relevante: agora, o Slack global do WordPress conta com <a href=\"https://wordpress.slack.com/archives/C0B8AT5SJUR\">uma lista de canais dedicados à comunidade brasileira</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Essa iniciativa facilita a centralização da comunicação entre os membros brasileiros, garantindo visibilidade global às discussões locais e abrindo espaço para uma interação mais direta com lideranças e colaboradores internacionais do projeto.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<h2 class=\"wp-block-heading\">Contributor Day: Liderança e Trabalho Prático</h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https://br.wordpress.org/files/2026/06/contributor-day-krakow.jpg\"><img decoding=\"async\" width=\"2000\" height=\"1500\" src=\"https://br.wordpress.org/files/2026/06/contributor-day-krakow.jpg\" alt=\"\" class=\"wp-image-3575\" srcset=\"https://br.wordpress.org/files/2026/06/contributor-day-krakow.jpg 2000w, https://br.wordpress.org/files/2026/06/contributor-day-krakow-300x225.jpg 300w, https://br.wordpress.org/files/2026/06/contributor-day-krakow-768x576.jpg 768w, https://br.wordpress.org/files/2026/06/contributor-day-krakow-1024x768.jpg 1024w, https://br.wordpress.org/files/2026/06/contributor-day-krakow-1536x1152.jpg 1536w, https://br.wordpress.org/files/2026/06/contributor-day-krakow-440x330.jpg 440w\" sizes=\"(max-width: 2000px) 100vw, 2000px\" /></a></figure>\n\n\n\n<p class=\"wp-block-paragraph\">O primeiro dia do evento (4 de junho) foi dedicado ao Contributor Day, espaço que reuniu&nbsp;<strong>778 participantes</strong>&nbsp;distribuídos em&nbsp;<strong>23 equipes de trabalho (Make teams)</strong>, contando com o suporte de&nbsp;<strong>35 líderes de mesa (Table leads)</strong>. A presença brasileira foi ativa, tanto na colaboração quanto na liderança de mesas temáticas:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><span style=\"margin: 0px;padding: 0px\"><strong>WordPress Coding Standards (WPCS):</strong>&nbsp;A mesa foi liderada pelo brasileiro <a href=\"https://profiles.wordpress.org/rodrigosprimo/\">Rodrigo Primo</a>, que coordenou o aprimoramento dos padrões de código do WordPress.</span></li>\n\n\n\n<li><strong>WordPress Playground:</strong>&nbsp;Fellyph Cintra liderou esta mesa, que contou com 10 participantes. Durante as atividades, quatro novos colaboradores realizaram suas primeiras contribuições oficiais ao core do WordPress e receberam seus respectivos badges de contribuição.</li>\n\n\n\n<li><span style=\"margin: 0px;padding: 0px\"><strong>Performance:</strong>&nbsp;Mesa focada em otimização de performance da plataforma, contou com a colaboração de&nbsp;Daniel Paz,&nbsp;o qual realizou a sua primeira contribuição para o plugin </span><a href=\"https://wordpress.org/plugins/performance-lab/\"><span style=\"margin: 0px;padding: 0px\">Performance</span> Lab</a>.</li>\n\n\n\n<li><span style=\"margin: 0px;padding: 0px\"><strong>Comunidade:</strong>&nbsp;Daniel Kossmann e <a href=\"https://profiles.wordpress.org/marcoandrei/\">Marco Andrei</a></span> participaram ativamente das discussões sobre o fortalecimento e a expansão das comunidades locais.</li>\n</ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https://br.wordpress.org/files/2026/06/1780918235700.jpeg\"><img decoding=\"async\" width=\"2048\" height=\"1365\" src=\"https://br.wordpress.org/files/2026/06/1780918235700.jpeg\" alt=\"\" class=\"wp-image-3579\" srcset=\"https://br.wordpress.org/files/2026/06/1780918235700.jpeg 2048w, https://br.wordpress.org/files/2026/06/1780918235700-300x200.jpeg 300w, https://br.wordpress.org/files/2026/06/1780918235700-767x511.jpeg 767w, https://br.wordpress.org/files/2026/06/1780918235700-1536x1024.jpeg 1536w, https://br.wordpress.org/files/2026/06/1780918235700-1024x683.jpeg 1024w\" sizes=\"(max-width: 2048px) 100vw, 2048px\" /></a></figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<h2 class=\"wp-block-heading\">Palestras, Workshops e Presença no Palco Principal</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Os dias 5 e 6 de junho foram dedicados às trilhas de conteúdo, distribuídas no palco principal, no palco secundário e nas salas reservadas, nas quais foram realizados&nbsp;<strong>8 workshops</strong>. No total,&nbsp;<strong>mais de 60 palestrantes</strong>&nbsp;compartilharam suas experiências.</p>\n\n\n\n<p class=\"wp-block-paragraph\">A comunidade brasileira esteve representada no palco principal por <a href=\"https://profiles.wordpress.org/fellyph/\">Fellyph Cintra</a>, que apresentou a palestra&nbsp;<strong>&#8220;<a href=\"https://wordpress.tv/2026/06/05/whats-new-in-wordpress-playground/\">O que há de novo no WordPress Playground</a>&#8220;</strong>. Na ocasião, foram apresentadas as atualizações recentes e as principais implementações desenvolvidas pela equipe do Playground, ferramenta que vem facilitando testes e experimentações em navegadores.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://br.wordpress.org/files/2026/06/palestra-fellyph-wordcamp-europa.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https://br.wordpress.org/files/2026/06/palestra-fellyph-wordcamp-europa-1024x768.jpg\" alt=\"\" class=\"wp-image-3581\" srcset=\"https://br.wordpress.org/files/2026/06/palestra-fellyph-wordcamp-europa-1024x768.jpg 1024w, https://br.wordpress.org/files/2026/06/palestra-fellyph-wordcamp-europa-300x225.jpg 300w, https://br.wordpress.org/files/2026/06/palestra-fellyph-wordcamp-europa-768x576.jpg 768w, https://br.wordpress.org/files/2026/06/palestra-fellyph-wordcamp-europa-1536x1152.jpg 1536w, https://br.wordpress.org/files/2026/06/palestra-fellyph-wordcamp-europa-440x330.jpg 440w, https://br.wordpress.org/files/2026/06/palestra-fellyph-wordcamp-europa-2048x1536.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></a></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Paralelamente às palestras, <a href=\"https://profiles.wordpress.org/kossmann/\">Daniel Kossmann</a> atuou como voluntário no&nbsp;<em>Community Booth</em>&nbsp;(o estande da comunidade). O espaço registrou um volume expressivo de interações e dados ao longo do evento:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Mais de 1.500 pessoas</strong>&nbsp;passaram pelo estande da comunidade.</li>\n\n\n\n<li>O quiz interativo do estande (<em>Community Booth Quiz</em>) foi respondido&nbsp;<strong>mais de 1.550 vezes</strong>.</li>\n\n\n\n<li>Os visitantes adicionaram&nbsp;<strong>mais de 550 pins</strong>&nbsp;ao mapa interativo, representando participantes de&nbsp;<strong>58 países</strong>.</li>\n\n\n\n<li>Foram distribuídos&nbsp;<strong>mais de 3.600 itens de brinde (swags)</strong>&nbsp;do WCEU, incluindo&nbsp;<strong>600 dragões de pelúcia</strong>&nbsp;(símbolo de Cracóvia) e cadernos de anotações.</li>\n</ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<h2 class=\"wp-block-heading\">Destaques: Inteligência Artificial, Desenvolvimento e Negócios</h2>\n\n\n\n<p class=\"wp-block-paragraph\">O conteúdo técnico do WordCamp Europa 2026 refletiu as principais tendências de evolução do WordPress, com forte ênfase em inteligência artificial e preparação para a futura versão 7.0.</p>\n\n\n\n<h3 class=\"wp-block-heading\">O Painel do WordPress 7.0 e IA</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Um dos momentos de maior atenção foi o painel sobre o WordPress 7.0 e Inteligência Artificial, que contou com a participação de Sarah Norris, Milana, Houman, Benjamin Sekhavat e Adam Silverstein. O grupo discutiu os desafios de desenvolvimento para a próxima grande versão, os impactos da IA na criação de sites e apresentou a nova página de &#8220;Conectores&#8221;, que servirá de base estrutural para futuras integrações de serviços no ecossistema.</p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-incorporado-de-wordpress-tv wp-block-embed-incorporado-de-wordpress-tv wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"VideoPress Video Player\" aria-label=\"VideoPress Video Player\" width=\"500\" height=\"281\" src=\"https://video.wordpress.com/embed/U5T0ameQ?hd=1&amp;cover=1\" frameborder=\"0\" allowfullscreen allow=\"clipboard-write\"></iframe><script src=\'https://v0.wordpress.com/js/next/videopress-iframe.js?m=1770107250\'></script>\n</div></figure>\n\n\n\n<h3 class=\"wp-block-heading\">Inteligência Artificial e a Relação Humana</h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Alain Schlesser</strong>&nbsp;(mantenedor do WP-CLI) abordou o desenvolvimento de estruturas nativas de IA voltadas para a web, assistentes virtuais e barramentos de busca integrados.</li>\n\n\n\n<li><strong><a href=\"https://wordpress.tv/2026/06/05/human-in-the-loop-means-something/\">Tammy Lister</a></strong>&nbsp;trouxe uma reflexão sobre a sinergia entre humanos e Inteligência Artificial, abordando como os criadores podem utilizar ferramentas automatizadas sem perder a personalidade e a qualidade na produção de conteúdo.</li>\n</ul>\n\n\n\n<h3 class=\"wp-block-heading\">Desenvolvimento, Acessibilidade e Revisão de Plugins</h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dennis</strong>&nbsp;apresentou a evolução da API de HTML do WordPress, destacando como as melhorias estruturais ajudam desenvolvedores a manipular elementos com maior segurança.</li>\n\n\n\n<li><strong>Jessica Lyschik</strong>&nbsp;(líder da equipe de temas) ministrou uma palestra focada em acessibilidade, detalhando os requisitos fundamentais para que temas modernos atendam às diretrizes globais de inclusão.</li>\n\n\n\n<li><strong>David Pérez e Fran Torres</strong>&nbsp;conduziram uma sessão prática sobre análise clínica de segurança e desempenho em plugins. Com uma bagagem de mais de 25 mil revisões de plugins, os palestrantes apontaram os erros mais comuns e as boas práticas de desenvolvimento exigidas no diretório oficial.</li>\n</ul>\n\n\n\n<h3 class=\"wp-block-heading\">Negócios e Open Source</h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Marcel Bootsman</strong>&nbsp;<a href=\"https://wordpress.tv/2026/06/06/open-source-is-democratic-infrastructure-support-it/\">apresentou estratégias e caminhos para que empresas </a>e profissionais autônomos estruturem seus modelos de negócios em conformidade e sinergia com o ecossistema de código aberto.</li>\n\n\n\n<li><strong>Karin Christen</strong>&nbsp;abordou o<a href=\"https://europe.wordcamp.org/2026/session/how-we-made-wp-contribution-part-of-our-agency-culture/\"> funcionamento do programa&nbsp;<em>Five for the Future</em>,</a> demonstrando como a contribuição sistemática de horas de trabalho por parte das agências e empresas ajuda a sustentar a evolução do WordPress a longo prazo.</li>\n</ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<h2 class=\"wp-block-heading\">Encerramento e o Futuro no WordCamp Europa 2027</h2>\n\n\n\n<p class=\"wp-block-paragraph\">O painel de encerramento reuniu <a href=\"https://profiles.wordpress.org/4thhubbard/\">Mary Hubbard </a>(diretora na divisão WordPress.org), <a href=\"https://profiles.wordpress.org/matveb/\">Matias Ventura </a>(líder do projeto Gutenberg) e <a href=\"https://profiles.wordpress.org/richtabor/\">Rich Tabor</a> (designer e desenvolvedor focado em IA). Os painelistas resumiram as diretrizes de desenvolvimento para o ecossistema, reforçando o foco em usabilidade, ferramentas facilitadoras para criadores de conteúdo e a consolidação do Gutenberg.</p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-incorporado-de-wordpress-tv wp-block-embed-incorporado-de-wordpress-tv wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"VideoPress Video Player\" aria-label=\"VideoPress Video Player\" width=\"500\" height=\"281\" src=\"https://video.wordpress.com/embed/4IcGMyGu?hd=1&amp;cover=1\" frameborder=\"0\" allowfullscreen allow=\"clipboard-write\"></iframe><script src=\'https://v0.wordpress.com/js/next/videopress-iframe.js?m=1770107250\'></script>\n</div></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Com o encerramento das atividades em Cracóvia, a organização anunciou que a próxima edição do WordCamp Europa, em 2027, será realizada em Málaga, na Espanha. A expectativa é de que a comunidade brasileira continue a expandir sua participação e colaboração nos palcos e nas mesas de contribuição globais.</p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:36:\"http://wellformedweb.org/CommentAPI/\";a:1:{s:10:\"commentRss\";a:1:{i:0;a:5:{s:4:\"data\";s:133:\"https://br.wordpress.org/2026/06/10/o-brasil-no-wordcamp-europe-2026-conexoes-contribuicoes-e-o-futuro-do-wordpress-em-cracovia/feed/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:38:\"http://purl.org/rss/1.0/modules/slash/\";a:1:{s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:1:\"2\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"3571\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:3;a:6:{s:4:\"data\";s:70:\"\n		\n		\n					\n		\n		\n		\n				\n\n					\n										\n					\n					\n			\n		\n		\n			\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:6:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:77:\"PR Preview com WordPress Playground: o que muda na versão 3 da GitHub Action\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:112:\"https://br.wordpress.org/2026/06/02/pr-preview-com-wordpress-playground-o-que-muda-na-versao-3-da-github-action/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:120:\"https://br.wordpress.org/2026/06/02/pr-preview-com-wordpress-playground-o-que-muda-na-versao-3-da-github-action/#respond\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 02 Jun 2026 13:16:29 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://br.wordpress.org/?p=3568\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:371:\"Revisar um Pull Request de plugin ou tema sempre demanda tempo. Para testar de verdade, alguém precisava baixar a branch, subir um WordPress local e ativar o código manualmente. Por isso, existe a GitHub Action de PR Preview do WordPress Playground: ela adiciona um botão &#8220;Preview in WordPress Playground&#8221; diretamente no PR. Dessa forma, qualquer [&#8230;]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Fellyph Cintra\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:14475:\"\n<p class=\"wp-block-paragraph\">Revisar um Pull Request de plugin ou tema sempre demanda tempo. Para testar de verdade, alguém precisava baixar a branch, subir um WordPress local e ativar o código manualmente. Por isso, existe a GitHub Action de PR Preview do WordPress Playground: ela adiciona um botão &#8220;Preview in WordPress Playground&#8221; diretamente no PR. Dessa forma, qualquer revisor abre o ambiente já com o código aplicado, no navegador, sem instalar nada.</p>\n\n\n\n<p class=\"wp-block-paragraph\">A action já existia na v2. No entanto, a versão 3 passou por uma simplificação importante: a &#8220;cola&#8221; manual que cada projeto tinha que escrever para builds deu lugar a reusable workflows prontos. Neste post, portanto, vou cobrir o que ela faz, por que vale a pena, como configurá-la nos dois cenários possíveis, exemplos práticos e o passo a passo para migrar da v2.</p>\n\n\n\n<h2 class=\"wp-block-heading\">O que a action de PR Preview do WordPress Playground faz</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Em resumo, ela publica um link de prévia no Pull Request. Esse link aponta para uma instância do WordPress Playground — ou seja, um WordPress completo rodando via WebAssembly (WASM) no navegador do usuário. O Playground sobe limpo, instala o plugin ou tema da branch do PR e ativa tudo automaticamente.</p>\n\n\n\n<p class=\"wp-block-paragraph\">O resultado, portanto, é um ambiente descartável e isolado, criado sob demanda, que reflete exatamente o estado daquela branch.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Por que usar</h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Teste em um clique:</strong> o revisor não precisa de configuração local nem de WordPress instalado.</li>\n\n\n\n<li><span style=\"margin: 0px;padding: 0px\"><strong>Funciona com forks:</strong> contribuições externas recebem uma prévia sem expor segredos do repositório.</span></li>\n\n\n\n<li><strong>Plugin, tema ou os dois:</strong> dá para montar cenários combinando vários artefatos.</li>\n\n\n\n<li><strong>Lida com builds complexos:</strong> projetos que dependem de Composer, npm ou Vite também são suportados por meio de workflows dedicados.</li>\n\n\n\n<li><strong>Sandbox real:</strong> o código roda no navegador do usuário, isolado, sem tocar em nenhum servidor.</li>\n</ul>\n\n\n\n<h2 class=\"wp-block-heading\">Cenário 1: sem etapa de build</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Esse é o caminho mais simples. Use quando os arquivos versionados no repositório já rodam direto, sem compilação, um plugin em PHP puro, por exemplo.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Primeiramente, crie <code>.github/workflows/pr-preview.yml</code>:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\">\nname: PR Preview\non:\n  pull_request:\n    types: &#x5B;opened, synchronize, reopened, edited]\n\njobs:\n  preview:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      pull-requests: write\n    steps:\n      - uses: WordPress/action-wp-playground-pr-preview@v3\n        with:\n          plugin-path: .\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">Para um tema, troque <code>plugin-path: .</code> por <code>theme-path: .</code>. Além disso, o bloco <code>permissions</code> é obrigatório: a action precisa de <code>pull-requests: write</code> para escrever o link no PR e <code>contents: read</code> para ler o código.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Inputs principais da action direta</h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Input</th><th>Obrigatório</th><th>Padrão</th><th>Função</th></tr></thead><tbody><tr><td><code>plugin-path</code></td><td>um dos quatro</td><td>—</td><td>Caminho relativo do diretório do plugin</td></tr><tr><td><code>theme-path</code></td><td>um dos quatro</td><td>—</td><td>Caminho relativo do diretório do tema</td></tr><tr><td><code>blueprint</code></td><td>um dos quatro</td><td>—</td><td>Blueprint JSON customizado (string)</td></tr><tr><td><code>blueprint-url</code></td><td>um dos quatro</td><td>—</td><td>URL de um Blueprint hospedado</td></tr><tr><td><code>mode</code></td><td>não</td><td><code>append-to-description</code></td><td><code>append-to-description</code> ou <code>comment</code></td></tr><tr><td><code>github-token</code></td><td>sim</td><td>—</td><td>Token com permissão de escrita no PR</td></tr><tr><td><code>playground-host</code></td><td>não</td><td><code>https://playground.wordpress.net</code></td><td>URL base do Playground</td></tr></tbody></table></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Você fornece <strong>um</strong> entre <code>plugin-path</code>, <code>theme-path</code>, <code>blueprint</code> ou <code>blueprint-url</code>. Já o <code>mode</code> decide se o link entra no corpo da descrição do PR ou como comentário.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Cenário 2: com etapa de build</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Quando o preview depende de compilação (<code>npm run build</code>, Composer, etc.), a v3 usa <strong>dois workflows</strong> que se conversam. Primeiramente, faz-se o build do código não confiável do PR com permissões somente leitura. Em seguida, o outro publica o resultado a partir da branch padrão, com permissões de escrita, sem nunca executar o código do PR. O único ponto de contato entre os dois é o arquivo ZIP gerado — e é justamente isso que mantém o fluxo seguro.</p>\n\n\n\n<p class=\"wp-block-paragraph\">O workflow de build fica em <code>.github/workflows/pr-preview-build.yml</code>:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\">\nname: PR Preview - Build\non:\n  pull_request:\n    types: &#x5B;opened, synchronize, reopened, edited]\n\njobs:\n  build:\n    uses: WordPress/action-wp-playground-pr-preview/.github/workflows/preview-build.yml@v3\n    with:\n      artifacts: my-plugin=build/my-plugin.zip\n      node-version: &#039;20&#039;\n      build-command: |\n        npm ci\n        npm run build:plugin-zip\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">Já o workflow de publicação fica em <code>.github/workflows/pr-preview-publish.yml</code>:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\">\nname: PR Preview - Publish\non:\n  workflow_run:\n    workflows: &#x5B;&quot;PR Preview - Build&quot;]\n    types: &#x5B;completed]\n\npermissions:\n  contents: write\n  pull-requests: write\n\njobs:\n  publish:\n    permissions:\n      contents: write\n      pull-requests: write\n    uses: WordPress/action-wp-playground-pr-preview/.github/workflows/preview-publish.yml@v3\n    with:\n      kind: plugin\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">O campo <code>artifacts</code> usa o formato <code>nome=caminho/para/arquivo.zip</code> — um por linha, se houver vários. Já o <code>kind</code> no publish indica se o artefato é <code>plugin</code> ou <code>theme</code>. Além disso, os reusable workflows cuidam de criar automaticamente um <em>prerelease</em> <code>ci-artifacts</code> para hospedar os ZIPs publicamente. Afinal, o Playground precisa baixar o asset, e por isso ele não pode ficar em um release <em>draft</em>.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Inputs do workflow de build</h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Input</th><th>Obrigatório</th><th>Função</th></tr></thead><tbody><tr><td><code>artifacts</code></td><td>sim</td><td>Entradas <code>nome=caminho.zip</code>, uma por linha</td></tr><tr><td><code>build-command</code></td><td>sim</td><td>Comandos de shell que geram os ZIPs</td></tr><tr><td><code>node-version</code></td><td>não</td><td>Roda <code>actions/setup-node@v4</code> se definido</td></tr><tr><td><code>php-version</code></td><td>não</td><td>Roda <code>shivammathur/setup-php@v2</code> se definido</td></tr><tr><td><code>fetch-depth</code></td><td>não</td><td>Repassado ao <code>actions/checkout@v4</code> (padrão: 1)</td></tr></tbody></table></figure>\n\n\n\n<h2 class=\"wp-block-heading\">Exemplo prático: Blueprint customizado</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Às vezes você precisa de mais do que &#8220;instalar e ativar&#8221;, digamos, um plugin do PR rodando junto com o WooCommerce e já logado como admin. Nesse caso, use um Blueprint. Ele é uma receita em JSON que descreve o estado inicial do site. Se quiser se aprofundar no formato, vale conferir o post sobre o WordPress Playground e os Blueprints.</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\">\n- uses: WordPress/action-wp-playground-pr-preview@v3\n  with:\n    blueprint: |\n      {\n        &quot;$schema&quot;: &quot;https://playground.wordpress.net/blueprint-schema.json&quot;,\n        &quot;preferredVersions&quot;: { &quot;php&quot;: &quot;8.3&quot;, &quot;wp&quot;: &quot;7.0&quot; },\n        &quot;steps&quot;: &#x5B;\n          { &quot;step&quot;: &quot;installPlugin&quot;,\n            &quot;pluginData&quot;: {\n              &quot;resource&quot;: &quot;git:directory&quot;,\n              &quot;url&quot;: &quot;https://github.com/${{ github.repository }}.git&quot;,\n              &quot;ref&quot;: &quot;${{ github.event.pull_request.head.ref }}&quot;,\n              &quot;path&quot;: &quot;/&quot;\n            },\n            &quot;options&quot;: { &quot;activate&quot;: true } },\n          { &quot;step&quot;: &quot;installPlugin&quot;,\n            &quot;pluginData&quot;: { &quot;resource&quot;: &quot;wordpress.org/plugins&quot;, &quot;slug&quot;: &quot;woocommerce&quot; },\n            &quot;options&quot;: { &quot;activate&quot;: true } },\n          { &quot;step&quot;: &quot;login&quot;, &quot;username&quot;: &quot;admin&quot; }\n        ]\n      }\n    github-token: ${{ secrets.GITHUB_TOKEN }}\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">Esse Blueprint fixa PHP 8.3 e WordPress 7.0, instala o código da branch do PR, adiciona o WooCommerce do repositório oficial e já entrega o ambiente logado. Para cenários com build, além disso, dá para referenciar os ZIPs gerados dentro do Blueprint usando o placeholder <code>{{ARTIFACT_URL:&lt;nome&gt;}}</code>. Dessa forma, a v3 resolve a URL pública do artefato para você.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Migrando da v2 para a v3</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Na prática, a migração varia conforme a complexidade do seu setup.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Plugins e temas simples (sem build):</strong> aqui praticamente nada muda. Troque a referência da action de <code>@v2</code> para <code>@v3</code> e mantenha os mesmos inputs.</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\">\n# funciona igual na v2 e na v3\n- uses: WordPress/action-wp-playground-pr-preview@v3\n  with:\n    plugin-path: .\n    github-token: ${{ secrets.GITHUB_TOKEN }}\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\"><strong>Projetos com build:</strong> aqui está o ganho real. Na v2, você precisava de um workflow de build, mais o parsing manual do nome do artefato, mais um helper <code>expose-artifact-on-public-url</code>, mais a geração manual do Blueprint e ainda a publicação manual do release. A v3, em contrapartida, substitui tudo isso pelos dois reusable workflows (<code>preview-build.yml</code> e <code>preview-publish.yml</code>) mostrados acima. O passo a passo, portanto, fica assim:</p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Crie o <code>pr-preview-build.yml</code> com o template do workflow de build.</li>\n\n\n\n<li>Crie o <code>pr-preview-publish.yml</code> com o template do workflow de publicação.</li>\n\n\n\n<li>Defina os artefatos no campo <code>artifacts</code> (formato <code>nome=caminho</code>).</li>\n\n\n\n<li>Indique <code>kind: plugin</code> ou <code>kind: theme</code> no publish — ou, então, use <code>blueprint</code> com placeholders <code>{{ARTIFACT_URL:&lt;nome&gt;}}</code> para setups com múltiplos ZIPs.</li>\n</ol>\n\n\n\n<p class=\"wp-block-paragraph\">Inputs como <code>artifact-name</code>, <code>artifact-filename</code>, <code>artifact-source-run-id</code>, <code>pr-number</code> e <code>commit-sha</code>, que existiam só para a cola manual, <strong>deixam de ser necessários</strong> na maioria dos casos.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Por fim, atenção à <strong>limpeza obrigatória de releases</strong>: a mudança que mais quebra na prática é que <strong>releases em <em>draft</em> não funcionam mais</strong>. Afinal, o Playground não consegue baixar assets de um release draft sem autenticação. Portanto, se você tiver releases <code>ci-artifacts</code> em draft, converta para <em>prerelease</em> ou apague.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Pegadinhas comuns</h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Erro 404 ao abrir o preview:</strong> provavelmente o release está como <em>draft</em> em vez de <em>prerelease</em>. Ajuste na aba Releases do repositório.</li>\n\n\n\n<li><strong>Plugin não aparece instalado:</strong> o ZIP precisa ser extraído para uma pasta com o nome do slug. Garanta isso no seu build. Por exemplo:<br><code>bash mkdir -p stage/my-plugin &amp;&amp; rsync -a ./ stage/my-plugin/ &amp;&amp; (cd stage &amp;&amp; zip -r ../my-plugin.zip my-plugin)</code></li>\n\n\n\n<li><strong>Build falhando ao comparar com a base:</strong> se você usa <code>git diff</code> contra a branch base, defina <code>fetch-depth: 0</code> no workflow de build. Afinal, o checkout padrão traz só o último commit.</li>\n\n\n\n<li><strong>Erro de permissão:</strong> falta o bloco <code>permissions</code> no nível do workflow ou do job.</li>\n</ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusão</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Se você já usava a v2 para builds, vale migrar: assim, você reduz a quantidade de linhas de código manual e ganha workflows testados e mantidos pela comunidade no lugar. Por outro lado, se ainda não usa PR preview no seu repositório de plugin ou tema, o cenário sem build resolve com poucas linhas de YAML — e melhora bastante a experiência de quem revisa código no seu projeto.</p>\n\n\n\n<p class=\"wp-block-paragraph\">A documentação completa está em <a href=\"https://wordpress.github.io/action-wp-playground-pr-preview/\">wordpress.github.io/action-wp-playground-pr-preview</a>. Para os casos mais específicos, consulte também o <a href=\"https://wordpress.github.io/action-wp-playground-pr-preview/migration/\">guia de migração</a> detalhado.</p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:36:\"http://wellformedweb.org/CommentAPI/\";a:1:{s:10:\"commentRss\";a:1:{i:0;a:5:{s:4:\"data\";s:117:\"https://br.wordpress.org/2026/06/02/pr-preview-com-wordpress-playground-o-que-muda-na-versao-3-da-github-action/feed/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:38:\"http://purl.org/rss/1.0/modules/slash/\";a:1:{s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:1:\"0\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"3568\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:4;a:6:{s:4:\"data\";s:70:\"\n		\n		\n					\n		\n		\n		\n				\n\n					\n										\n					\n					\n			\n		\n		\n			\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:6:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:68:\"Execute exemplos em PHP em qualquer lugar com o WordPress Playground\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:105:\"https://br.wordpress.org/2026/05/26/execute-exemplos-em-php-em-qualquer-lugar-com-o-wordpress-playground/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:113:\"https://br.wordpress.org/2026/05/26/execute-exemplos-em-php-em-qualquer-lugar-com-o-wordpress-playground/#respond\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 26 May 2026 16:58:02 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://br.wordpress.org/?p=3561\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:392:\"O WordPress Playground vai além dos sites WordPress completos. Um conjunto recente de mudanças transforma o Playground em um runtime PHP leve e útil para documentação, tutoriais, exemplos e demos compartilháveis. O principal destaque é o novo componente web &#60;php-snippet&#62;. Ele permite incorporar exemplos de PHP executáveis em qualquer página web com uma única tag [&#8230;]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Fellyph Cintra\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:18716:\"\n<p class=\"wp-block-paragraph\">O WordPress Playground vai além dos sites WordPress completos. Um conjunto recente de mudanças transforma o Playground em um runtime PHP leve e útil para documentação, tutoriais, exemplos e demos compartilháveis.</p>\n\n\n\n<p class=\"wp-block-paragraph\">O principal destaque é o novo componente web <code>&lt;php-snippet&gt;</code>. Ele permite incorporar exemplos de PHP executáveis em qualquer página web com uma única tag de script. Os leitores podem editar o código, clicar em Run, ver a saída no próprio local e experimentar sem instalar o PHP, configurar um servidor ou sair da página.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso abre uma nova forma de ensinar APIs do WordPress e do PHP: agora os exemplos podem ser legíveis e executáveis.</p>\n\n\n\n<h2 class=\"wp-block-heading\">O que mudou</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Em uma página HTML, como <code>index.html</code>, a nova incorporação de snippets é carregada a partir do Playground:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n&lt;!-- index.html --&gt;\n&lt;script\n    type=&quot;module&quot;\n    src=&quot;https://playground.wordpress.net/php-code-snippet.js&quot;\n&gt;&lt;/script&gt;\n\n&lt;php-snippet name=&quot;hello.php&quot;&gt;\n    &lt;script type=&quot;application/x-php&quot;&gt;\n&lt;?php\necho &quot;Hello from PHP &quot; . phpversion();\n    &lt;/script&gt;\n&lt;/php-snippet&gt;\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">Este exemplo deve ser servido como HTML, não como PHP no servidor. Se você colar a mesma marcação em um modelo <code>.php</code>, o interpretador PHP do servidor verá a tag de abertura <code>&lt;?php</code> bruta antes do navegador. Nesse caso, escape a tag de abertura como <code>&amp;lt;?php</code>, carregue o snippet a partir de um arquivo externo com <code>src</code> ou garanta de outra forma que o navegador receba o código PHP como texto literal.</p>\n\n\n\n<p class=\"wp-block-paragraph\">O componente renderiza um bloco de código editável, com realce de sintaxe e um botão Run.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando o leitor clica em Run pela primeira vez, o Playground carrega o runtime sob demanda em um iframe oculto, executa o PHP e exibe a saída abaixo do snippet.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Vários snippets na mesma página podem compartilhar o mesmo runtime. Isso significa que um tutorial pode incluir vários exemplos sem precisar baixar e inicializar um ambiente PHP separado para cada um.</p>\n\n\n\n<h2 class=\"wp-block-heading\">As APIs do WordPress também funcionam</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Por padrão, os snippets são executados em um ambiente WordPress real. Isso significa que os exemplos podem chamar APIs do WordPress, não apenas funções PHP comuns.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Por exemplo, uma página de documentação pode demonstrar a HTML API:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n&lt;php-snippet name=&quot;lazy-load-images.php&quot;&gt;\n    &lt;script type=&quot;application/x-php&quot;&gt;\n&lt;?php\nrequire &#039;/wordpress/wp-load.php&#039;;\n\n$html = &#039;&lt;article&gt;\n    &lt;img src=&quot;hero.jpg&quot; alt=&quot;Hero&quot;&gt;\n    &lt;img src=&quot;inline.jpg&quot; alt=&quot;Inline&quot;&gt;\n&lt;/article&gt;&#039;;\n\n$tags = new WP_HTML_Tag_Processor( $html );\nwhile ( $tags-&gt;next_tag( &#039;img&#039; ) ) {\n    $tags-&gt;set_attribute( &#039;loading&#039;, &#039;lazy&#039; );\n    $tags-&gt;add_class( &#039;responsive&#039; );\n}\n\necho $tags-&gt;get_updated_html();\n    &lt;/script&gt;\n&lt;/php-snippet&gt;\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">Isso altera o papel dos exemplos de código na documentação do WordPress. Em vez de pedir que os leitores copiem o código para um site local, o exemplo pode ser executado onde eles já estão lendo.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Modo somente PHP</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nem todo exemplo precisa do WordPress. Para recursos da linguagem PHP pura, os snippets podem dispensar completamente baixar o WordPress:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n&lt;php-snippet name=&quot;just-php.php&quot; wp=&quot;none&quot;&gt;\n    &lt;script type=&quot;application/x-php&quot;&gt;\n&lt;?php\necho &quot;PHP &quot; . phpversion() . &quot;\\n&quot;;\necho &quot;WordPress installed: &quot; .\n    ( file_exists( &#039;/wordpress/wp-includes/version.php&#039; ) ? &#039;yes&#039; : &#039;no&#039; );\n    &lt;/script&gt;\n&lt;/php-snippet&gt;\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">Por baixo dos panos, isso corresponde à nova opção de Blueprint:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n{\n    &quot;preferredVersions&quot;: {\n        &quot;php&quot;: &quot;latest&quot;,\n        &quot;wp&quot;: false\n    }\n}\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">Quando <code>preferredVersions.wp</code> é <code>false</code>, o Playground inicializa o PHP sem baixar ou instalar o WordPress. Campos e etapas de Blueprint específicos do WordPress são rejeitados, o que mantém os exemplos somente em PHP explícitos e previsíveis.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Da página de demonstração ao guia de documentação</h2>\n\n\n\n<p class=\"wp-block-paragraph\">O trabalho com snippets também vai além da página original de teste/demonstração. O guia de snippets PHP está se tornando a referência canônica para este recurso, com exemplos renderizados em tempo real ao lado de código que pode ser copiado.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso é importante porque o guia pode mostrar o recurso no mesmo formato em que os autores vão usá-lo: incorporações básicas, saída pré-computada, snippets baseados em seletores, snippets do WordPress, snippets em PHP puro e uso opção por opção. A página de demonstração antiga redireciona os leitores para o guia, e o link de atribuição do componente também aponta para ele.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Como usar</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Adicione o script do módulo uma vez na página e coloque cada exemplo em um elemento <code>&lt;php-snippet&gt;</code>. O padrão recomendado é colocar o PHP dentro de um elemento filho <code>&lt;script type=\"application/x-php\"&gt;</code> quando o documento ao redor for HTML, MDX ou outro formato que entregue o código PHP ao navegador sem alterações:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n&lt;php-snippet name=&quot;site-title.php&quot;&gt;\n    &lt;script type=&quot;application/x-php&quot;&gt;\n&lt;?php\nrequire &#039;/wordpress/wp-load.php&#039;;\n\nupdate_option( &#039;blogname&#039;, &#039;Snippet Docs&#039; );\necho get_bloginfo( &#039;name&#039; );\n    &lt;/script&gt;\n    &lt;script type=&quot;text/expected-output&quot;&gt;\nSnippet Docs\n    &lt;/script&gt;\n&lt;/php-snippet&gt;\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">O wrapper <code>application/x-php</code> é útil porque os navegadores ignoram tipos de script desconhecidos. Isso permite que autores incluam strings PHP contendo HTML sem escapar todos os caracteres <code>&lt;</code>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Para exemplos muito curtos, texto embutido também funciona, mas a tag de abertura PHP precisa ser escapada:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n&lt;php-snippet name=&quot;sum.php&quot; expected-output=&quot;42&quot;&gt;\n    &lt;?php echo 20 + 22;\n&lt;/php-snippet&gt;\n</pre></div>\n\n\n<h3 class=\"wp-block-heading\">Mostrar a saída antes do Run</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use a saída esperada quando quiser que o resultado apareça imediatamente. O espaço reservado é substituído pela saída real do runtime depois que o leitor clica em Run.</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n&lt;php-snippet name=&quot;precomputed.php&quot;&gt;\n    &lt;script type=&quot;application/x-php&quot;&gt;\n&lt;?php\necho &quot;2 + 2 = &quot; . ( 2 + 2 );\n    &lt;/script&gt;\n    &lt;script type=&quot;text/expected-output&quot;&gt;\n2 + 2 = 4\n    &lt;/script&gt;\n&lt;/php-snippet&gt;\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">Para saída em uma única linha, use o atributo <code>expected-output</code>:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n&lt;php-snippet name=&quot;ready.php&quot; expected-output=&quot;Ready&quot;&gt;\n    &lt;script type=&quot;application/x-php&quot;&gt;\n&lt;?php echo &quot;Ready&quot;;\n    &lt;/script&gt;\n&lt;/php-snippet&gt;\n</pre></div>\n\n\n<h3 class=\"wp-block-heading\">Preparar exemplos com um Blueprint</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use <code>blueprint</code> quando os snippets precisarem de preparação antes da execução do código PHP. O Blueprint pode criar arquivos, adicionar um mu-plugin, configurar opções, instalar plugins ou preparar conteúdo de exemplo.</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n&lt;script id=&quot;setup-blueprint&quot; type=&quot;application/json&quot;&gt;\n{\n    &quot;steps&quot;: &#x5B;\n        {\n            &quot;step&quot;: &quot;writeFile&quot;,\n            &quot;path&quot;: &quot;/wordpress/wp-content/mu-plugins/helpers.php&quot;,\n            &quot;data&quot;: &quot;&lt;?php\\nfunction docs_greet($name) { return &#039;Hello, &#039; . $name; }\\n&quot;\n        }\n    ]\n}\n&lt;/script&gt;\n\n&lt;php-snippet name=&quot;greeting.php&quot; blueprint=&quot;setup-blueprint&quot;&gt;\n    &lt;script type=&quot;application/x-php&quot;&gt;\n&lt;?php\nrequire &#039;/wordpress/wp-load.php&#039;;\necho docs_greet( &#039;Ada&#039; );\n    &lt;/script&gt;\n    &lt;script type=&quot;text/expected-output&quot;&gt;\nHello, Ada\n    &lt;/script&gt;\n&lt;/php-snippet&gt;\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">O atributo <code>blueprint</code> aceita um ID de elemento ou um seletor CSS. Use <code>&lt;script type=\"application/json\"&gt;</code> para o Blueprint porque o conteúdo dele é tratado como texto bruto, o que mantém previsíveis as strings PHP incorporadas.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Carregar PHP de outro arquivo</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use <code>src</code> quando o código-fonte PHP deve ficar em um arquivo separado:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n&lt;php-snippet\n    name=&quot;external-example.php&quot;\n    src=&quot;/snippets/external-example.php&quot;\n    expected-output=&quot;Loaded from an external file&quot;\n&gt;&lt;/php-snippet&gt;\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">O URL é resolvido a partir da página que contém o snippet. Se o arquivo PHP estiver hospedado em outra origem, esse servidor precisa permitir acesso entre origens. Use um Blueprint quando o exemplo precisar de arquivos de apoio, plugins, opções ou outra preparação.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Fixar versões ou auto-hospedar o runtime</h3>\n\n\n\n<p class=\"wp-block-paragraph\">A versão padrão do PHP é <code>8.4</code>, e a versão padrão do WordPress é <code>latest</code>. Use os atributos <code>php</code> e <code>wp</code> quando o exemplo depender de uma versão específica:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n&lt;php-snippet name=&quot;wp-version.php&quot; php=&quot;8.4&quot; wp=&quot;6.8&quot;&gt;\n    &lt;script type=&quot;application/x-php&quot;&gt;\n&lt;?php\nrequire &#039;/wordpress/wp-load.php&#039;;\necho get_bloginfo( &#039;version&#039; );\n    &lt;/script&gt;\n&lt;/php-snippet&gt;\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">A maioria das páginas deve usar o runtime hospedado em <code>https://playground.wordpress.net</code>. Para desenvolvimento local, auto-hospedagem ou infraestrutura com versões fixadas, use <code>playground-origin</code>:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n&lt;php-snippet\n    name=&quot;local-runtime.php&quot;\n    playground-origin=&quot;http://localhost:5400&quot;\n&gt;\n    &lt;script type=&quot;application/x-php&quot;&gt;\n&lt;?php\necho phpversion();\n    &lt;/script&gt;\n&lt;/php-snippet&gt;\n</pre></div>\n\n\n<h2 class=\"wp-block-heading\">Mais controle para autores</h2>\n\n\n\n<p class=\"wp-block-paragraph\">O componente de snippets inclui algumas ferramentas de autoria que o tornam prático para documentação real:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Os snippets são editáveis por padrão, o que permite que os leitores alterem o código antes de executá-lo.</li>\n\n\n\n<li>Use <code>Ctrl+Enter</code> ou <code>Cmd+Enter</code> para executar um snippet editável em foco pelo teclado.</li>\n\n\n\n<li>Use <code>readonly</code> em exemplos executáveis que devem permanecer bloqueados.</li>\n\n\n\n<li>Use <code>editable=\"false\"</code> como alias de compatibilidade para exemplos antigos que já usam esse padrão.</li>\n\n\n\n<li>Use <code>src</code> para carregar PHP a partir de um arquivo separado.</li>\n\n\n\n<li>Use <code>expected-output</code> ou um filho <code>&lt;script type=\"text/expected-output\"&gt;</code> para mostrar a saída esperada antes que o leitor clique em Run.</li>\n\n\n\n<li>Use <code>runnable=\"false\"</code> em exemplos com realce de sintaxe que não devem ser executados.</li>\n\n\n\n<li>Use os atributos <code>php</code> e <code>wp</code> para escolher as versões do PHP e do WordPress para um snippet.</li>\n\n\n\n<li>Use um Blueprint compartilhado quando vários snippets precisarem da mesma preparação, como um mu-plugin, uma opção do site ou um arquivo.</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">Esse último ponto é especialmente útil em tutoriais mais longos. Uma página pode definir um Blueprint JSON e apontar vários snippets para ele. O Playground inicializa o ambiente compartilhado apenas uma vez e, depois disso, cada snippet é executado no mesmo runtime já preparado.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Compartilhamento de runtime e solução de problemas</h2>\n\n\n\n<p class=\"wp-block-paragraph\">O primeiro clique em Run em uma página carrega o cliente do Playground, cria um iframe oculto, inicializa o PHP e instala o WordPress, a menos que o snippet use <code>wp=\"none\"</code>. Execuções posteriores reutilizam um runtime existente quando <code>playground-origin</code>, <code>php</code>, <code>wp</code> E o JSON do Blueprint resolvido é o mesmo.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Esse compartilhamento mantém os snippets relacionados rápidos, sem deixar de isolar exemplos que precisam de uma versão diferente do PHP, uma versão diferente do WordPress ou uma preparação de Blueprint diferente.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Se um snippet não for renderizado, verifique se o script do módulo foi carregado e se o navegador é compatível com elementos personalizados. Se Run nunca terminar, abra o DevTools e procure requisições com falha para <code>remote.html</code>, arquivos <code>.wasm</code> do PHP, arquivos ZIP do WordPress, recursos de Blueprint ou arquivos <code>src</code> de origem cruzada.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Sites com uma Content Security Policy rígida precisam permitir o script do módulo e o iframe oculto de <code>https://playground.wordpress.net</code>, além dos ativos de runtime que o Playground baixa. Para ambientes mais restritos, auto-hospede o script de snippets e aponte <code>playground-origin</code> para essa implantação.</p>\n\n\n\n<h2 class=\"wp-block-heading\">PHP Playground independente</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para exemplos de página inteira, o Playground também inclui um editor PHP independente:</p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://playground.wordpress.net/php-playground.html\">playground.wordpress.net/php-playground.html</a></p>\n\n\n\n<p class=\"wp-block-paragraph\">Ele oferece um editor e uma prévia lado a lado, com seletores de versões do PHP e do WordPress. O código atual e as escolhas de versão são codificados no fragmento do URL, então os exemplos podem ser compartilhados como links ou incorporados em um iframe.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Use o editor independente para uma única demonstração mais extensa. Use <code>&lt;php-snippet&gt;</code> quando um post, uma página de handbook ou um tutorial precisar de vários exemplos pequenos executáveis embutidos.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Por que isso importa</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Snippets executáveis tornam o Playground útil em uma nova camada da experiência de aprendizado do WordPress.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Para autores de documentação, isso reduz a distância entre a explicação e a verificação. Um leitor pode executar o exemplo imediatamente.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Para colaboradores, cria uma forma de baixo atrito para demonstrar APIs do WordPress, comportamento do PHP, etapas de preparação de Blueprint ou reproduções de bugs.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Para quem está aprendendo, remove a barreira de configuração. As pessoas podem testar código PHP e WordPress no navegador primeiro e, depois, migrar para um ambiente local quando estiverem prontas.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso também amplia o significado do Playground. Ele continua sendo um runtime completo do WordPress no navegador, mas agora também pode atuar como uma pequena camada de execução do PHP incorporável para a web.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Teste e compartilhe seu feedback</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Teste a incorporação de snippets em um arquivo HTML local, uma página de documentação ou um rascunho de tutorial:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n&lt;script\n    type=&quot;module&quot;\n    src=&quot;https://playground.wordpress.net/php-code-snippet.js&quot;\n&gt;&lt;/script&gt;\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">Para exemplos mais aprofundados, consulte o novo guia de snippets PHP na documentação do Playground:</p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://wordpress.github.io/wordpress-playground/developers/php-code-snippets/\">PHP code snippets and embeds</a></p>\n\n\n\n<p class=\"wp-block-paragraph\">Feedback é bem-vindo no canal <a href=\"https://wordpress.slack.com/messages/playground/\">#playground</a> no <a href=\"https://make.wordpress.org/chat/\">Slack Making WordPress</a> ou no <a href=\"https://github.com/WordPress/wordpress-playground\">repositório do WordPress Playground no GitHub</a>.</p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:36:\"http://wellformedweb.org/CommentAPI/\";a:1:{s:10:\"commentRss\";a:1:{i:0;a:5:{s:4:\"data\";s:110:\"https://br.wordpress.org/2026/05/26/execute-exemplos-em-php-em-qualquer-lugar-com-o-wordpress-playground/feed/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:38:\"http://purl.org/rss/1.0/modules/slash/\";a:1:{s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:1:\"0\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"3561\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:5;a:6:{s:4:\"data\";s:70:\"\n		\n		\n					\n		\n		\n		\n				\n\n					\n										\n					\n					\n			\n		\n		\n			\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:6:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:51:\"O que há de novo no AI 1.0.0 (19 de maio de 2026)?\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:84:\"https://br.wordpress.org/2026/05/21/o-que-ha-de-novo-no-ai-1-0-0-19-de-maio-de-2026/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:92:\"https://br.wordpress.org/2026/05/21/o-que-ha-de-novo-no-ai-1-0-0-19-de-maio-de-2026/#respond\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 21 May 2026 22:29:36 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://br.wordpress.org/?p=3555\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:373:\"O AI 1.0.0 foi lançado e está disponível para download! Os posts “O que há de novo no AI&#8230;” (marcados com a tag #ai-release) são publicados após cada lançamento do plugin AI, destacando os novos recursos incluídos em cada versão. Temos a satisfação de anunciar o lançamento do AI 1.0.0, a atualização mais recente do plugin canônico que [&#8230;]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Fellyph Cintra\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:17028:\"\n<p class=\"wp-block-paragraph\">O AI 1.0.0 foi lançado e está <a href=\"https://wordpress.org/plugins/ai/\" target=\"_blank\" rel=\"noopener\">disponível para download</a>! Os posts “O que há de novo no AI&#8230;” (marcados com a tag <a href=\"https://make.wordpress.org/ai/tag/ai-release/\" target=\"_blank\" rel=\"noopener\">#ai-release</a>) são publicados após cada lançamento do plugin AI, destacando os novos recursos incluídos em cada versão.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Temos a satisfação de anunciar o lançamento do <a href=\"https://github.com/WordPress/ai/releases/tag/1.0.0\" target=\"_blank\" rel=\"noopener\">AI 1.0.0</a>, a atualização mais recente do plugin canônico que impulsiona recursos de IA no WordPress. Este lançamento marca um marco importante para o plugin. Desde o primeiro lançamento do AI Experiments, no fim de 2025, colaboradores de todo o ecossistema WordPress ajudaram a testar, refinar e expandir um conjunto crescente de recursos de IA criados diretamente sob a iniciativa <a href=\"https://make.wordpress.org/ai/2025/07/17/ai-building-blocks/\" target=\"_blank\" rel=\"noopener\">AI Building Blocks</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Com a versão 1.0.0, o plugin continua evoluindo, de um ambiente experimental para uma implementação de referência mais madura, voltada a fluxos de trabalho baseados em IA no WordPress.</p>\n\n\n\n<p class=\"wp-block-paragraph\">O AI 1.0.0 apresenta novas ferramentas de observabilidade e governança, expande fluxos de moderação e mídia, melhora o onboarding e o tratamento de provedores, e inclui um amplo conjunto de melhorias de acessibilidade, internacionalização e experiência para desenvolvedores.</p>\n\n\n\n<h2 class=\"wp-block-heading\">O que há de novo no 1.0.0?</h2>\n\n\n\n<h3 class=\"wp-block-heading\">Novo experimento: registro de solicitações</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Esta versão apresenta um novo experimento de registro de solicitações que oferece observabilidade da atividade de IA em todo o WordPress. Depois de ativado, administradores podem revisar solicitações e respostas de IA geradas pelo core, por plugins e por temas para ajudar as equipes a entender melhor:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Quais operações de IA estão sendo acionadas</li>\n\n\n\n<li>Quais recursos e provedores estão sendo usados</li>\n\n\n\n<li>Como as solicitações estão se comportando</li>\n\n\n\n<li>Possíveis problemas de depuração ou de fluxo de trabalho</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">Isso cria uma base para maior transparência e visibilidade operacional à medida que o uso de IA no WordPress cresce.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Novo experimento: aprovações de conectores</h3>\n\n\n\n<p class=\"wp-block-paragraph\">O AI 1.0.0 também apresenta um novo experimento de aprovações de conectores, com foco em governança e controle administrativo.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Esse experimento permite que os administradores do site determinem quais plugins podem acessar os conectores de IA configurados. Conforme mais plugins começam a se integrar a serviços de IA, as aprovações de conectores oferecem uma camada adicional de supervisão sobre a forma como as credenciais de provedores e os recursos de IA são compartilhados em um site.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso dá continuidade ao foco mais amplo de oferecer aos usuários e proprietários de sites flexibilidade e controle sobre como as integrações de IA funcionam no WordPress.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Fluxos expandidos de moderação de comentários</h3>\n\n\n\n<p class=\"wp-block-paragraph\">O experimento de moderação de comentários apresentado em versões anteriores continua evoluindo no AI 1.0.0. Esta versão adiciona:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ordenação e filtragem na tela Comentários por sentimento e toxicidade</li>\n\n\n\n<li>Rótulos de sentimento e toxicidade diretamente no widget Atividade do painel</li>\n\n\n\n<li>Tratamento aprimorado para comentários sem metadados de moderação</li>\n\n\n\n<li>Indicadores melhores de falha na análise quando solicitações de moderação falham</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">Essas atualizações ajudam os moderadores a identificar discussões problemáticas com mais rapidez e a compreender melhor o tom geral das conversas que ocorrem em seus sites.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Texto alternativo com IA no editor de mídia</h3>\n\n\n\n<p class=\"wp-block-paragraph\">A geração de texto alternativo por IA agora está integrada diretamente ao fluxo experimental do editor de mídia do Gutenberg.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso se baseia nas ferramentas de acessibilidade de mídia já existentes no plugin, tornando as sugestões de texto alternativo geradas por IA mais diretamente disponíveis durante a edição de itens de mídia. A versão também inclui várias melhorias no tratamento de texto alternativo e geração de mídia, incluindo:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Melhor tratamento de erros quando nenhum provedor de IA está configurado</li>\n\n\n\n<li>Avisos e orientações de onboarding aprimorados</li>\n\n\n\n<li>Correções para fluxos de imagens decorativas</li>\n\n\n\n<li>Tratamento adicional para geração independente de imagens</li>\n</ul>\n\n\n\n<h3 class=\"wp-block-heading\">Aprimoramentos no fluxo editorial</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Esta versão continua a refinar os fluxos editoriais assistidos por IA apresentados nas versões anteriores. Para refletir melhor a terminologia usada em publicações reais:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>“Notas de revisão” foi renomeado para “Notas editoriais”</li>\n\n\n\n<li>“Refinar a partir de notas” foi renomeado para “Atualizações editoriais”</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">Outras melhorias incluem:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Desativação do resumo de conteúdo até que o conteúdo alcance um tamanho mínimo</li>\n\n\n\n<li>Atualizações reativas para geração de título e classificação de conteúdo com base no estado atual do editor</li>\n\n\n\n<li>Estados de carregamento refinados e polimento de interface em vários fluxos de IA</li>\n</ul>\n\n\n\n<h3 class=\"wp-block-heading\">Melhorias no tratamento de provedores e no onboarding</h3>\n\n\n\n<p class=\"wp-block-paragraph\">O AI 1.0.0 inclui melhorias significativas na detecção de provedores, no onboarding e nas mensagens de erro. Quando os usuários tentam acionar uma funcionalidade de IA sem um provedor configurado, o plugin agora exibe orientações mais acionáveis, direcionando-os à configuração de um conector de IA. Outras melhorias incluem:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Melhor tratamento quando provedores configurados anteriormente não estão mais disponíveis</li>\n\n\n\n<li>Mensagens de erro mais específicas relacionadas a provedores</li>\n\n\n\n<li>Solicitações de API de provedores duplicadas no modo de desenvolvedor</li>\n\n\n\n<li>Tratamento aprimorado de estados de configuração de provedores específicos por recurso</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">Essas atualizações ajudam a criar uma experiência de onboarding e solução de problemas mais tranquila para usuários finais e desenvolvedores.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Melhorias de acessibilidade e internacionalização</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Acessibilidade e internacionalização continuam sendo prioridades centrais em todo o plugin. O AI 1.0.0 inclui:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Visibilidade aprimorada do foco pelo teclado em várias interfaces</li>\n\n\n\n<li>Correções de renderização RTL (da direita para a esquerda) em toda a interface de administração</li>\n\n\n\n<li>Carregamento ampliado de traduções em tempo de execução</li>\n\n\n\n<li>Texto adicional voltado a usuários totalmente traduzível</li>\n</ul>\n\n\n\n<h2 class=\"wp-block-heading\">O que vem no 1.1.0?</h2>\n\n\n\n<p class=\"wp-block-paragraph\">O trabalho já está em andamento em recursos, experimentos e melhorias de infraestrutura adicionais planejados para o <a href=\"https://github.com/WordPress/ai/milestone/18\" target=\"_blank\" rel=\"noopener\">1.1.0</a> e versões futuras, incluindo:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Experimento atualizado: <a href=\"https://github.com/WordPress/ai/issues/324\" target=\"_blank\" rel=\"noopener\">integrar o Refine from Notes à colaboração em tempo real</a></li>\n\n\n\n<li>Novo experimento: <a href=\"https://github.com/WordPress/ai/pull/151\" target=\"_blank\" rel=\"noopener\">sugestões Type Ahead</a></li>\n\n\n\n<li>Novo experimento: <a href=\"https://github.com/WordPress/ai/issues/325\" target=\"_blank\" rel=\"noopener\">integração com o editor de mídia experimental do Gutenberg</a>, incluindo <a href=\"https://github.com/WordPress/ai/issues/238\" target=\"_blank\" rel=\"noopener\">sugestões de corte com reconhecimento de foco</a></li>\n\n\n\n<li>Novo experimento: <a href=\"https://github.com/WordPress/ai/issues/502\" target=\"_blank\" rel=\"noopener\">conectores promovidos de provedores de IA</a></li>\n\n\n\n<li>Novo experimento: <a href=\"https://github.com/WordPress/ai/issues/32\" target=\"_blank\" rel=\"noopener\">AI Playground</a></li>\n\n\n\n<li>Novo experimento: rastreamento de proveniência de conteúdo para <a href=\"https://github.com/WordPress/ai/pull/294\" target=\"_blank\" rel=\"noopener\">texto</a> e <a href=\"https://github.com/WordPress/ai/pull/302\" target=\"_blank\" rel=\"noopener\">imagens</a> via <a href=\"https://c2pa.org/\" target=\"_blank\" rel=\"noopener\">C2PA</a>, junto com a <a href=\"https://github.com/WordPress/ai/issues/421\" target=\"_blank\" rel=\"noopener\">detecção de manifestos C2PA no envio</a></li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">Esses conceitos ainda são exploratórios, mas ajudam a testar como a IA pode apoiar fluxos de trabalho reais no WordPress.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Agradecemos às pessoas que contribuíram!</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Um grande agradecimento a todas as pessoas que contribuíram para este lançamento, incluindo:</p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\'https://profiles.wordpress.org/dkotter/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>dkotter</a>, <a href=\'https://profiles.wordpress.org/jeffpaul/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>jeffpaul</a>, <a href=\'https://profiles.wordpress.org/isotropic/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>isotropic</a>, <a href=\'https://profiles.wordpress.org/tyb/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>tyb</a>, <a href=\'https://profiles.wordpress.org/justlevine/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>justlevine</a>, <a href=\'https://profiles.wordpress.org/gohelkunjan/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>gohelkunjan</a>, <a href=\'https://profiles.wordpress.org/gajendrasingh/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>gajendrasingh</a>, <a href=\'https://profiles.wordpress.org/swissspidy/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>swissspidy</a>, <a href=\'https://profiles.wordpress.org/haktansuren/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>haktansuren</a>, <a href=\'https://profiles.wordpress.org/hilayt24/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>hilayt24</a>, <a href=\'https://profiles.wordpress.org/darshitrajyaguru97/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>darshitrajyaguru97</a>, <a href=\'https://profiles.wordpress.org/nikskyverge/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>nikskyverge</a>, <a href=\'https://profiles.wordpress.org/ianatkins/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>ianatkins</a>, <a href=\'https://profiles.wordpress.org/intenzi/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>intenzi</a>, <a href=\'https://profiles.wordpress.org/gautam23/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>gautam23</a>, <a href=\'https://profiles.wordpress.org/vishnuprajapat/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>vishnuprajapat</a>, <a href=\'https://profiles.wordpress.org/phoolchandcms/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>phoolchandcms</a>, <a href=\'https://profiles.wordpress.org/n1schay/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>n1schay</a>, <a href=\'https://profiles.wordpress.org/takshil/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>takshil</a>, <a href=\'https://profiles.wordpress.org/deepam02/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>deepam02</a>, <a href=\'https://profiles.wordpress.org/wildworks/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>wildworks</a>, <a href=\'https://profiles.wordpress.org/laurisaarni/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>laurisaarni</a>, <a href=\'https://profiles.wordpress.org/ekamran/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>ekamran</a>, <a href=\'https://profiles.wordpress.org/karmatosed/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>karmatosed</a>, <a href=\'https://profiles.wordpress.org/shaunandrews/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>shaunandrews</a>, <a href=\'https://profiles.wordpress.org/hbhalodia/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>hbhalodia</a>, <a href=\'https://profiles.wordpress.org/gziolo/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>gziolo</a>, <a href=\'https://profiles.wordpress.org/jonsurrell/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>jonsurrell</a>, <a href=\'https://profiles.wordpress.org/westonruter/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>westonruter</a>, <a href=\'https://profiles.wordpress.org/jorgefilipecosta/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>jorgefilipecosta</a>, <a href=\'https://profiles.wordpress.org/ocean90/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>ocean90</a>, <a href=\'https://profiles.wordpress.org/sakshamsharma5/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>sakshamsharma5</a>, <a href=\'https://profiles.wordpress.org/malaytiwari/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>malaytiwari</a>, <a href=\'https://profiles.wordpress.org/dilip2615/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>dilip2615</a>, <a href=\'https://profiles.wordpress.org/dhrumilk/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>dhrumilk</a>, <a href=\'https://profiles.wordpress.org/htperkins/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>htperkins</a>, <a href=\'https://profiles.wordpress.org/aduth/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>aduth</a> e outras pessoas envolvidas em revisão, testes e nos <a href=\"https://github.com/WordPress/ai/compare/0.9.0...1.0.0\" target=\"_blank\" rel=\"noopener\">44 commits em 193 arquivos entre o 0.9.0 e o 1.0.0</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">A ajuda e o feedback de vocês são o que torna esses recursos e experimentos possíveis.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><span style=\"margin: 0px;padding: 0px\">Um agradecimento às pessoas que estão ajudando com traduções nas seguintes localidades: <a href=\"https://translate.wordpress.org/projects/wp-plugins/ai/\" target=\"_blank\">holandês, feroês, japonês, português (Brasil), russo e espanhol</a>, garantindo que os pacotes de idioma estejam disponíveis para os usuários.</span> <a href=\"https://translate.wordpress.org/projects/wp-plugins/ai/\" target=\"_blank\" rel=\"noopener\">Traduzir o plugin AI</a> é uma ótima contribuição, e outras pessoas contribuindo dessa forma são muito bem-vindas e valorizadas!</p>\n\n\n\n<h2 class=\"wp-block-heading\">Participe</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como sempre, recebemos feedback, testes e contribuições da comunidade. Seja seu interesse em UX do editor, APIs, acessibilidade, desempenho ou ética e políticas de IA, há muitas formas de participar.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Você pode <a href=\"https://wordpress.org/plugins/ai/?preview=1\" target=\"_blank\" rel=\"noopener\">explorar a versão 1.0.0 hoje</a>, revisar <a href=\"https://github.com/WordPress/ai/issues\" target=\"_blank\" rel=\"noopener\">issues abertas</a> e <a href=\"https://github.com/WordPress/ai/pulls\" target=\"_blank\" rel=\"noopener\">pull requests</a>, e <a href=\"https://github.com/WordPress/ai/discussions\" target=\"_blank\" rel=\"noopener\">ajudar a definir o que vem a seguir</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Props para <a href=\'https://profiles.wordpress.org/justlevine/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>justlevine</a>, <a href=\'https://profiles.wordpress.org/ekamran/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>ekamran</a>, <a href=\'https://profiles.wordpress.org/azharderaiya/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>azharderaiya</a> e <a href=\'https://profiles.wordpress.org/westonruter/\' class=\'mention\'><span class=\'mentions-prefix\'>@</span>westonruter</a> pela revisão deste post.</p>\n\n\n\n<p class=\"wp-block-paragraph\">#ai-experiments, #ai-features, #ai-plugin, #ai-release, #canonical-plugins, #core-ai</p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:36:\"http://wellformedweb.org/CommentAPI/\";a:1:{s:10:\"commentRss\";a:1:{i:0;a:5:{s:4:\"data\";s:89:\"https://br.wordpress.org/2026/05/21/o-que-ha-de-novo-no-ai-1-0-0-19-de-maio-de-2026/feed/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:38:\"http://purl.org/rss/1.0/modules/slash/\";a:1:{s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:1:\"0\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"3555\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:6;a:6:{s:4:\"data\";s:60:\"\n		\n		\n		\n		\n		\n				\n		\n		\n\n					\n										\n					\n		\n		\n			\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"WordPress 7.0 “Armstrong”\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:60:\"https://br.wordpress.org/2026/05/20/wordpress-7-0-armstrong/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 20 May 2026 19:17:11 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:12:\"Lançamentos\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:3:\"7.0\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://br.wordpress.org/?p=3528\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:385:\"Todo lançamento do WordPress celebra um artista que deixou uma marca no mundo da música. Diga olá ao WordPress 7.0 “Armstrong”, nomeado em homenagem ao próprio “Satchmo”, o músico de jazz Louis Armstrong. Conhecido como o “primeiro grande solista de jazz”, Louis Armstrong criou conjuntos que destacaram suas próprias habilidades profundas de trompete e, no [&#8230;]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"Andre\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:76003:\"\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https://br.wordpress.org/files/2026/05/Release-Edition-Main-Image-7.0-scaled-1-1024x683.png\" alt=\"\" class=\"wp-image-3530\" srcset=\"https://br.wordpress.org/files/2026/05/Release-Edition-Main-Image-7.0-scaled-1-1024x683.png 1024w, https://br.wordpress.org/files/2026/05/Release-Edition-Main-Image-7.0-scaled-1-300x200.png 300w, https://br.wordpress.org/files/2026/05/Release-Edition-Main-Image-7.0-scaled-1-768x512.png 768w, https://br.wordpress.org/files/2026/05/Release-Edition-Main-Image-7.0-scaled-1-1536x1024.png 1536w, https://br.wordpress.org/files/2026/05/Release-Edition-Main-Image-7.0-scaled-1-2048x1366.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Todo lançamento do WordPress celebra um artista que deixou uma marca no mundo da música. Diga olá ao WordPress 7.0 “Armstrong”, nomeado em homenagem ao próprio “Satchmo”, o músico de jazz Louis Armstrong.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Conhecido como o “primeiro grande solista de jazz”, Louis Armstrong criou conjuntos que destacaram suas próprias habilidades profundas de trompete e, no processo, transformou o jazz de uma forma de arte orquestral em uma forma de arte solo. O mestre trompetista também impressionou o mundo com seus vocais de assinatura, introduzindo a improvisação no Jazz, influenciando cada artista com quem trabalhou e mudando permanentemente a paisagem da música.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Louis Armstrong teceu seu toque pessoal no mundo do Jazz. Com o WordPress 7.0 “Armstrong”, você pode construir com o seu.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Boas vindas ao WordPress 7.0!</h2>\n\n\n\n<p class=\"wp-block-paragraph\">O WordPress 7.0 marca o início de uma nova era, estabelecendo as bases para a IA em toda a experiência do WordPress. Cumprimentando você com um painel moderno e mais intuitivo, o WordPress 7.0 apresenta ferramentas aprimoradas de personalização e desenvolvimento que inspiram criatividade e aproveitam o potencial infinito.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Se você é um criador, empresário ou desenvolvedor, o WordPress 7.0 permite que você crie de uma forma que é exclusivamente sua.</p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https://wordpress.org/wordpress-7.0.zip\">Baixe o WordPress 7.0</a></div>\n</div>\n\n\n\n<h2 class=\"wp-block-heading\">O que há de novo</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Explore as habilidades de IA diretamente em seu site, todas gerenciadas a partir de um painel central. Deslize perfeitamente através do novo e elegante tema de administração implementado em todo o painel. Inicie o fluxo criativo com novos blocos e ferramentas de design e aproveite uma caixa de ferramentas de desenvolvedor expansiva que lhe dá mais controle do que nunca, permitindo que você crie seu caminho.</p>\n\n\n\n<h3 class=\"wp-block-heading\">WordPress integrado com IA</h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Possibilidades bem nas suas mãos.</strong></p>\n\n\n\n<p class=\"wp-block-paragraph\">Com a IA integrada em todo o WordPress, o potencial é infinito. Um novo cliente de IA no Core permite que o WordPress se comunique com modelos de IA gerativos, enquanto as conexões são facilmente gerenciadas a partir de um único painel no painel. O Cliente de IA combinado com a API de habilidades formam uma dupla que introduz novas funcionalidades, automação de fluxo de trabalho e ferramentas de criação para o seu site. Instale o novo plugin de IA para expandir ainda mais suas opções: gerar e editar imagens, criar títulos ou trechos ou até mesmo sugerir texto alternativo.</p>\n\n\n\n<p class=\"wp-block-paragraph\">O WordPress 7.0 também inclui um novo pacote Client-Side Abilities: um pacote Javascript para a API de habilidades, com uma paleta de interface e comandos integrada que oferece amplas habilidades de IA novas e híbridas.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://br.wordpress.org/files/2026/05/image-13.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"632\" src=\"https://br.wordpress.org/files/2026/05/image-13-1024x632.png\" alt=\"\" class=\"wp-image-3532\" srcset=\"https://br.wordpress.org/files/2026/05/image-13-1024x632.png 1024w, https://br.wordpress.org/files/2026/05/image-13-300x185.png 300w, https://br.wordpress.org/files/2026/05/image-13-768x474.png 768w, https://br.wordpress.org/files/2026/05/image-13.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></a></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Gerencie todas as suas conexões externas em um painel central na tela do conector. Mergulhe facilmente com 3 predefinições ou adicione suas próprias conexões. Autentique e comece com as novas habilidades de IA em apenas alguns cliques.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://br.wordpress.org/files/2026/05/image-12.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"632\" src=\"https://br.wordpress.org/files/2026/05/image-12-1024x632.png\" alt=\"\" class=\"wp-image-3534\" srcset=\"https://br.wordpress.org/files/2026/05/image-12-1024x632.png 1024w, https://br.wordpress.org/files/2026/05/image-12-300x185.png 300w, https://br.wordpress.org/files/2026/05/image-12-768x474.png 768w, https://br.wordpress.org/files/2026/05/image-12.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></a></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Um WordPress integrado à IA promete um potencial infinito, pronto para ser descoberto.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Painel Modernizado</h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Eleve sua experiência de administrador</strong>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">O WordPress 7.0 apresenta um painel totalmente revitalizado com um novo esquema de cores moderno e acabamentos limpos por toda parte.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Polido com transições suaves que mudam perfeitamente à medida que você se move entre as telas, você sentirá que está deslizando sem esforço pelo painel.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Apenas um clique do novo atalho da paleta de comandos, <code>⌘K</code> ou <code>Ctrl+K</code>, ou um clique no ícone na barra de administração superior, permite que você acesse suas ferramentas favoritas de qualquer lugar no painel.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://br.wordpress.org/files/2026/05/image-11.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"632\" src=\"https://br.wordpress.org/files/2026/05/image-11-1024x632.png\" alt=\"\" class=\"wp-image-3536\" srcset=\"https://br.wordpress.org/files/2026/05/image-11-1024x632.png 1024w, https://br.wordpress.org/files/2026/05/image-11-300x185.png 300w, https://br.wordpress.org/files/2026/05/image-11-768x474.png 768w, https://br.wordpress.org/files/2026/05/image-11.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></a></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Explore a tipografia de um lugar, independentemente do tema. Instale, adicione e gerencie sua coleção de fontes a partir da nova página dedicada de gerenciamento de fontes, com suporte para temas em bloco, híbridos e clássicos.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://br.wordpress.org/files/2026/05/image-10.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"632\" src=\"https://br.wordpress.org/files/2026/05/image-10-1024x632.png\" alt=\"\" class=\"wp-image-3538\" srcset=\"https://br.wordpress.org/files/2026/05/image-10-1024x632.png 1024w, https://br.wordpress.org/files/2026/05/image-10-300x185.png 300w, https://br.wordpress.org/files/2026/05/image-10-768x474.png 768w, https://br.wordpress.org/files/2026/05/image-10.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></a></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Navegue visualmente através de versões de revisão para ver o que mudou de relance, com marcadores que tornam as escolhas editoriais mais intuitivas. Escolha facilmente a revisão desejada e restaure instantaneamente.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://br.wordpress.org/files/2026/05/image-9.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"632\" src=\"https://br.wordpress.org/files/2026/05/image-9-1024x632.png\" alt=\"\" class=\"wp-image-3540\" srcset=\"https://br.wordpress.org/files/2026/05/image-9-1024x632.png 1024w, https://br.wordpress.org/files/2026/05/image-9-300x185.png 300w, https://br.wordpress.org/files/2026/05/image-9-768x474.png 768w, https://br.wordpress.org/files/2026/05/image-9.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></a></figure>\n\n\n\n<h2 class=\"wp-block-heading\">Projetar, criar, personalizar</h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Uma maneira mais simples de construir</strong>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Deixe o WordPress ser sua tela com novos blocos, suportes para blocos e ferramentas de design que adicionam agilidade visual, controle granular e mantêm cada elemento do seu site na marca, com novos toques.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Mostre suas ideias em uma apresentação de slides de caixa de luz com o novo bloco de galeria e refine sua marcação com o novo bloco de cabeçalho. Forneça uma navegação clara no site com o novo bloco Breadcrumbs e adicione mais detalhes aos seus projetos com o novo bloco ícones.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://br.wordpress.org/files/2026/05/image-8.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"632\" src=\"https://br.wordpress.org/files/2026/05/image-8-1024x632.png\" alt=\"\" class=\"wp-image-3542\" srcset=\"https://br.wordpress.org/files/2026/05/image-8-1024x632.png 1024w, https://br.wordpress.org/files/2026/05/image-8-300x185.png 300w, https://br.wordpress.org/files/2026/05/image-8-768x474.png 768w, https://br.wordpress.org/files/2026/05/image-8.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></a></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Controles de capacidade de resposta aprimorados na versão 7.0 tornam seu site mais amigável. Oculte e revele blocos com base no dispositivo, sem afetar outras visualizações. Ajuste de estilos para diferentes pontos de interrupção e personalize quais são esses pontos de interrupção.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://br.wordpress.org/files/2026/05/image-7.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"632\" src=\"https://br.wordpress.org/files/2026/05/image-7-1024x632.png\" alt=\"\" class=\"wp-image-3544\" srcset=\"https://br.wordpress.org/files/2026/05/image-7-1024x632.png 1024w, https://br.wordpress.org/files/2026/05/image-7-300x185.png 300w, https://br.wordpress.org/files/2026/05/image-7-768x474.png 768w, https://br.wordpress.org/files/2026/05/image-7.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></a></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Projete e crie sua sobreposição de menu com blocos e padrões, totalmente personalizável com os estilos que você deseja que os visitantes vejam. Adicione colunas, estilize a tipografia ou incorpore seu próprio botão de fechamento na sobreposição. Comece com um modelo ou crie seu próprio menu a partir do zero.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://br.wordpress.org/files/2026/05/image-6.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"632\" src=\"https://br.wordpress.org/files/2026/05/image-6-1024x632.png\" alt=\"\" class=\"wp-image-3545\" srcset=\"https://br.wordpress.org/files/2026/05/image-6-1024x632.png 1024w, https://br.wordpress.org/files/2026/05/image-6-300x185.png 300w, https://br.wordpress.org/files/2026/05/image-6-768x474.png 768w, https://br.wordpress.org/files/2026/05/image-6.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></a></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Design de página com sintonia fina e layout com padrões que atuam como uma única unidade, destacáveis para controle mais isolado. Insira seu padrão, troque elementos e personalize com facilidade.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://br.wordpress.org/files/2026/05/image-5.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"632\" src=\"https://br.wordpress.org/files/2026/05/image-5-1024x632.png\" alt=\"\" class=\"wp-image-3548\" srcset=\"https://br.wordpress.org/files/2026/05/image-5-1024x632.png 1024w, https://br.wordpress.org/files/2026/05/image-5-300x185.png 300w, https://br.wordpress.org/files/2026/05/image-5-768x474.png 768w, https://br.wordpress.org/files/2026/05/image-5.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></a></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Estilize cada detalhe de conteúdo com CSS personalizado no nível do bloco, diretamente em sua postagem ou página.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://br.wordpress.org/files/2026/05/image-4.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"632\" src=\"https://br.wordpress.org/files/2026/05/image-4-1024x632.png\" alt=\"\" class=\"wp-image-3550\" srcset=\"https://br.wordpress.org/files/2026/05/image-4-1024x632.png 1024w, https://br.wordpress.org/files/2026/05/image-4-300x185.png 300w, https://br.wordpress.org/files/2026/05/image-4-768x474.png 768w, https://br.wordpress.org/files/2026/05/image-4.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></a></figure>\n\n\n\n<h2 class=\"wp-block-heading\">Caixa de ferramentas do desenvolvedor</h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ferramentas avançadas para construir</strong> <strong>o seu caminho</strong>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">O WordPress 7.0 permite que você crie mais rápido, melhor, mais forte e mais fácil com um extenso conjunto de APIs expandidas e funcionalidade aprimorada.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Crie blocos e padrões no nível do servidor usando apenas PHP, registrado automaticamente com a API de blocos.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Explore um editor de sites mais extensível, com roteamento, validação de rota e um novo pacote wordpress/boot que permite que plugins criem páginas de editor de site personalizadas.</p>\n\n\n\n<h2 class=\"wp-block-heading\">E muito mais</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para obter uma visão geral abrangente de todos os novos recursos e aprimoramentos no WordPress 7.0, visite o site da mostra de recursos.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://wordpress.org/download/releases/7-0\">Confira o que há de novo no 7.0</a></p>\n\n\n\n<h2 class=\"wp-block-heading\">Saiba mais sobre o WordPress 7.0</h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://learn.wordpress.org/\">O Learn WordPress</a> é um recurso gratuito para usuários novos e experientes do WordPress. O Learn é abastecido com vídeos de instruções sobre o uso de vários recursos no WordPress, <a href=\"https://learn.wordpress.org/social-learning/\">workshops interativos</a> para explorar tópicos aprofundados e planos de aula para mergulhar profundamente em áreas específicas do WordPress.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Leia as <a href=\"https://wordpress.org/documentation/wordpress-version/version-7.0\">Notas de versão do WordPress 7.0</a> para obter informações sobre instalação, aprimoramentos, problemas corrigidos, contribuidores de versão, recursos de aprendizado e a lista de alterações de arquivos.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Explore o <a href=\"https://make.wordpress.org/core/2026/05/14/wordpress-7-0-field-guide/\">Guia de Campo do WordPress 7.0</a> e saiba mais sobre as alterações nesta versão com notas detalhadas do desenvolvedor para ajudá-lo a criar com o WordPress.</p>\n\n\n\n<h2 class=\"wp-block-heading\">O esquadrão de lançamento</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cada lançamento vem para você de uma equipe dedicada de colaboradores entusiastas que ajudam a manter as coisas no caminho certo e se movendo sem problemas. A equipe que liderou o 7.0 é um grupo global e multifuncional de colaboradores que estão sempre prontos para defender ideias, remover bloqueadores e resolver problemas.</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Líder de lançamento: <a href=\"https://profiles.wordpress.org/matveb/\">Matias Ventura</a></li>\n\n\n\n<li>Coordenação de lançamento: <a href=\"https://profiles.wordpress.org/chaion07/\">Ahmed Kabir Chaion</a>, <a href=\"https://profiles.wordpress.org/amykamala/\">Amy Kamala</a>, <a href=\"https://profiles.wordpress.org/4thhubbard/\">Mary Hubbard</a></li>\n\n\n\n<li>Líderes técnicos: <a href=\"https://profiles.wordpress.org/ellatrix/\">Ella van Durpe</a>, <a href=\"https://profiles.wordpress.org/mukesh27/\">Mukesh Panchal</a>, <a href=\"https://profiles.wordpress.org/sergeybiryukov/\">Sergey Biryukov</a></li>\n\n\n\n<li>Líderes de triagem: <a href=\"https://profiles.wordpress.org/audrasjb/\">Jb Audras</a>, <a href=\"https://profiles.wordpress.org/juanmaguitar/\">JuanMa Garrido</a></li>\n\n\n\n<li>Líderes de teste: <a href=\"https://profiles.wordpress.org/ankit-k-gupta/\">Ankit K Gupta</a>, <a href=\"https://profiles.wordpress.org/marybaum/\">Mary Baum</a></li>\n</ul>\n\n\n\n<h2 class=\"wp-block-heading\">Agradecimento aos colaboradores</h2>\n\n\n\n<p class=\"wp-block-paragraph\">A missão do WordPress é <a href=\"https://wordpress.org/about/\">democratizar a publicação</a> e incorporar as <a href=\"https://opensource.org/osd-annotated\">liberdades que vêm com o código aberto</a>. Uma comunidade global e diversificada de pessoas colaborando para fortalecer o software apoia esse esforço.</p>\n\n\n\n<p class=\"wp-block-paragraph\">O WordPress 7.0 reflete os esforços incansáveis e a paixão de mais de 900 colaboradores em países de todo o mundo. Este lançamento também recebeu mais de 279 colaboradores pela primeira vez!</p>\n\n\n\n<p class=\"wp-block-paragraph\">Sua colaboração proporcionou mais de 420 aprimoramentos e correções, garantindo uma versão estável para todos. Um testemunho do poder e da capacidade da comunidade de código aberto do WordPress.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://profiles.wordpress.org/1000camels/\">1000camels</a> · <a href=\"https://profiles.wordpress.org/aakashverma1/\">Aakash Verma</a> · <a href=\"https://profiles.wordpress.org/jorbin/\">Aaron Jorbin</a> · <a href=\"https://profiles.wordpress.org/aaronrobertshaw/\">Aaron Robertshaw</a> · <a href=\"https://profiles.wordpress.org/abdullah17/\">Abdullah Kaludi</a> · <a href=\"https://profiles.wordpress.org/abduremon/\">Abdur Rahman Emon</a> · <a href=\"https://profiles.wordpress.org/acmoifr/\">acmoifr</a> · <a href=\"https://profiles.wordpress.org/dannythedog/\">Adam</a> · <a href=\"https://profiles.wordpress.org/adamsilverstein/\">Adam Silverstein</a> · <a href=\"https://profiles.wordpress.org/zieladam/\">Adam Zieliński</a> · <a href=\"https://profiles.wordpress.org/oztaser/\">Adil Öztaşer</a> · <a href=\"https://profiles.wordpress.org/adithyanaik/\">adithyanaik</a> · <a href=\"https://profiles.wordpress.org/iamadisingh/\">Aditya Singh</a> · <a href=\"https://profiles.wordpress.org/adnanhyder/\">Adnan Hyder Pervez</a> · <a href=\"https://profiles.wordpress.org/adnanlimdi/\">adnan.limdi</a> · <a href=\"https://profiles.wordpress.org/adrmf25/\">adrmf25</a> · <a href=\"https://profiles.wordpress.org/afwebdev/\">afwebdev</a> · <a href=\"https://profiles.wordpress.org/agnieszkaszuba/\">Agnieszka Szuba</a> · <a href=\"https://profiles.wordpress.org/elazzabi/\">Ahmed</a> · <a href=\"https://profiles.wordpress.org/chaion07/\">Ahmed Kabir Chaion</a> · <a href=\"https://profiles.wordpress.org/ajitbohra/\">Ajit Bohra</a> · <a href=\"https://profiles.wordpress.org/wildworks/\">Aki Hamano</a> · <a href=\"https://profiles.wordpress.org/akshat2802/\">Akshat Kakkad</a> · <a href=\"https://profiles.wordpress.org/aljullu/\">Albert Juhﾃｩ Lluveras</a> · <a href=\"https://profiles.wordpress.org/alecrust/\">Alec Rust</a> · <a href=\"https://profiles.wordpress.org/alecgeatches/\">alecgeatches</a> · <a href=\"https://profiles.wordpress.org/xknown/\">Alex Concha</a> · <a href=\"https://profiles.wordpress.org/akirk/\">Alex Kirk</a> · <a href=\"https://profiles.wordpress.org/ajlende/\">Alex Lende</a> · <a href=\"https://profiles.wordpress.org/alexstine/\">Alex Stine</a> · <a href=\"https://profiles.wordpress.org/albigdd/\">Alexander Bigga</a> · <a href=\"https://profiles.wordpress.org/aliaghdam/\">Ali Aghdam</a> · <a href=\"https://profiles.wordpress.org/mrfoxtalbot/\">Alvaro Gﾃｳmez</a> · <a href=\"https://profiles.wordpress.org/amanandhishoe/\">amanandhishoe</a> · <a href=\"https://profiles.wordpress.org/alh0319/\">Amber Hinds</a> · <a href=\"https://profiles.wordpress.org/amesplant/\">Ames Plant</a> · <a href=\"https://profiles.wordpress.org/amibe/\">Amibe Websites</a> · <a href=\"https://profiles.wordpress.org/amin7/\">Amin</a> · <a href=\"https://profiles.wordpress.org/amitraj2203/\">Amit Raj</a> · <a href=\"https://profiles.wordpress.org/amykamala/\">Amy Kamala</a> · <a href=\"https://profiles.wordpress.org/altf4falt/\">Anand Rajaram</a> · <a href=\"https://profiles.wordpress.org/anastis/\">Anastis Sourgoutsidis</a> · <a href=\"https://profiles.wordpress.org/anlino/\">Anders Norﾃｩn</a> · <a href=\"https://profiles.wordpress.org/afercia/\">Andrea Fercia</a> · <a href=\"https://profiles.wordpress.org/awetz583/\">Andrea Roenning</a> · <a href=\"https://profiles.wordpress.org/andraganescu/\">Andrei Draganescu</a> · <a href=\"https://profiles.wordpress.org/aduth/\">Andrew Duthie</a> · <a href=\"https://profiles.wordpress.org/nacin/\">Andrew Nacin</a> · <a href=\"https://profiles.wordpress.org/azaozz/\">Andrew Ozz</a> · <a href=\"https://profiles.wordpress.org/andrewryno/\">Andrew Ryno</a> · <a href=\"https://profiles.wordpress.org/andrewserong/\">Andrew Serong</a> · <a href=\"https://profiles.wordpress.org/eatingrules/\">Andrew Wilder</a> · <a href=\"https://profiles.wordpress.org/aidvu/\">Andrija Vučinić</a> · <a href=\"https://profiles.wordpress.org/oandregal/\">André Maneiro</a> · <a href=\"https://profiles.wordpress.org/rilwis/\">Anh Tran</a> · <a href=\"https://profiles.wordpress.org/ankit-k-gupta/\">Ankit K Gupta</a> · <a href=\"https://profiles.wordpress.org/ankit k gupta/\">Ankit K. Gupta</a> · <a href=\"https://profiles.wordpress.org/ankitkumarshah/\">Ankit Kumar Shah</a> · <a href=\"https://profiles.wordpress.org/ankitmaru/\">Ankit Panchal</a> · <a href=\"https://profiles.wordpress.org/annezazu/\">Anne McCarthy</a> · <a href=\"https://profiles.wordpress.org/annebovelett/\">Anne-Mieke Bovelett</a> · <a href=\"https://profiles.wordpress.org/antpb/\">Anthony Burchell</a> · <a href=\"https://profiles.wordpress.org/ahortin/\">Anthony Hortin</a> · <a href=\"https://profiles.wordpress.org/antonvlasenko/\">Anton Vlasenko</a> · <a href=\"https://profiles.wordpress.org/slieptsov/\">anton7249</a> · <a href=\"https://profiles.wordpress.org/antoniosejas/\">Antonio Sejas</a> · <a href=\"https://profiles.wordpress.org/antonrinas/\">antonrinas</a> · <a href=\"https://profiles.wordpress.org/anukasha/\">Anukasha Singh</a> · <a href=\"https://profiles.wordpress.org/anupkankale/\">Anup Kankale</a> · <a href=\"https://profiles.wordpress.org/apedog/\">apedog</a> · <a href=\"https://profiles.wordpress.org/arcwp/\">arcwp</a> · <a href=\"https://profiles.wordpress.org/aristath/\">Ari Stathopoulos</a> · <a href=\"https://profiles.wordpress.org/arkaprabhachowdhury/\">Arkaprabha Chowdhury</a> · <a href=\"https://profiles.wordpress.org/artemiosans/\">Artemio Morales</a> · <a href=\"https://profiles.wordpress.org/arthur791004/\">Arthur Chu</a> · <a href=\"https://profiles.wordpress.org/artpi/\">Artur Piszek</a> · <a href=\"https://profiles.wordpress.org/artz91/\">ArtZ91</a> · <a href=\"https://profiles.wordpress.org/arunu1996/\">Arun</a> · <a href=\"https://profiles.wordpress.org/arunsathiya/\">Arun Sathiya</a> · <a href=\"https://profiles.wordpress.org/atharvasagane/\">atharvasagane</a> · <a href=\"https://profiles.wordpress.org/audunmb/\">audunmb</a> · <a href=\"https://profiles.wordpress.org/awardpress/\">awardpress</a> · <a href=\"https://profiles.wordpress.org/azragh/\">Azragh</a> · <a href=\"https://profiles.wordpress.org/neo2k23/\">BackuPs</a> · <a href=\"https://profiles.wordpress.org/badasswp/\">badasswp</a> · <a href=\"https://profiles.wordpress.org/scruffian/\">Ben Dwyer</a> · <a href=\"https://profiles.wordpress.org/benniledl/\">Benedikt Ledl</a> · <a href=\"https://profiles.wordpress.org/benjamin_zekavica/\">Benjamin Zekavica</a> · <a href=\"https://profiles.wordpress.org/benoitchantre/\">Benoit Chantre</a> · <a href=\"https://profiles.wordpress.org/benpinales/\">benpinales</a> · <a href=\"https://profiles.wordpress.org/bernhard-reiter/\">Bernie Reiter</a> · <a href=\"https://profiles.wordpress.org/bernhard reiter/\">Bernie Reiter</a> · <a href=\"https://profiles.wordpress.org/berislavgrgicak/\">Bero</a> · <a href=\"https://profiles.wordpress.org/wilcosky/\">Billy Wilcosky</a> · <a href=\"https://profiles.wordpress.org/birgire/\">Birgir Erlendsson (birgire)</a> · <a href=\"https://profiles.wordpress.org/bph/\">Birgit Pauli-Haack</a> · <a href=\"https://profiles.wordpress.org/blackstar1991/\">BlackStar</a> · <a href=\"https://profiles.wordpress.org/bluefuton/\">bluefuton</a> · <a href=\"https://profiles.wordpress.org/bobbingwide/\">bobbingwide</a> · <a href=\"https://profiles.wordpress.org/safedawn/\">Boris Gherman</a> · <a href=\"https://profiles.wordpress.org/bor0/\">Boro Sitnikovski</a> · <a href=\"https://profiles.wordpress.org/bradley2083/\">brad hogan</a> · <a href=\"https://profiles.wordpress.org/bjorsch/\">Brad Jorsch</a> · <a href=\"https://profiles.wordpress.org/bradshawtm/\">bradshawtm</a> · <a href=\"https://profiles.wordpress.org/brajdas0022/\">brajdas0022</a> · <a href=\"https://profiles.wordpress.org/bhubbard/\">Brandon Hubbard</a> · <a href=\"https://profiles.wordpress.org/kraftbj/\">Brandon Kraft</a> · <a href=\"https://profiles.wordpress.org/bpayton/\">Brandon Payton</a> · <a href=\"https://profiles.wordpress.org/brbrr/\">brbrr</a> · <a href=\"https://profiles.wordpress.org/bacoords/\">Brian Coords</a> · <a href=\"https://profiles.wordpress.org/bgardner/\">Brian Gardner</a> · <a href=\"https://profiles.wordpress.org/masteradhoc/\">Brian Haas</a> · <a href=\"https://profiles.wordpress.org/brianhogg/\">Brian Hogg</a> · <a href=\"https://profiles.wordpress.org/bridgetwillard/\">Bridget Willard</a> · <a href=\"https://profiles.wordpress.org/brumack/\">brumack</a> · <a href=\"https://profiles.wordpress.org/freibergergarcia/\">Bruno Freiberger Garcia</a> · <a href=\"https://profiles.wordpress.org/buutqn/\">buutqn</a> · <a href=\"https://profiles.wordpress.org/calin/\">Calin Don</a> · <a href=\"https://profiles.wordpress.org/karl94/\">Carlo Cannas</a> · <a href=\"https://profiles.wordpress.org/cbravobernal/\">Carlos Bravo</a> · <a href=\"https://profiles.wordpress.org/poena/\">Carolina Nymark</a> · <a href=\"https://profiles.wordpress.org/cbirdsong/\">cbirdsong</a> · <a href=\"https://profiles.wordpress.org/cgastrell/\">cgastrell</a> · <a href=\"https://profiles.wordpress.org/chexee/\">Chelsea Otakan</a> · <a href=\"https://profiles.wordpress.org/chihsuan/\">Chi-Hsuan Huang</a> · <a href=\"https://profiles.wordpress.org/xristos3490/\">Chris Lilitsas</a> · <a href=\"https://profiles.wordpress.org/chrismcelroyseo/\">Chris McElroy SEO</a> · <a href=\"https://profiles.wordpress.org/czarate/\">Chris Zarate</a> · <a href=\"https://profiles.wordpress.org/chrisdotdotdot/\">chrisdotdotdot</a> · <a href=\"https://profiles.wordpress.org/chrispecoraro/\">chrispecoraro</a> · <a href=\"https://profiles.wordpress.org/apermo/\">Christoph Daum</a> · <a href=\"https://profiles.wordpress.org/nyiriland/\">Christy Nyiri</a> · <a href=\"https://profiles.wordpress.org/cagrimmett/\">Chuck Grimmett</a> · <a href=\"https://profiles.wordpress.org/butterflymedia/\">Ciprian Popescu</a> · <a href=\"https://profiles.wordpress.org/clayray/\">clayray</a> · <a href=\"https://profiles.wordpress.org/costdev/\">Colin Stewart</a> · <a href=\"https://profiles.wordpress.org/component/\">component</a> · <a href=\"https://profiles.wordpress.org/copons/\">Copons</a> · <a href=\"https://profiles.wordpress.org/coreyw/\">Corey Worrell</a> · <a href=\"https://profiles.wordpress.org/cr0ybot/\">Cory Hughart</a> · <a href=\"https://profiles.wordpress.org/crstauf/\">crstauf</a> · <a href=\"https://profiles.wordpress.org/czarflix/\">czarflix</a> · <a href=\"https://profiles.wordpress.org/daledupreez/\">Dale du Preez</a> · <a href=\"https://profiles.wordpress.org/colorful-tones/\">Damon Cook</a> · <a href=\"https://profiles.wordpress.org/dpknauss/\">Dan Knauss</a> · <a href=\"https://profiles.wordpress.org/danluu/\">Dan Luu</a> · <a href=\"https://profiles.wordpress.org/alexodiy/\">Dan Zakirov</a> · <a href=\"https://profiles.wordpress.org/danielbachhuber/\">Daniel Bachhuber</a> · <a href=\"https://profiles.wordpress.org/redsweater/\">Daniel Jalkut (Red Sweater)</a> · <a href=\"https://profiles.wordpress.org/talldanwp/\">Daniel Richards</a> · <a href=\"https://profiles.wordpress.org/mte90/\">Daniele Scasciafratte</a> · <a href=\"https://profiles.wordpress.org/danieltj/\">danieltj</a> · <a href=\"https://profiles.wordpress.org/dannyreaktiv/\">dannyreaktiv</a> · <a href=\"https://profiles.wordpress.org/dkotter/\">Darin Kotter</a> · <a href=\"https://profiles.wordpress.org/nerrad/\">Darren Ethier (nerrad)</a> · <a href=\"https://profiles.wordpress.org/darshitrajyaguru97/\">Darshit Rajyaguru</a> · <a href=\"https://profiles.wordpress.org/dryanpress/\">Dave Ryan</a> · <a href=\"https://profiles.wordpress.org/drw158/\">Dave Whitley</a> · <a href=\"https://profiles.wordpress.org/darerodz/\">David Arenas</a> · <a href=\"https://profiles.wordpress.org/davidbaumwald/\">David Baumwald</a> · <a href=\"https://profiles.wordpress.org/davidabowman/\">David Bowman</a> · <a href=\"https://profiles.wordpress.org/dlh/\">David Herrera</a> · <a href=\"https://profiles.wordpress.org/justlevine/\">David Levine</a> · <a href=\"https://profiles.wordpress.org/get_dave/\">David Smith</a> · <a href=\"https://profiles.wordpress.org/superdav42/\">David Stone</a> · <a href=\"https://profiles.wordpress.org/dsas/\">Dean Sas</a> · <a href=\"https://profiles.wordpress.org/debarghyabanerjee/\">DEBARGHYA BANERJEE</a> · <a href=\"https://profiles.wordpress.org/raftaar1191/\">Deepak Gupta</a> · <a href=\"https://profiles.wordpress.org/deepaklalwani/\">Deepak Lalwani</a> · <a href=\"https://profiles.wordpress.org/deepakprajapati/\">Deepak Prajapati</a> · <a href=\"https://profiles.wordpress.org/deepakrohilla/\">Deepak Rohilla</a> · <a href=\"https://profiles.wordpress.org/dingo_d/\">Denis ﾅｽoljom</a> · <a href=\"https://profiles.wordpress.org/realloc/\">Dennis Ploetner</a> · <a href=\"https://profiles.wordpress.org/dmsnell/\">Dennis Snell</a> · <a href=\"https://profiles.wordpress.org/deoladev/\">deoladev</a> · <a href=\"https://profiles.wordpress.org/dhansondesigns/\">Derek Hanson</a> · <a href=\"https://profiles.wordpress.org/dhiraj0901/\">Dhiraj Joshi</a> · <a href=\"https://profiles.wordpress.org/dhrumilk/\">Dhrumil Kumbhani</a> · <a href=\"https://profiles.wordpress.org/dhruval04/\">Dhruval Shah</a> · <a href=\"https://profiles.wordpress.org/dhruvang21/\">Dhruvang21</a> · <a href=\"https://profiles.wordpress.org/dhruvik18/\">Dhruvik Malaviya</a> · <a href=\"https://profiles.wordpress.org/dianeco/\">Diane Co</a> · <a href=\"https://profiles.wordpress.org/digamberpradhan/\">digamberpradhan</a> · <a href=\"https://profiles.wordpress.org/digitalblanket/\">digitalblanket</a> · <a href=\"https://profiles.wordpress.org/dilipbheda/\">Dilip Bheda</a> · <a href=\"https://profiles.wordpress.org/dilip2615/\">Dilip Modhavadiya</a> · <a href=\"https://profiles.wordpress.org/dimitro/\">Dimitris Mitropoulos</a> · <a href=\"https://profiles.wordpress.org/dd32/\">Dion Hulse</a> · <a href=\"https://profiles.wordpress.org/divyeshpatel01/\">divyeshpatel01</a> · <a href=\"https://profiles.wordpress.org/ocean90/\">Dominik Schilling</a> · <a href=\"https://profiles.wordpress.org/thehenridev/\">Douglas Henri</a> · <a href=\"https://profiles.wordpress.org/drebbitsweb/\">Dreb Bitanghol</a> · <a href=\"https://profiles.wordpress.org/drewapicture/\">Drew Jaynes</a> · <a href=\"https://profiles.wordpress.org/drivingralle/\">Drivingralle</a> · <a href=\"https://profiles.wordpress.org/drysand/\">drysand</a> · <a href=\"https://profiles.wordpress.org/elrae/\">Earle Davies</a> · <a href=\"https://profiles.wordpress.org/eclev91/\">eclev91</a> · <a href=\"https://profiles.wordpress.org/egill/\">Egill R. Erlendsson</a> · <a href=\"https://profiles.wordpress.org/ehti/\">Ehti</a> · <a href=\"https://profiles.wordpress.org/ellatrix/\">Ella van Durpe</a> · <a href=\"https://profiles.wordpress.org/codex-m/\">Emerson Maningo</a> · <a href=\"https://profiles.wordpress.org/nrqsnchz/\">Enrique Sﾃ｡nchez</a> · <a href=\"https://profiles.wordpress.org/ytfeldrawkcab/\">Eric Michel</a> · <a href=\"https://profiles.wordpress.org/ethitter/\">Erick Hitter</a> · <a href=\"https://profiles.wordpress.org/im3dabasia1/\">Eshaan Dabasiya</a> · <a href=\"https://profiles.wordpress.org/ecairol/\">Esteban</a> · <a href=\"https://profiles.wordpress.org/estelaris/\">Estela Rueda</a> · <a href=\"https://profiles.wordpress.org/evansolomon/\">Evan Solomon</a> · <a href=\"https://profiles.wordpress.org/fabiankaegy/\">Fabian Kägy</a> · <a href=\"https://profiles.wordpress.org/fakhriaz/\">Fakhri Azzouz</a> · <a href=\"https://profiles.wordpress.org/farhad0/\">Farhad Sakhaei</a> · <a href=\"https://profiles.wordpress.org/felipevelzani/\">Felipe Velzani</a> · <a href=\"https://profiles.wordpress.org/flixos90/\">Felix Arntz</a> · <a href=\"https://profiles.wordpress.org/fernandot/\">Fernando Tellado</a> · <a href=\"https://profiles.wordpress.org/firoz2456/\">Firoz Sabaliya</a> · <a href=\"https://profiles.wordpress.org/fcoveram/\">Francisco Vera</a> · <a href=\"https://profiles.wordpress.org/vanhoucke/\">Franck VANHOUCKE</a> · <a href=\"https://profiles.wordpress.org/franz00/\">Fransisca H</a> · <a href=\"https://profiles.wordpress.org/frozzare/\">Fredrik Forsmo</a> · <a href=\"https://profiles.wordpress.org/from/\">frOM</a> · <a href=\"https://profiles.wordpress.org/fushar/\">fushar</a> · <a href=\"https://profiles.wordpress.org/garrett-eclipse/\">Garrett Hyder</a> · <a href=\"https://profiles.wordpress.org/garyj/\">Gary Jones</a> · <a href=\"https://profiles.wordpress.org/pento/\">Gary Pendergast</a> · <a href=\"https://profiles.wordpress.org/gaurangsondagar/\">Gaurang Sondagar</a> · <a href=\"https://profiles.wordpress.org/gautammkgarg/\">Gautam Garg</a> · <a href=\"https://profiles.wordpress.org/gautam23/\">Gautam Mehta</a> · <a href=\"https://profiles.wordpress.org/geminorum/\">geminorum</a> · <a href=\"https://profiles.wordpress.org/generosus/\">Generosus</a> · <a href=\"https://profiles.wordpress.org/mamaduka/\">George Mamadashvili</a> · <a href=\"https://profiles.wordpress.org/gmjuhasz/\">Gergely J</a> · <a href=\"https://profiles.wordpress.org/gierand/\">gierand</a> · <a href=\"https://profiles.wordpress.org/glendaviesnz/\">Glen Davies</a> · <a href=\"https://profiles.wordpress.org/ingeniumed/\">Gopal Krishnan</a> · <a href=\"https://profiles.wordpress.org/grahamarmfield/\">Graham Armfield</a> · <a href=\"https://profiles.wordpress.org/grantmkin/\">Grant M. Kinney</a> · <a href=\"https://profiles.wordpress.org/gziolo/\">Greg Ziółkowski</a> · <a href=\"https://profiles.wordpress.org/guido07111975/\">Guido</a> · <a href=\"https://profiles.wordpress.org/gulamdastgir04/\">Gulamdastgir Momin</a> · <a href=\"https://profiles.wordpress.org/gustavohappyeng/\">Gustavo Hilario</a> · <a href=\"https://profiles.wordpress.org/gyurmey/\">Gyurmey</a> · <a href=\"https://profiles.wordpress.org/adrock42/\">H. Adam Lenz</a> · <a href=\"https://profiles.wordpress.org/kabir93/\">H. Kabir</a> · <a href=\"https://profiles.wordpress.org/hack_nug/\">hack_nug</a> · <a href=\"https://profiles.wordpress.org/hanneslsm/\">hanneslsm</a> · <a href=\"https://profiles.wordpress.org/hage/\">Hans-Gerd Gerhards</a> · <a href=\"https://profiles.wordpress.org/hardikhuptechdev/\">Hardik Kumar</a> · <a href=\"https://profiles.wordpress.org/harshbhonsle08/\">harshbhonsle08</a> · <a href=\"https://profiles.wordpress.org/helen/\">Helen Hou-Sandi</a> · <a href=\"https://profiles.wordpress.org/abcd95/\">Himanshu Pathak</a> · <a href=\"https://profiles.wordpress.org/himshekhar07/\">Himanshu Shekhar</a> · <a href=\"https://profiles.wordpress.org/hiranimahaveer/\">hiranimahaveer</a> · <a href=\"https://profiles.wordpress.org/hiroshisato/\">Hiroshi Sato</a> · <a href=\"https://profiles.wordpress.org/hbhalodia/\">Hit Bhalodia</a> · <a href=\"https://profiles.wordpress.org/hiteshtalpada/\">Hitesh Talpada</a> · <a href=\"https://profiles.wordpress.org/hozefasmile/\">Hozefa Saleh</a> · <a href=\"https://profiles.wordpress.org/royhridoy/\">Hridoy Roy</a> · <a href=\"https://profiles.wordpress.org/hugod/\">hugod</a> · <a href=\"https://profiles.wordpress.org/huubl/\">huubl</a> · <a href=\"https://profiles.wordpress.org/huzaifaalmesbah/\">Huzaifa Al Mesbah</a> · <a href=\"https://profiles.wordpress.org/priethor/\">Hﾃｩctor Prieto</a> · <a href=\"https://profiles.wordpress.org/iandunn/\">Ian Dunn</a> · <a href=\"https://profiles.wordpress.org/ibrahimriaz/\">Ibrahim Riaz</a> · <a href=\"https://profiles.wordpress.org/ierwira/\">ierwira</a> · <a href=\"https://profiles.wordpress.org/iflairwebtechnologies/\">iflairwebtechnologies</a> · <a href=\"https://profiles.wordpress.org/ignatiusjeroe/\">ignatiusjeroe</a> · <a href=\"https://profiles.wordpress.org/ipstenu/\">Ipstenu (Mika Epstein)</a> · <a href=\"https://profiles.wordpress.org/iqbal1hossain/\">Iqbal Hossain</a> · <a href=\"https://profiles.wordpress.org/isabel_brison/\">Isabel Brison</a> · <a href=\"https://profiles.wordpress.org/iseulde/\">iseulde</a> · <a href=\"https://profiles.wordpress.org/itsyash1421/\">itsyash1421</a> · <a href=\"https://profiles.wordpress.org/iulia-cazan/\">Iulia Cazan</a> · <a href=\"https://profiles.wordpress.org/jabe/\">Jabe</a> · <a href=\"https://profiles.wordpress.org/jacobcassidy/\">Jacob Cassidy</a> · <a href=\"https://profiles.wordpress.org/smithjw1/\">Jacob Smith</a> · <a href=\"https://profiles.wordpress.org/jadavsanjay/\">Jadav Sanjay</a> · <a href=\"https://profiles.wordpress.org/jamesgiroux/\">James Giroux</a> · <a href=\"https://profiles.wordpress.org/jameskoster/\">James Koster</a> · <a href=\"https://profiles.wordpress.org/isotropic/\">James LePage</a> · <a href=\"https://profiles.wordpress.org/jhmonroe/\">James Monroe</a> · <a href=\"https://profiles.wordpress.org/jsnajdr/\">Jarda Snajdr</a> · <a href=\"https://profiles.wordpress.org/jarekmorawski/\">jarekmorawski</a> · <a href=\"https://profiles.wordpress.org/jarodortegaaraya/\">jarodortegaaraya</a> · <a href=\"https://profiles.wordpress.org/jason_the_adams/\">Jason Adams</a> · <a href=\"https://profiles.wordpress.org/jasonkytros/\">Jason Kytros</a> · <a href=\"https://profiles.wordpress.org/madtownlems/\">Jason LeMahieu (MadtownLems)</a> · <a href=\"https://profiles.wordpress.org/jaspercck/\">jaspercck</a> · <a href=\"https://profiles.wordpress.org/javiercasares/\">Javier Casares</a> · <a href=\"https://profiles.wordpress.org/jdeep/\">Jaydeep Das</a> · <a href=\"https://profiles.wordpress.org/jdahir0789/\">Jaydip</a> · <a href=\"https://profiles.wordpress.org/jcnetsys/\">jcnetsys</a> · <a href=\"https://profiles.wordpress.org/audrasjb/\">Jean-Baptiste Audras</a> · <a href=\"https://profiles.wordpress.org/jsmansart/\">Jean-Sﾃｩbastien Mansart</a> · <a href=\"https://profiles.wordpress.org/krokodok/\">Jeff Chi</a> · <a href=\"https://profiles.wordpress.org/maverick3x6/\">Jeff Golenski</a> · <a href=\"https://profiles.wordpress.org/phpbits/\">Jeffrey Carandang</a> · <a href=\"https://profiles.wordpress.org/jeffpaul/\">Jeffrey Paul</a> · <a href=\"https://profiles.wordpress.org/jmdodd/\">Jennifer M. Dodd</a> · <a href=\"https://profiles.wordpress.org/jdy68/\">Jenny Dupuy</a> · <a href=\"https://profiles.wordpress.org/jeremyfelt/\">Jeremy Felt</a> · <a href=\"https://profiles.wordpress.org/jeherve/\">Jeremy Herve</a> · <a href=\"https://profiles.wordpress.org/jeryj/\">jeryj</a> · <a href=\"https://profiles.wordpress.org/jessedyck/\">Jesse Dyck</a> · <a href=\"https://profiles.wordpress.org/luminuu/\">Jessica Lyschik</a> · <a href=\"https://profiles.wordpress.org/jhtjards/\">jhtjards</a> · <a href=\"https://profiles.wordpress.org/jigarkahar/\">Jigar Kahar</a> · <a href=\"https://profiles.wordpress.org/joedolson/\">Joe Dolson</a> · <a href=\"https://profiles.wordpress.org/joefusco/\">Joe Fusco</a> · <a href=\"https://profiles.wordpress.org/joehoyle/\">Joe Hoyle</a> · <a href=\"https://profiles.wordpress.org/joemcgill/\">Joe McGill</a> · <a href=\"https://profiles.wordpress.org/joen/\">Joen Asmussen</a> · <a href=\"https://profiles.wordpress.org/joezappie/\">joezappie</a> · <a href=\"https://profiles.wordpress.org/timse201/\">Johannes Jﾃｼlg</a> · <a href=\"https://profiles.wordpress.org/johnbillion/\">John Blackbourn</a> · <a href=\"https://profiles.wordpress.org/bitmachina/\">John Hooks</a> · <a href=\"https://profiles.wordpress.org/johnjago/\">John Jago</a> · <a href=\"https://profiles.wordpress.org/johnjamesjacoby/\">John James Jacoby</a> · <a href=\"https://profiles.wordpress.org/mindctrl/\">John Parris</a> · <a href=\"https://profiles.wordpress.org/johnwatkins0/\">John Watkins</a> · <a href=\"https://profiles.wordpress.org/jomonthomaslobo1/\">Jomon Thomas Lobo</a> · <a href=\"https://profiles.wordpress.org/jonsurrell/\">Jon Surrell</a> · <a href=\"https://profiles.wordpress.org/psykro/\">Jonathan Bossenger</a> · <a href=\"https://profiles.wordpress.org/desrosj/\">Jonathan Desrosiers</a> · <a href=\"https://profiles.wordpress.org/spacedmonkey/\">Jonny Harris</a> · <a href=\"https://profiles.wordpress.org/joppuyo/\">joppuyo</a> · <a href=\"https://profiles.wordpress.org/jordesign/\">jordesign</a> · <a href=\"https://profiles.wordpress.org/jorgefilipecosta/\">Jorge Costa</a> · <a href=\"https://profiles.wordpress.org/jorge1017/\">jorge1017</a> · <a href=\"https://profiles.wordpress.org/josvelasco/\">Jos Velasco</a> · <a href=\"https://profiles.wordpress.org/josephscott/\">Joseph Scott</a> · <a href=\"https://profiles.wordpress.org/jdwire/\">Joshua Dwire</a> · <a href=\"https://profiles.wordpress.org/verygoode/\">Joshua Goode</a> · <a href=\"https://profiles.wordpress.org/joshualipstone/\">joshualipstone</a> · <a href=\"https://profiles.wordpress.org/joyously/\">Joy</a> · <a href=\"https://profiles.wordpress.org/jtquip88/\">jtquip88</a> · <a href=\"https://profiles.wordpress.org/juanfra/\">Juanfra Aldasoro</a> · <a href=\"https://profiles.wordpress.org/juanmaguitar/\">JuanMa Garrido</a> · <a href=\"https://profiles.wordpress.org/julianoe/\">julianoe</a> · <a href=\"https://profiles.wordpress.org/jrf/\">Juliette Reinders Folmer</a> · <a href=\"https://profiles.wordpress.org/juliobox/\">Julio Potier</a> · <a href=\"https://profiles.wordpress.org/junaidkbr/\">Junaid Ahmed</a> · <a href=\"https://profiles.wordpress.org/greenshady/\">Justin Tadlock</a> · <a href=\"https://profiles.wordpress.org/itsroy69/\">Jyotirmoy Roy</a> · <a href=\"https://profiles.wordpress.org/kallyansin/\">Kallyan Singha</a> · <a href=\"https://profiles.wordpress.org/kapilpaul/\">Kapil Paul</a> · <a href=\"https://profiles.wordpress.org/karinchristen/\">Karin Christen</a> · <a href=\"https://profiles.wordpress.org/karolmanijak/\">Karol Manijak</a> · <a href=\"https://profiles.wordpress.org/karthickmurugan/\">Karthick</a> · <a href=\"https://profiles.wordpress.org/karthikeya01/\">Karthikeya Bethu</a> · <a href=\"https://profiles.wordpress.org/kasparsd/\">Kaspars</a> · <a href=\"https://profiles.wordpress.org/zoonini/\">Kathryn Presner</a> · <a href=\"https://profiles.wordpress.org/khushdoms/\">Kaushik Domadiya</a> · <a href=\"https://profiles.wordpress.org/kjoyner/\">Kedar Joyner</a> · <a href=\"https://profiles.wordpress.org/kmurphyzuora/\">Keith Murphy</a> · <a href=\"https://profiles.wordpress.org/ryelle/\">Kelly Choyce-Dwan</a> · <a href=\"https://profiles.wordpress.org/kelvinballoo/\">kelvinballoo</a> · <a href=\"https://profiles.wordpress.org/keoshi/\">keoshi</a> · <a href=\"https://profiles.wordpress.org/gwwar/\">Kerry Liu</a> · <a href=\"https://profiles.wordpress.org/kbat82/\">Kevin Batdorf</a> · <a href=\"https://profiles.wordpress.org/khoipro/\">Khoi Pro</a> · <a href=\"https://profiles.wordpress.org/khokansardar/\">Khokan Sardar</a> · <a href=\"https://profiles.wordpress.org/khushipatel15/\">Khushi Patel</a> · <a href=\"https://profiles.wordpress.org/khushi1501/\">Khushi Thakrar</a> · <a href=\"https://profiles.wordpress.org/kirasong/\">Kira Schroder</a> · <a href=\"https://profiles.wordpress.org/solankisoftware/\">Kirtikumar Solanki</a> · <a href=\"https://profiles.wordpress.org/kjellr/\">Kjell Reigstad</a> · <a href=\"https://profiles.wordpress.org/kkmuffme/\">kkmuffme</a> · <a href=\"https://profiles.wordpress.org/knutsp/\">Knut Sparhell</a> · <a href=\"https://profiles.wordpress.org/obenland/\">Konstantin Obenland</a> · <a href=\"https://profiles.wordpress.org/kpapazov/\">kpapazov</a> · <a href=\"https://profiles.wordpress.org/kristastevens/\">kristastevens</a> · <a href=\"https://profiles.wordpress.org/krupajnanda/\">Krupa Nanda</a> · <a href=\"https://profiles.wordpress.org/krupalpanchal/\">Krupal Panchal</a> · <a href=\"https://profiles.wordpress.org/mywp459/\">Kyle Mott</a> · <a href=\"https://profiles.wordpress.org/mlaetitia/\">Lae</a> · <a href=\"https://profiles.wordpress.org/lakshyajeet/\">Lakshyajeet Singh Goyal</a> · <a href=\"https://profiles.wordpress.org/lancewillett/\">Lance Willett</a> · <a href=\"https://profiles.wordpress.org/lgersman/\">Lars Gersmann</a> · <a href=\"https://profiles.wordpress.org/laurisaarni/\">Lauri Saarni</a> · <a href=\"https://profiles.wordpress.org/lapsrj/\">Leandro Amorim</a> · <a href=\"https://profiles.wordpress.org/leedxw/\">leedxw</a> · <a href=\"https://profiles.wordpress.org/leemon/\">leemon</a> · <a href=\"https://profiles.wordpress.org/lbones/\">Lela</a> · <a href=\"https://profiles.wordpress.org/0mirka00/\">Lena Morita</a> · <a href=\"https://profiles.wordpress.org/levinbaria/\">Levin Baria</a> · <a href=\"https://profiles.wordpress.org/lsarsfield/\">Liam Sarsfield (a11n)</a> · <a href=\"https://profiles.wordpress.org/liviopv/\">liviopv</a> · <a href=\"https://profiles.wordpress.org/louischan/\">Louis Chance</a> · <a href=\"https://profiles.wordpress.org/louiswol94/\">Louis Wolmarans</a> · <a href=\"https://profiles.wordpress.org/gigitux/\">Luigi Teschio</a> · <a href=\"https://profiles.wordpress.org/luigipulcini/\">luigipulcini</a> · <a href=\"https://profiles.wordpress.org/luisherranz/\">luisherranz</a> · <a href=\"https://profiles.wordpress.org/lukasfritzedev/\">LukasFritzeDev</a> · <a href=\"https://profiles.wordpress.org/lukecarbis/\">Luke Carbis</a> · <a href=\"https://profiles.wordpress.org/griffbrad/\">Lynn Bradley Griffith</a> · <a href=\"https://profiles.wordpress.org/maccyd/\">maccyd</a> · <a href=\"https://profiles.wordpress.org/madhavishah01/\">Madhavi Shah</a> · <a href=\"https://profiles.wordpress.org/madhavraj/\">madhavraj</a> · <a href=\"https://profiles.wordpress.org/magaliechetrit/\">Magalie Chetrit</a> · <a href=\"https://profiles.wordpress.org/onemaggie/\">Maggie Cabrera</a> · <a href=\"https://profiles.wordpress.org/mai21/\">Mai</a> · <a href=\"https://profiles.wordpress.org/aion11/\">Mainul Kabir Aion</a> · <a href=\"https://profiles.wordpress.org/maksvi/\">maksvi</a> · <a href=\"https://profiles.wordpress.org/malayladu/\">Malay Ladu</a> · <a href=\"https://profiles.wordpress.org/malt3/\">Malte</a> · <a href=\"https://profiles.wordpress.org/maltfield/\">maltfield</a> · <a href=\"https://profiles.wordpress.org/manhar/\">Manhar Barot</a> · <a href=\"https://profiles.wordpress.org/manishxdp/\">Manish Dhorepatil</a> · <a href=\"https://profiles.wordpress.org/sirlouen/\">Manuel Camargo</a> · <a href=\"https://profiles.wordpress.org/manzoorwanijk/\">Manzoor Wani</a> · <a href=\"https://profiles.wordpress.org/manzoorwani.jk/\">Manzoor Wani</a> · <a href=\"https://profiles.wordpress.org/marc4/\">Marc Armengou</a> · <a href=\"https://profiles.wordpress.org/iworks/\">Marcin Pietrzak</a> · <a href=\"https://profiles.wordpress.org/pagelab/\">Marcio Duarte</a> · <a href=\"https://profiles.wordpress.org/webdados/\">Marco Almeida | Webdados</a> · <a href=\"https://profiles.wordpress.org/mciampini/\">Marco Ciampini</a> · <a href=\"https://profiles.wordpress.org/olmostblue/\">Marco Olmedi</a> · <a href=\"https://profiles.wordpress.org/power2009/\">Marcus</a> · <a href=\"https://profiles.wordpress.org/marian1/\">marian1</a> · <a href=\"https://profiles.wordpress.org/marianne38/\">Marianne</a> · <a href=\"https://profiles.wordpress.org/plari/\">Marie</a> · <a href=\"https://profiles.wordpress.org/tyxla/\">Marin Atanasov</a> · <a href=\"https://profiles.wordpress.org/santosguillamot/\">Mario Santos</a> · <a href=\"https://profiles.wordpress.org/motylanogha/\">Mariusz Szatkowski</a> · <a href=\"https://profiles.wordpress.org/markjaquith/\">Mark Jaquith</a> · <a href=\"https://profiles.wordpress.org/mapk/\">Mark Uraine</a> · <a href=\"https://profiles.wordpress.org/markoserb/\">Marko Ivanovic</a> · <a href=\"https://profiles.wordpress.org/marybaum/\">Mary Baum</a> · <a href=\"https://profiles.wordpress.org/4thhubbard/\">Mary Hubbard</a> · <a href=\"https://profiles.wordpress.org/muryam/\">Maryam Sultana</a> · <a href=\"https://profiles.wordpress.org/mathiaspeguet/\">Mathias Peguet</a> · <a href=\"https://profiles.wordpress.org/mathijsvdbeek/\">mathijsvdbeek</a> · <a href=\"https://profiles.wordpress.org/mmaattiiaass/\">Matias Benedetto</a> · <a href=\"https://profiles.wordpress.org/matveb/\">Matias Ventura</a> · <a href=\"https://profiles.wordpress.org/mattmiklic/\">Matt Miklic</a> · <a href=\"https://profiles.wordpress.org/matt/\">Matt Mullenweg</a> · <a href=\"https://profiles.wordpress.org/mattshaw/\">Matt Shaw</a> · <a href=\"https://profiles.wordpress.org/kittmedia/\">Matthias Kittsteiner</a> · <a href=\"https://profiles.wordpress.org/jillro/\">Maud Royer</a> · <a href=\"https://profiles.wordpress.org/maulikmakwana2008/\">Maulik Makwana</a> · <a href=\"https://profiles.wordpress.org/maxschmeling/\">Max Schmeling</a> · <a href=\"https://profiles.wordpress.org/djsuperfive/\">Maxime Freschard</a> · <a href=\"https://profiles.wordpress.org/maximumsoftware/\">maximum.software</a> · <a href=\"https://profiles.wordpress.org/mayanktripathi32/\">Mayank Tripathi</a> · <a href=\"https://profiles.wordpress.org/mayur8991/\">Mayur Prajapati</a> · <a href=\"https://profiles.wordpress.org/mabfahad/\">Md Abdullah Al Fahad</a> · <a href=\"https://profiles.wordpress.org/hmbashar/\">Md Abul Bashar</a> · <a href=\"https://profiles.wordpress.org/ismail0071/\">MD ISMAIL</a> · <a href=\"https://profiles.wordpress.org/wprashed/\">Md Rashed Hossain</a> · <a href=\"https://profiles.wordpress.org/mdibrahimk48/\">Md. Ibrahim Khalil</a> · <a href=\"https://profiles.wordpress.org/immeet94/\">Meet Makadia</a> · <a href=\"https://profiles.wordpress.org/mehrazmorshed/\">Mehraz Morshed</a> · <a href=\"https://profiles.wordpress.org/melchoyce/\">Mel Choyce-Dwan</a> · <a href=\"https://profiles.wordpress.org/donmhico/\">Michael</a> · <a href=\"https://profiles.wordpress.org/hrkhal/\">Michael James Ilett</a> · <a href=\"https://profiles.wordpress.org/mcsf/\">Miguel Fonseca</a> · <a href=\"https://profiles.wordpress.org/migueluy/\">Miguel Lezama</a> · <a href=\"https://profiles.wordpress.org/mmtr86/\">Miguel Torres</a> · <a href=\"https://profiles.wordpress.org/simison/\">Mikael Korpela</a> · <a href=\"https://profiles.wordpress.org/mikejolley/\">Mike Jolley</a> · <a href=\"https://profiles.wordpress.org/mmcalister/\">Mike McAlister</a> · <a href=\"https://profiles.wordpress.org/mikinc860/\">Mikin Chauhan</a> · <a href=\"https://profiles.wordpress.org/mimitips/\">mimi</a> · <a href=\"https://profiles.wordpress.org/multidots1896/\">Minal Diwan</a> · <a href=\"https://profiles.wordpress.org/mirmpro/\">Mir Monoarul Alam</a> · <a href=\"https://profiles.wordpress.org/illuminea/\">Miriam Schwab</a> · <a href=\"https://profiles.wordpress.org/369work/\">Miroku</a> · <a href=\"https://profiles.wordpress.org/m1r0/\">Miroslav Mitev (a11n)</a> · <a href=\"https://profiles.wordpress.org/presstoke/\">Mitchell Austin</a> · <a href=\"https://profiles.wordpress.org/mmorris8/\">mmorris8</a> · <a href=\"https://profiles.wordpress.org/hmrisad/\">Mohammad Risad</a> · <a href=\"https://profiles.wordpress.org/opurockey/\">Mohammad Rockeybul Alam</a> · <a href=\"https://profiles.wordpress.org/jabir20/\">Mohammed Jabir shaikh</a> · <a href=\"https://profiles.wordpress.org/mohamedahamed/\">Mohammed Noumaan Ahamed</a> · <a href=\"https://profiles.wordpress.org/mohitbsf/\">Mohit Sharma</a> · <a href=\"https://profiles.wordpress.org/mokshasharmila13/\">moksha shah</a> · <a href=\"https://profiles.wordpress.org/monarobase/\">Monarobase</a> · <a href=\"https://profiles.wordpress.org/monzuralam/\">Monzur Alam</a> · <a href=\"https://profiles.wordpress.org/man4toman/\">Morteza Geransayeh</a> · <a href=\"https://profiles.wordpress.org/mosescursor/\">Moses Cursor Ssebunya</a> · <a href=\"https://profiles.wordpress.org/mreishus/\">mreishus</a> · <a href=\"https://profiles.wordpress.org/mrwweb/\">mrwweb</a> · <a href=\"https://profiles.wordpress.org/mtias/\">mtias</a> · <a href=\"https://profiles.wordpress.org/mukesh27/\">Mukesh Panchal</a> · <a href=\"https://profiles.wordpress.org/mustafabharmal/\">Mustafa Bharmal</a> · <a href=\"https://profiles.wordpress.org/mydesign78/\">mydesign78</a> · <a href=\"https://profiles.wordpress.org/trickster301/\">Nabhishek Singh</a> · <a href=\"https://profiles.wordpress.org/assassinateur/\">Nadir Seghir</a> · <a href=\"https://profiles.wordpress.org/senadir/\">Nadir Seghir</a> · <a href=\"https://profiles.wordpress.org/namankhare/\">Naman Khare</a> · <a href=\"https://profiles.wordpress.org/nanisamireddy/\">NANI SAMIREDDY</a> · <a href=\"https://profiles.wordpress.org/narenin/\">Narendra Sishodiya</a> · <a href=\"https://profiles.wordpress.org/nareshbheda/\">Naresh Bheda</a> · <a href=\"https://profiles.wordpress.org/muddassirnasim/\">Nasim Miah</a> · <a href=\"https://profiles.wordpress.org/nateallen/\">Nate Allen</a> · <a href=\"https://profiles.wordpress.org/navi161/\">Navneet Kaur</a> · <a href=\"https://profiles.wordpress.org/nendeb55/\">nendeb</a> · <a href=\"https://profiles.wordpress.org/ndiego/\">Nick Diego</a> · <a href=\"https://profiles.wordpress.org/celloexpressions/\">Nick Halsey</a> · <a href=\"https://profiles.wordpress.org/nicmare/\">nicmare</a> · <a href=\"https://profiles.wordpress.org/nidhidhandhukiya/\">nidhidhandhukiya</a> · <a href=\"https://profiles.wordpress.org/ntsekouras/\">Nik Tsekouras</a> · <a href=\"https://profiles.wordpress.org/nikitasolanki1812/\">Nikita Solanki</a> · <a href=\"https://profiles.wordpress.org/nikunj8866/\">Nikunj Hatkar</a> · <a href=\"https://profiles.wordpress.org/nilambar/\">Nilambar Sharma</a> · <a href=\"https://profiles.wordpress.org/nimeshatxecurify/\">Nimesh</a> · <a href=\"https://profiles.wordpress.org/ninomiho/\">Nino Mihovilic</a> · <a href=\"https://profiles.wordpress.org/ninos-ego/\">Ninos</a> · <a href=\"https://profiles.wordpress.org/niravsherasiya7707/\">Nirav Sherasiya</a> · <a href=\"https://profiles.wordpress.org/noruzzaman/\">Noruzzaman Rubel</a> · <a href=\"https://profiles.wordpress.org/obliviousharmony/\">obliviousharmony</a> · <a href=\"https://profiles.wordpress.org/yasunocco/\">Okawa Yasuno</a> · <a href=\"https://profiles.wordpress.org/oglekler/\">Olga Gleckler</a> · <a href=\"https://profiles.wordpress.org/triple0t/\">Oluwaseun Olorunsola</a> · <a href=\"https://profiles.wordpress.org/gabertronic/\">Ophelia Rose</a> · <a href=\"https://profiles.wordpress.org/opr18/\">opr18</a> · <a href=\"https://profiles.wordpress.org/ottok/\">Otto Kekäläinen</a> · <a href=\"https://profiles.wordpress.org/ov3rfly/\">Ov3rfly</a> · <a href=\"https://profiles.wordpress.org/ovidiu-galatan/\">Ovidiu Galatan</a> · <a href=\"https://profiles.wordpress.org/ovidiul/\">ovidiul</a> · <a href=\"https://profiles.wordpress.org/owolter/\">owolter</a> · <a href=\"https://profiles.wordpress.org/ozgursar/\">Ozgur Sar</a> · <a href=\"https://profiles.wordpress.org/paaljoachim/\">Paal Joachim Romdahl</a> · <a href=\"https://profiles.wordpress.org/palak678/\">Palak Patel</a> · <a href=\"https://profiles.wordpress.org/paragjethva/\">Parag Jethva</a> · <a href=\"https://profiles.wordpress.org/paragoninitiativeenterprises/\">Paragon Initiative Enterprises</a> · <a href=\"https://profiles.wordpress.org/parinpanjari/\">Parin Panjari</a> · <a href=\"https://profiles.wordpress.org/parthvataliya/\">Parth vataliya</a> · <a href=\"https://profiles.wordpress.org/swissspidy/\">Pascal Birchler</a> · <a href=\"https://profiles.wordpress.org/patricedefago/\">Patrice Dﾃｩfago</a> · <a href=\"https://profiles.wordpress.org/patrickwclanden/\">patrickwclanden</a> · <a href=\"https://profiles.wordpress.org/pbearne/\">Paul Bearne</a> · <a href=\"https://profiles.wordpress.org/pbiron/\">Paul Biron</a> · <a href=\"https://profiles.wordpress.org/bbpaule/\">Paul English</a> · <a href=\"https://profiles.wordpress.org/paulkevan/\">Paul Kevan</a> · <a href=\"https://profiles.wordpress.org/pavanpatil1/\">Pavan Patil</a> · <a href=\"https://profiles.wordpress.org/ciorici/\">Pavel Ciorici</a> · <a href=\"https://profiles.wordpress.org/vybiral/\">Pavel Vybﾃｭral</a> · <a href=\"https://profiles.wordpress.org/pavelevap/\">pavelevap</a> · <a href=\"https://profiles.wordpress.org/penelopeadrian/\">penelopeadrian</a> · <a href=\"https://profiles.wordpress.org/pers/\">Per Sﾃｸderlind</a> · <a href=\"https://profiles.wordpress.org/provenself/\">Peter Rubin</a> · <a href=\"https://profiles.wordpress.org/peterwilsoncc/\">Peter Wilson</a> · <a href=\"https://profiles.wordpress.org/peter8nss/\">peter8nss</a> · <a href=\"https://profiles.wordpress.org/petitphp/\">petitphp</a> · <a href=\"https://profiles.wordpress.org/johnstonphilip/\">Phil Johnston</a> · <a href=\"https://profiles.wordpress.org/philhoyt/\">philhoyt</a> · <a href=\"https://profiles.wordpress.org/vheemstra/\">Philip</a> · <a href=\"https://profiles.wordpress.org/philipmjackson/\">Philip Jackson</a> · <a href=\"https://profiles.wordpress.org/manhphucofficial/\">Phuc Nguyen</a> · <a href=\"https://profiles.wordpress.org/nekojonez/\">Pieterjan Deneys</a> · <a href=\"https://profiles.wordpress.org/piyushpatel123/\">Piyush Patel</a> · <a href=\"https://profiles.wordpress.org/pmbs/\">pmbs</a> · <a href=\"https://profiles.wordpress.org/poligilad/\">poligilad</a> · <a href=\"https://profiles.wordpress.org/pooja-n/\">Pooja Kakkad</a> · <a href=\"https://profiles.wordpress.org/pooja1210/\">Pooja Killekar (Muchandikar)</a> · <a href=\"https://profiles.wordpress.org/poojapadamad/\">poojapadamad</a> · <a href=\"https://profiles.wordpress.org/porg/\">porg</a> · <a href=\"https://profiles.wordpress.org/gaisma22/\">Pradeep Pasam</a> · <a href=\"https://profiles.wordpress.org/prajapatvishnu/\">prajapatvishnu</a> · <a href=\"https://profiles.wordpress.org/pranavyeole/\">Pranav Yeole</a> · <a href=\"https://profiles.wordpress.org/pranjalpratapsingh/\">Pranjal Pratap Singh</a> · <a href=\"https://profiles.wordpress.org/prasadkarmalkar/\">Prasad Karmalkar</a> · <a href=\"https://profiles.wordpress.org/pmbaldha/\">Prashant Baldha</a> · <a href=\"https://profiles.wordpress.org/prathameshbhagat1511/\">Prathamesh Bhagat</a> · <a href=\"https://profiles.wordpress.org/pratik-jain/\">Pratik Jain</a> · <a href=\"https://profiles.wordpress.org/pratiklondhe/\">Pratik Londhe</a> · <a href=\"https://profiles.wordpress.org/pratiknawkar94/\">Pratik Nawkar</a> · <a href=\"https://profiles.wordpress.org/presskopp/\">Presskopp</a> · <a href=\"https://profiles.wordpress.org/priyankagusani/\">Priyanka Gusani</a> · <a href=\"https://profiles.wordpress.org/psorensen/\">psorensen</a> · <a href=\"https://profiles.wordpress.org/r1k0/\">r1k0</a> · <a href=\"https://profiles.wordpress.org/ronya4927/\">Rabbi Islam rony</a> · <a href=\"https://profiles.wordpress.org/rachid84/\">rachid84</a> · <a href=\"https://profiles.wordpress.org/rafaeldella/\">Rafael Della</a> · <a href=\"https://profiles.wordpress.org/rafa8626/\">Rafael Miranda</a> · <a href=\"https://profiles.wordpress.org/ekla/\">Rahul Kumar</a> · <a href=\"https://profiles.wordpress.org/rahulsprajapati/\">Rahul Prajapati</a> · <a href=\"https://profiles.wordpress.org/rahultank/\">Rahul Tank</a> · <a href=\"https://profiles.wordpress.org/rajanit2000/\">Rajan Vijayan</a> · <a href=\"https://profiles.wordpress.org/rajdiptank111/\">Rajdip Tank</a> · <a href=\"https://profiles.wordpress.org/ralucastn/\">Raluca</a> · <a href=\"https://profiles.wordpress.org/rahmohn/\">Ramon Ahnert</a> · <a href=\"https://profiles.wordpress.org/rcorrales/\">Ramon Corrales</a> · <a href=\"https://profiles.wordpress.org/ramonopoly/\">Ramon James</a> · <a href=\"https://profiles.wordpress.org/ravichudasama01/\">Ravi Chudasama</a> · <a href=\"https://profiles.wordpress.org/ravikhadka/\">Ravi Khadka</a> · <a href=\"https://profiles.wordpress.org/rcrdortiz/\">rcrdortiz</a> · <a href=\"https://profiles.wordpress.org/rebeensarbast/\">Rebeen Sarbast</a> · <a href=\"https://profiles.wordpress.org/rejaulalomkhan/\">Rejaul Alom Khan</a> · <a href=\"https://profiles.wordpress.org/renathoc/\">Renatho</a> · <a href=\"https://profiles.wordpress.org/retnonindya/\">Retno Nindya</a> · <a href=\"https://profiles.wordpress.org/retrofox/\">retrofox</a> · <a href=\"https://profiles.wordpress.org/youknowriad/\">Riad Benguella</a> · <a href=\"https://profiles.wordpress.org/riadev/\">riadev</a> · <a href=\"https://profiles.wordpress.org/rianrietveld/\">Rian Rietveld</a> · <a href=\"https://profiles.wordpress.org/ricjcs/\">Ricardo S.</a> · <a href=\"https://profiles.wordpress.org/richtabor/\">Rich Tabor</a> · <a href=\"https://profiles.wordpress.org/rinkalpagdar/\">Rinkal Pagdar</a> · <a href=\"https://profiles.wordpress.org/rishabhwp/\">Rishabh Gupta</a> · <a href=\"https://profiles.wordpress.org/rishavdutta/\">Rishav Dutta</a> · <a href=\"https://profiles.wordpress.org/rcreators/\">Rishi Mehta</a> · <a href=\"https://profiles.wordpress.org/rishit30g/\">Rishit Gupta</a> · <a href=\"https://profiles.wordpress.org/shibleemehdi/\">RM Shiblee Mehdi</a> · <a href=\"https://profiles.wordpress.org/noisysocks/\">Robert Anderson</a> · <a href=\"https://profiles.wordpress.org/miqrogroove/\">Robert Chapin</a> · <a href=\"https://profiles.wordpress.org/sanchothefat/\">Robert O’Rourke</a> · <a href=\"https://profiles.wordpress.org/robinvandervliet/\">Robin van der Vliet</a> · <a href=\"https://profiles.wordpress.org/rodrigosprimo/\">Rodrigo Primo</a> · <a href=\"https://profiles.wordpress.org/geekofshire/\">Rohan Jha</a> · <a href=\"https://profiles.wordpress.org/rollybueno/\">Rolly Bueno</a> · <a href=\"https://profiles.wordpress.org/romainmrhenry/\">Romain Menke</a> · <a href=\"https://profiles.wordpress.org/burtrw/\">Ronnie Burt</a> · <a href=\"https://profiles.wordpress.org/roytanck/\">Roy Tanck</a> · <a href=\"https://profiles.wordpress.org/rutujaparamane2004/\">Rutuja Paramane</a> · <a href=\"https://profiles.wordpress.org/rutviksavsani/\">Rutvik Savsani</a> · <a href=\"https://profiles.wordpress.org/welcher/\">Ryan Welcher</a> · <a href=\"https://profiles.wordpress.org/soean/\">Sören Wünsch</a> · <a href=\"https://profiles.wordpress.org/sachinrajcp123/\">SACHINRAJ CP</a> · <a href=\"https://profiles.wordpress.org/sagardeshmukh/\">Sagar Deshmukh</a> · <a href=\"https://profiles.wordpress.org/sagarjadhav/\">Sagar Jadhav</a> · <a href=\"https://profiles.wordpress.org/sagarladani/\">Sagar Ladani</a> · <a href=\"https://profiles.wordpress.org/sageth/\">Sageth</a> · <a href=\"https://profiles.wordpress.org/sainathpoojary/\">Sainath Poojary</a> · <a href=\"https://profiles.wordpress.org/sajjad67/\">Sajjad Hossain Sagor</a> · <a href=\"https://profiles.wordpress.org/salcode/\">Sal Ferrarello</a> · <a href=\"https://profiles.wordpress.org/samueljseay/\">Sam</a> · <a href=\"https://profiles.wordpress.org/samiamnot/\">samiamnot</a> · <a href=\"https://profiles.wordpress.org/viralsampat/\">Sampat Viral</a> · <a href=\"https://profiles.wordpress.org/sandeepdahiya/\">Sandeep Dahiya</a> · <a href=\"https://profiles.wordpress.org/sandipsinh007/\">Sandip Sinh</a> · <a href=\"https://profiles.wordpress.org/sandipmaurya2611/\">sandipmaurya2611</a> · <a href=\"https://profiles.wordpress.org/andrewssanya/\">SAndrew</a> · <a href=\"https://profiles.wordpress.org/sanketparmar/\">Sanket Parmar</a> · <a href=\"https://profiles.wordpress.org/sarayourfriend/\">Sara</a> · <a href=\"https://profiles.wordpress.org/mikachan/\">Sarah Norris</a> · <a href=\"https://profiles.wordpress.org/tinkerbelly/\">sarah semark</a> · <a href=\"https://profiles.wordpress.org/saranshsinha/\">Saransh Sinha</a> · <a href=\"https://profiles.wordpress.org/saratheonline/\">Sarath E</a> · <a href=\"https://profiles.wordpress.org/sarthak8858/\">Sarthak Jaiswal</a> · <a href=\"https://profiles.wordpress.org/sfougnier/\">Saul Fougnier</a> · <a href=\"https://profiles.wordpress.org/saurabhdhariwal/\">saurabh.dhariwal</a> · <a href=\"https://profiles.wordpress.org/saxonafletcher/\">Saxon Fletcher</a> · <a href=\"https://profiles.wordpress.org/sc0ttkclark/\">Scott Kingsley Clark</a> · <a href=\"https://profiles.wordpress.org/scribu/\">scribu</a> · <a href=\"https://profiles.wordpress.org/seanwei/\">Sean Wei</a> · <a href=\"https://profiles.wordpress.org/sergeybiryukov/\">Sergey Biryukov</a> · <a href=\"https://profiles.wordpress.org/vyatka/\">Sergey Mochalov</a> · <a href=\"https://profiles.wordpress.org/smrubenstein/\">Seth Rubenstein</a> · <a href=\"https://profiles.wordpress.org/shadyvb/\">Shadi Sharaf</a> · <a href=\"https://profiles.wordpress.org/ferdoused/\">Shahi Ferdous</a> · <a href=\"https://profiles.wordpress.org/shailu25/\">Shail Mehta</a> · <a href=\"https://profiles.wordpress.org/sh4lin/\">Shalin Shah</a> · <a href=\"https://profiles.wordpress.org/shanemac10/\">shanemac10</a> · <a href=\"https://profiles.wordpress.org/shekh0109/\">Shashank Shekhar</a> · <a href=\"https://profiles.wordpress.org/shatrumyatra/\">Shatrughan Myatra</a> · <a href=\"https://profiles.wordpress.org/shaunandrews/\">shaunandrews</a> · <a href=\"https://profiles.wordpress.org/sajib1223/\">Shazzad Hossain Khan</a> · <a href=\"https://profiles.wordpress.org/shekharnwagh/\">shekharnwagh</a> · <a href=\"https://profiles.wordpress.org/whiteshadow01/\">Shivam Jha</a> · <a href=\"https://profiles.wordpress.org/showravhasan/\">Showrav Hasan</a> · <a href=\"https://profiles.wordpress.org/shreya0shrivastava/\">Shreya Shrivastava</a> · <a href=\"https://profiles.wordpress.org/shubhtoy/\">Shubh Mittal</a> · <a href=\"https://profiles.wordpress.org/sidhanttomar/\">Sidhant Tomar</a> · <a href=\"https://profiles.wordpress.org/sidharthpandita/\">sidharthpandita</a> · <a href=\"https://profiles.wordpress.org/silaskoehler/\">Silas Kﾃｶhler</a> · <a href=\"https://profiles.wordpress.org/siliconforks/\">siliconforks</a> · <a href=\"https://profiles.wordpress.org/silvanarnet/\">silvanarnet</a> · <a href=\"https://profiles.wordpress.org/sky_76/\">sky_76</a> · <a href=\"https://profiles.wordpress.org/skylarkcob/\">skylarkcob</a> · <a href=\"https://profiles.wordpress.org/sourabhjain/\">Sourabh Jain</a> · <a href=\"https://profiles.wordpress.org/sourav08/\">Sourav Pahwa</a> · <a href=\"https://profiles.wordpress.org/soyebsalar01/\">Soyeb Salar</a> · <a href=\"https://profiles.wordpress.org/spencerfinnell/\">Spencer Finnell</a> · <a href=\"https://profiles.wordpress.org/emptyopssphere/\">Sphere Plugins</a> · <a href=\"https://profiles.wordpress.org/metodiew/\">Stanko Metodiev</a> · <a href=\"https://profiles.wordpress.org/hubersen/\">Stefan Pasch</a> · <a href=\"https://profiles.wordpress.org/stefanvelthuys/\">Stefan Velthuys</a> · <a href=\"https://profiles.wordpress.org/stefanfisk/\">stefanfisk</a> · <a href=\"https://profiles.wordpress.org/ryokuhi/\">Stefano Minoia</a> · <a href=\"https://profiles.wordpress.org/sabernhardt/\">Stephen Bernhardt</a> · <a href=\"https://profiles.wordpress.org/netweb/\">Stephen Edgar</a> · <a href=\"https://profiles.wordpress.org/stevejburge/\">Steve Burge</a> · <a href=\"https://profiles.wordpress.org/dufresnesteven/\">Steve Dufresne</a> · <a href=\"https://profiles.wordpress.org/stoyangeorgiev/\">Stoyan Georgiev</a> · <a href=\"https://profiles.wordpress.org/strarsis/\">strarsis</a> · <a href=\"https://profiles.wordpress.org/aquarius/\">Stuart Langridge</a> · <a href=\"https://profiles.wordpress.org/studiomondiale/\">studio_m</a> · <a href=\"https://profiles.wordpress.org/styankov/\">styankov</a> · <a href=\"https://profiles.wordpress.org/subrataemfluence/\">Subrata Sarkar</a> · <a href=\"https://profiles.wordpress.org/suhel5047/\">Suhel-Shaikh-Mohammad</a> · <a href=\"https://profiles.wordpress.org/sukhendu2002/\">Sukhendu Sekhar Guria</a> · <a href=\"https://profiles.wordpress.org/sumitsingh/\">Sumit Singh</a> · <a href=\"https://profiles.wordpress.org/sunyatasattva/\">sunyatasattva (a11n)</a> · <a href=\"https://profiles.wordpress.org/susiyanti/\">susiyanti</a> · <a href=\"https://profiles.wordpress.org/swanandm/\">Swanand M</a> · <a href=\"https://profiles.wordpress.org/swoyamjeetcodes/\">swoyamjeetcodes</a> · <a href=\"https://profiles.wordpress.org/cybr/\">Sybre Waaijer</a> · <a href=\"https://profiles.wordpress.org/sergiomdgomes/\">Sﾃｩrgio Gomes</a> · <a href=\"https://profiles.wordpress.org/tainacan/\">tainacan</a> · <a href=\"https://profiles.wordpress.org/iamtakashi/\">Takashi Irie</a> · <a href=\"https://profiles.wordpress.org/inc2734/\">Takashi Kitajima</a> · <a href=\"https://profiles.wordpress.org/takshil/\">Takshil Kunadia</a> · <a href=\"https://profiles.wordpress.org/karmatosed/\">Tammie Lister</a> · <a href=\"https://profiles.wordpress.org/suhan2411/\">Tejas Gajjar</a> · <a href=\"https://profiles.wordpress.org/azora/\">the.pro</a> · <a href=\"https://profiles.wordpress.org/thejaymo/\">thejaymo</a> · <a href=\"https://profiles.wordpress.org/thelmachido/\">thelmachido a11n</a> · <a href=\"https://profiles.wordpress.org/themes-1/\">them.es</a> · <a href=\"https://profiles.wordpress.org/octotoot/\">TheViv</a> · <a href=\"https://profiles.wordpress.org/kraftner/\">Thomas Krﾃ､ftner</a> · <a href=\"https://profiles.wordpress.org/tfrommen/\">Thorsten Frommen</a> · <a href=\"https://profiles.wordpress.org/threadi/\">threadi</a> · <a href=\"https://profiles.wordpress.org/sippis/\">Timi Wahalahti</a> · <a href=\"https://profiles.wordpress.org/timothyblynjacobs/\">Timothy Jacobs</a> · <a href=\"https://profiles.wordpress.org/to/\">to</a> · <a href=\"https://profiles.wordpress.org/tobiasbg/\">Tobias Bﾃ､thge</a> · <a href=\"https://profiles.wordpress.org/themightymo/\">Toby Cryns (@themightymo)</a> · <a href=\"https://profiles.wordpress.org/tomauger/\">Tom Auger</a> · <a href=\"https://profiles.wordpress.org/shimotomoki/\">Tomoki Shimomura</a> · <a href=\"https://profiles.wordpress.org/skithund/\">Toni Viemerﾃｶ</a> · <a href=\"https://profiles.wordpress.org/hellofromtonya/\">Tonya Mork</a> · <a href=\"https://profiles.wordpress.org/zodiac1978/\">Torsten Landsiedel</a> · <a href=\"https://profiles.wordpress.org/spiraltee/\">Tosin Oguntuyi</a> · <a href=\"https://profiles.wordpress.org/truptikanzariya/\">Trupti Kanzariya</a> · <a href=\"https://profiles.wordpress.org/alerzhus/\">Tsvetan Tsvetanov</a> · <a href=\"https://profiles.wordpress.org/dinhtungdu/\">Tung Du</a> · <a href=\"https://profiles.wordpress.org/tule/\">TuomasL</a> · <a href=\"https://profiles.wordpress.org/tusharbharti/\">Tushar Bharti</a> · <a href=\"https://profiles.wordpress.org/tusharaddweb/\">Tushar Patel</a> · <a href=\"https://profiles.wordpress.org/ugyensupport/\">Ugyen Dorji</a> · <a href=\"https://profiles.wordpress.org/grapplerulrich/\">Ulrich</a> · <a href=\"https://profiles.wordpress.org/umeshnevase/\">Umesh Nevase</a> · <a href=\"https://profiles.wordpress.org/umeshsinghin/\">Umesh Singh</a> · <a href=\"https://profiles.wordpress.org/up1512001/\">up1512001</a> · <a href=\"https://profiles.wordpress.org/utsavladani/\">Utsav Ladani</a> · <a href=\"https://profiles.wordpress.org/valentingrenier/\">Valentin Grenier</a> · <a href=\"https://profiles.wordpress.org/vanonsopensource/\">Van Ons Open Source</a> · <a href=\"https://profiles.wordpress.org/twvania/\">Vania</a> · <a href=\"https://profiles.wordpress.org/vascobaiao/\">Vasco Daniel Baiﾃ｣o</a> · <a href=\"https://profiles.wordpress.org/supernovia/\">Velda</a> · <a href=\"https://profiles.wordpress.org/vgnavada/\">vgnavada</a> · <a href=\"https://profiles.wordpress.org/vietcgi/\">vietcgi</a> · <a href=\"https://profiles.wordpress.org/szepeviktor/\">Viktor Szﾃｩpe</a> · <a href=\"https://profiles.wordpress.org/vincentbreton/\">Vincent Breton</a> · <a href=\"https://profiles.wordpress.org/vipulgupta003/\">Vipul Gupta</a> · <a href=\"https://profiles.wordpress.org/vishalkakadiya/\">Vishal Kakadiya</a> · <a href=\"https://profiles.wordpress.org/vishitshah/\">Vishit Shah</a> · <a href=\"https://profiles.wordpress.org/vishnuprajapat/\">vishnu prajapat</a> · <a href=\"https://profiles.wordpress.org/vrishabhsk/\">Vrishabh Jasani</a> · <a href=\"https://profiles.wordpress.org/george9/\">webtasky</a> · <a href=\"https://profiles.wordpress.org/gauri87/\">WebTechee</a> · <a href=\"https://profiles.wordpress.org/westonruter/\">Weston Ruter</a> · <a href=\"https://profiles.wordpress.org/wfmattr/\">WFMattR</a> · <a href=\"https://profiles.wordpress.org/skorasaurus/\">Will Skora</a> · <a href=\"https://profiles.wordpress.org/wiuempe/\">wiuempe</a> · <a href=\"https://profiles.wordpress.org/wolf45/\">wolf45</a> · <a href=\"https://profiles.wordpress.org/wongjn/\">wongjn</a> · <a href=\"https://profiles.wordpress.org/wpexplorer/\">wpexplorer</a> · <a href=\"https://profiles.wordpress.org/wpsoul/\">wpsoul</a> · <a href=\"https://profiles.wordpress.org/wraithkenny/\">WraithKenny</a> · <a href=\"https://profiles.wordpress.org/xate/\">xate</a> · <a href=\"https://profiles.wordpress.org/xavilc/\">xavilc</a> · <a href=\"https://profiles.wordpress.org/xwolf/\">xwolf</a> · <a href=\"https://profiles.wordpress.org/yagniksangani/\">Yagnik Sangani</a> · <a href=\"https://profiles.wordpress.org/yguyon/\">Yannis Guyon</a> · <a href=\"https://profiles.wordpress.org/getsyash/\">Yash B</a> · <a href=\"https://profiles.wordpress.org/yashjawale/\">Yash Jawale</a> · <a href=\"https://profiles.wordpress.org/yogeshbhutkar/\">Yogesh Bhutkar</a> · <a href=\"https://profiles.wordpress.org/yusufmudagal/\">Yusuf Mudagal</a> · <a href=\"https://profiles.wordpress.org/zoe20/\">zoe20</a> · <a href=\"https://profiles.wordpress.org/lstraczynski/\">Łukasz Strączyński</a></p>\n\n\n\n<p class=\"wp-block-paragraph\">Mais de <a href=\"https://translate.wordpress.org/stats/\">70 locais traduziram totalmente</a> o WordPress 7.0 para o seu idioma. Tradutores comunitários estão trabalhando duro para garantir que mais traduções estejam a caminho. Agradecemos a todos que ajudam a disponibilizar o WordPress em mais de 200 idiomas.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Agradecemos também aos <a href=\"https://make.wordpress.org/hosting/test-results/\">mais de 21 hosts da web</a> que testaram versões de pré-lançamento para o WordPress 7.0, ajudando a garantir que o WordPress e as plataformas de hospedagem sejam totalmente compatíveis, livres de erros e otimizados para a melhor experiência possível do usuário.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Por último, mas não menos importante, agradecemos aos voluntários que contribuem para os <a href=\"https://wordpress.org/support/forums/\">fóruns de suporte</a>, respondendo a perguntas de usuários do WordPress em todo o mundo.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Envolva-se</h2>\n\n\n\n<p class=\"wp-block-paragraph\">A participação no WordPress vai muito além da codificação. E aprender mais e se envolver é fácil. Descubra as equipes que se reúnem para <a href=\"https://make.wordpress.org/\">fazer WordPress</a> e use <a href=\"https://make.wordpress.org/contribute/\">esta ferramenta interativa</a> para ajudá-lo a decidir qual é o ideal para você.</p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"3528\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:7;a:6:{s:4:\"data\";s:73:\"\n		\n		\n					\n		\n		\n		\n				\n		\n\n					\n										\n					\n					\n			\n		\n		\n			\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:6:{s:0:\"\";a:7:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:73:\"Conheça na prática o WordPress 7.0: 1º Encontro Nacional da Comunidade\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:106:\"https://br.wordpress.org/2026/05/18/conheca-na-pratica-o-wordpress-7-0-1o-encontro-nacional-da-comunidade/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:114:\"https://br.wordpress.org/2026/05/18/conheca-na-pratica-o-wordpress-7-0-1o-encontro-nacional-da-comunidade/#respond\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 18 May 2026 17:06:38 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:7:\"Meetups\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://br.wordpress.org/?p=3523\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:347:\"No dia 20 de maio, das 19h30 às 21h (horário de Brasília), vamos nos reunir para o primeiro encontro nacional do WordPress Brasil Meetup Online. O evento vai celebrar o lançamento do WordPress 7.0 e mostrar como as novidades dessa versão vão facilitar o nosso trabalho. Um dos destaques desta atualização é a integração nativa [&#8230;]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Daniel Kossmann\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:3538:\"\n<p class=\"wp-block-paragraph\">No dia 20 de maio, das 19h30 às 21h (horário de Brasília), vamos nos reunir para o <a href=\"https://www.meetup.com/brasil-wordpress-meetup/events/314761130/?eventOrigin=group_upcoming_events\">primeiro encontro nacional do WordPress Brasil Meetup Online</a>. O evento vai celebrar o lançamento do WordPress 7.0 e mostrar como as novidades dessa versão vão facilitar o nosso trabalho.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Um dos destaques desta atualização é a integração nativa com Inteligência Artificial, facilitando o uso e o desenvolvimento de soluções que utilizam esta tecnologia. Durante o evento, vamos mostrar na prática o funcionamento desta integração e passar referências para quem quer aprender a desenvolver seus próprios plugin utilizando esta integração.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https://www.meetup.com/brasil-wordpress-meetup/events/314761130/?eventOrigin=group_upcoming_events\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https://br.wordpress.org/files/2026/05/Online-Workshop-1024x576.png\" alt=\"1º Encontro Nacional da Comunidade\" class=\"wp-image-3525\" srcset=\"https://br.wordpress.org/files/2026/05/Online-Workshop-1024x576.png 1024w, https://br.wordpress.org/files/2026/05/Online-Workshop-300x169.png 300w, https://br.wordpress.org/files/2026/05/Online-Workshop-768x432.png 768w, https://br.wordpress.org/files/2026/05/Online-Workshop-1536x864.png 1536w, https://br.wordpress.org/files/2026/05/Online-Workshop.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" /></a></figure>\n\n\n\n<h2 class=\"wp-block-heading\">Como será o formato do evento?</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Várias pessoas da comunidade brasileira vão compartilhar a tela e mostrar como essas novidades funcionam no dia a dia. O conteúdo foi pensado para todos os níveis de conhecimento:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se você é iniciante ou usuário, vai ver como as novas ferramentas facilitam a criação e gestão do site e do conteúdo.</li>\n\n\n\n<li>Se você é desenvolvedor, vai entender as melhorias na estrutura do WordPress para criar novas soluções.</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">Queremos que o encontro seja um espaço seguro para tirar dúvidas e trocar ideias, com um tom de conversa mesmo. Por isso, assim como fizemos no <a href=\"https://www.meetup.com/wordpressbelohorizonte/events/313252000/?eventOrigin=group_events_list\">45º Meetup de BH</a>, o evento não será gravado. A ideia é que todo mundo se sinta à vontade para participar, fazer perguntas e conhecer outras pessoas da comunidade.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Origem do evento e próximos passos</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Essa iniciativa nasceu de conversas que tivemos no <a href=\"https://brasil.wordcamp.org/2025/\">WordCamp Brasil 2025</a>. O nosso objetivo é unir quem usa WordPress no país inteiro, democratizar o conhecimento e também dar força aos grupos locais da comunidade.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos realizar esses encontros todos os meses, sempre trazendo exemplos reais de como as pessoas estão usando o WordPress.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Se você quer aprender junto com a gente, tirar suas dúvidas e compartilhar experiências, inscreva-se na <a href=\"https://www.meetup.com/brasil-wordpress-meetup/\">página da comunidade WordPress Brasil Meetup Online</a>. Assim, você recebe o link de acesso do evento e fica sabendo dos próximos encontros!</p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:36:\"http://wellformedweb.org/CommentAPI/\";a:1:{s:10:\"commentRss\";a:1:{i:0;a:5:{s:4:\"data\";s:111:\"https://br.wordpress.org/2026/05/18/conheca-na-pratica-o-wordpress-7-0-1o-encontro-nacional-da-comunidade/feed/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:38:\"http://purl.org/rss/1.0/modules/slash/\";a:1:{s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:1:\"0\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"3523\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:8;a:6:{s:4:\"data\";s:76:\"\n		\n		\n					\n		\n		\n		\n				\n		\n		\n\n					\n										\n					\n					\n			\n		\n		\n			\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:6:{s:0:\"\";a:7:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:49:\"Apresentando a API de Conectores no WordPress 7.0\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:86:\"https://br.wordpress.org/2026/05/15/apresentando-a-api-de-conectores-no-wordpress-7-0/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:94:\"https://br.wordpress.org/2026/05/15/apresentando-a-api-de-conectores-no-wordpress-7-0/#respond\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 15 May 2026 19:10:20 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:5:\"Geral\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:3:\"7.0\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://br.wordpress.org/?p=3518\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:362:\"O WordPress 7.0 apresenta a API de Conectores, uma nova estrutura para registrar e gerenciar conexões com serviços externos. O foco inicial está nos provedores de IA, oferecendo ao WordPress uma forma padronizada de gerenciar chaves de API, descobrir provedores e configurar serviços de IA na interface administrativa. Este post explica o que a API [&#8230;]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Fellyph Cintra\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:15504:\"\n<p class=\"wp-block-paragraph\">O WordPress 7.0 apresenta a API de Conectores, uma nova estrutura para registrar e gerenciar conexões com serviços externos. O foco inicial está nos provedores de IA, oferecendo ao WordPress uma forma padronizada de gerenciar chaves de API, descobrir provedores e configurar serviços de IA na interface administrativa.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Este post explica o que a API de Conectores faz, como ela funciona internamente e o que os desenvolvedores de plugins precisam saber.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Sumário</h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>O que é um conector?</li>\n\n\n\n<li>Como os provedores de IA são descobertos automaticamente</li>\n\n\n\n<li>A tela de administração Configurações &gt; Conectores</li>\n\n\n\n<li>Autenticação e gerenciamento de chaves de API</li>\n\n\n\n<li>Funções públicas da API</li>\n\n\n\n<li>Sobrescrita de metadados de conectores</li>\n\n\n\n<li>O ciclo de vida da inicialização</li>\n\n\n\n<li>Próximos passos</li>\n</ul>\n\n\n\n<h2 class=\"wp-block-heading\">O que é um conector?</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Um conector representa uma conexão com um serviço externo. Cada conector carrega metadados padronizados: um nome de exibição, uma descrição, um logotipo, uma configuração de autenticação e uma associação opcional a um plugin do WordPress.org. O sistema atualmente se concentra em provedores que autenticam com uma chave de API, mas a arquitetura foi projetada para oferecer suporte a outros tipos de conectores em lançamentos futuros.</p>\n\n\n\n<p class=\"wp-block-paragraph\">O WordPress 7.0 vem com três conectores em destaque, Anthropic, Google e OpenAI, acessíveis pela nova tela Configurações <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">→</span> Conectores, tornando a instalação fluida.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Cada conector é armazenado como um array associativo com a seguinte estrutura:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\narray(\n    &#039;name&#039;           =&gt; &#039;Anthropic&#039;,\n    &#039;description&#039;    =&gt; &#039;Text generation with Claude.&#039;,\n    &#039;logo_url&#039;       =&gt; &#039;https://example.com/anthropic-logo.svg&#039;,\n    &#039;type&#039;           =&gt; &#039;ai_provider&#039;,\n    &#039;authentication&#039; =&gt; array(\n        &#039;method&#039;          =&gt; &#039;api_key&#039;,\n        &#039;credentials_url&#039; =&gt; &#039;https://platform.claude.com/settings/keys&#039;,\n        &#039;setting_name&#039;    =&gt; &#039;connectors_ai_anthropic_api_key&#039;,\n    ),\n    &#039;plugin&#039;         =&gt; array(\n        &#039;file&#039; =&gt; &#039;ai-provider-for-anthropic/plugin.php&#039;,\n    ),\n)\n</pre></div>\n\n\n<h2 class=\"wp-block-heading\">Como os provedores de IA são descobertos automaticamente</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Se você está criando um plugin de provedor de IA que se integra ao WP AI Client, não precisa registrar um conector manualmente. A API de Conectores identifica automaticamente os provedores com base no registro padrão do WP AI Client e cria conectores com os metadados corretos.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Veja o que acontece durante a inicialização:</p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Os conectores nativos (Anthropic, Google, OpenAI) são registrados com padrões definidos diretamente no código.</li>\n\n\n\n<li>O sistema consulta <code>AiClient::defaultRegistry()</code> para obter todos os provedores registrados.</li>\n\n\n\n<li>Para cada provedor, os metadados (nome, descrição, logotipo, método de autenticação) são mesclados aos padrões, com os valores do registro do provedor tendo precedência.</li>\n\n\n\n<li>A ação <code>wp_connectors_init</code> é disparada para que plugins possam sobrescrever metadados ou registrar conectores adicionais.</li>\n</ol>\n\n\n\n<p class=\"wp-block-paragraph\">Em resumo: se o seu plugin de provedor de IA se registra no WP AI Client, o conector é criado para você. Nenhum código adicional é necessário.</p>\n\n\n\n<h2 class=\"wp-block-heading\">A tela de administração Configurações &gt; Conectores</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Os conectores registrados aparecem em uma nova tela de administração: Configurações &gt; Conectores. A tela renderiza cada conector como um cartão, e os dados do registro determinam o que é exibido:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>name</code>, <code>description</code> e <code>logo_url</code> são exibidos no cartão.</li>\n\n\n\n<li><code>plugin.file</code>: o valor é o caminho do arquivo principal do plugin em relação ao diretório de plugins (por exemplo, <code>akismet/akismet.php</code> ou <code>hello.php</code>). A tela usa esse valor para verificar se o plugin associado está instalado e ativo, e mostra o botão de ação apropriado.</li>\n\n\n\n<li><code>authentication.credentials_url</code> é renderizado como um link que direciona os usuários ao site do provedor para obter credenciais de API.</li>\n\n\n\n<li>Para conectores <code>api_key</code>, a tela mostra a origem atual da chave (variável de ambiente, constante PHP ou banco de dados) e o status da conexão.</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">Conectores com outros métodos de autenticação são armazenados no registro PHP e expostos pelos dados do módulo de script, mas atualmente, exigem um registro de JavaScript no lado do cliente para uma interface personalizada no frontend.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Autenticação e gerenciamento de chaves de API</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Os conectores oferecem suporte a dois métodos de autenticação:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>api_key</code>: exige uma chave de API, que pode ser fornecida por variável de ambiente, constante PHP ou banco de dados (verificadas nessa ordem).</li>\n\n\n\n<li><code>none</code>: nenhuma autenticação é necessária.</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">O método de autenticação (<code>api_key</code> ou <code>none</code>) é determinado pelos metadados de autenticação registrados com o conector. Para provedores que usam <code>api_key</code>, um nome de configuração no banco de dados é gerado automaticamente usando o padrão <code>connectors_{$provider_type}_{$provider_id}_api_key</code>. Também é possível definir um nome personalizado usando a propriedade <code>setting_name</code>. As chaves de API armazenadas no banco de dados não são criptografadas, mas são mascaradas na interface do usuário.</p>\n\n\n\n<p class=\"wp-block-paragraph\">A criptografia está sendo explorada em um ticket de acompanhamento: <a href=\"https://core.trac.wordpress.org/ticket/64789\">#64789</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Para provedores de IA, há uma convenção de nomenclatura específica para variáveis de ambiente e constantes PHP: <code>{PROVIDER_ID}_API_KEY</code> (por exemplo, o provedor <code>anthropic</code> é mapeado para <code>ANTHROPIC_API_KEY</code>). Para outros tipos de provedores, uma variável de ambiente (<code>env_var_name</code>) e uma constante PHP (<code>constant_name</code>) podem ser opcionalmente definidas com qualquer valor.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Prioridade da origem da chave de API</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para conectores <code>api_key</code>, o sistema procura um valor de configuração nesta ordem:</p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Variável de ambiente, por exemplo, <code>ANTHROPIC_API_KEY</code></li>\n\n\n\n<li>Constante PHP, por exemplo, <code>define( \'ANTHROPIC_API_KEY\', \'sk-...\' );</code></li>\n\n\n\n<li>Banco de dados, armazenado pela tela de administração, por exemplo, a configuração <code>connectors_ai_anthropic_api_key</code></li>\n</ol>\n\n\n\n<h2 class=\"wp-block-heading\">Funções públicas da API</h2>\n\n\n\n<p class=\"wp-block-paragraph\">A API de Conectores fornece três funções públicas para consultar o registro. Elas ficam disponíveis após <code>init</code>.</p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>wp_is_connector_registered()</code></h3>\n\n\n\n<p class=\"wp-block-paragraph\">Verifica se um conector está registrado:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\nif ( wp_is_connector_registered( &#039;anthropic&#039; ) ) {\n    // The Anthropic connector is available.\n}\n</pre></div>\n\n\n<h3 class=\"wp-block-heading\"><code>wp_get_connector()</code></h3>\n\n\n\n<p class=\"wp-block-paragraph\">Recupera os dados de um único conector:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n$connector = wp_get_connector( &#039;anthropic&#039; );\nif ( $connector ) {\n    echo $connector&#x5B;&#039;name&#039;]; // &#039;Anthropic&#039;\n}\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">Retorna um array associativo com as chaves: <code>name</code>, <code>description</code>, <code>type</code>, <code>authentication</code> e, opcionalmente, <code>logo_url</code> e <code>plugin</code>. Retorna <code>null</code> se o conector não estiver registrado.</p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>wp_get_connectors()</code></h3>\n\n\n\n<p class=\"wp-block-paragraph\">Recupera todos os conectores registrados, indexados pelo ID do conector:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\n$connectors = wp_get_connectors();\nforeach ( $connectors as $id =&gt; $connector ) {\n    printf( &#039;{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s: {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s&#039;, $connector&#x5B;&#039;name&#039;], $connector&#x5B;&#039;description&#039;] );\n}\n</pre></div>\n\n\n<h2 class=\"wp-block-heading\">Sobrescrita de metadados de conectores</h2>\n\n\n\n<p class=\"wp-block-paragraph\">A ação <code>wp_connectors_init</code> é disparada depois que todos os conectores nativos e descobertos automaticamente foram registrados. Plugins podem usar esse hook para sobrescrever metadados em conectores existentes.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Como o registro rejeita IDs duplicados, a sobrescrita exige uma sequência para remover o conector do registro, modificar e registrar novamente:</p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: php; title: ; notranslate\">\nadd_action( &#039;wp_connectors_init&#039;, function ( WP_Connector_Registry $registry ) {\n    if ( $registry-&gt;is_registered( &#039;anthropic&#039; ) ) {\n        $connector = $registry-&gt;unregister( &#039;anthropic&#039; );\n        $connector&#x5B;&#039;description&#039;] = __( &#039;Custom description for Anthropic.&#039;, &#039;my-plugin&#039; );\n        $registry-&gt;register( &#039;anthropic&#039;, $connector );\n    }\n} );\n</pre></div>\n\n\n<p class=\"wp-block-paragraph\">Pontos importantes sobre o padrão de sobrescrita:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sempre verifique <code>is_registered()</code> antes de chamar <code>unregister()</code>: chamar <code>unregister()</code> em um conector inexistente dispara um aviso <code>_doing_it_wrong()</code>.</li>\n\n\n\n<li><code>unregister()</code> retorna os dados do conector, que você pode modificar e passar de volta para <code>register()</code>.</li>\n\n\n\n<li>IDs de conectores precisam corresponder ao padrão <code>/^[a-z0-9_-]+$/</code> (somente letras minúsculas, números, sublinhados e hífens).</li>\n</ul>\n\n\n\n<h3 class=\"wp-block-heading\">Métodos do registro</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dentro do callback de <code>wp_connectors_init</code>, a instância de <code>WP_Connector_Registry</code> fornece estes métodos:</p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Método</th><th>Descrição</th></tr></thead><tbody><tr><td><code>register( $id, $args )</code></td><td>Registra um novo conector. Retorna os dados do conector ou <code>null</code> em caso de falha.</td></tr><tr><td><code>unregister( $id )</code></td><td>Remove um conector e retorna seus dados. Retorna <code>null</code> se não for encontrado.</td></tr><tr><td><code>is_registered( $id )</code></td><td>Verifica se um conector existe.</td></tr><tr><td><code>get_registered( $id )</code></td><td>Recupera os dados de um único conector.</td></tr><tr><td><code>get_all_registered()</code></td><td>Recupera todos os conectores registrados.</td></tr></tbody></table></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Fora do callback de <code>wp_connectors_init</code>, use as funções públicas da API (<code>wp_get_connector()</code>, <code>wp_get_connectors()</code>, <code>wp_is_connector_registered()</code>) em vez de acessar o registro diretamente.</p>\n\n\n\n<h2 class=\"wp-block-heading\">O ciclo de vida da inicialização</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Entender a sequência de inicialização ajuda a decidir onde usar hooks:</p>\n\n\n\n<p class=\"wp-block-paragraph\">Durante a ação <code>init</code>, <code>_wp_connectors_init()</code> é executada e:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cria o singleton de <code>WP_Connector_Registry</code>.</li>\n\n\n\n<li>Registra conectores nativos (Anthropic, Google, OpenAI) com padrões definidos diretamente no código.</li>\n\n\n\n<li>Descobre automaticamente provedores a partir do registro do WP AI Client e mescla seus metadados sobre os padrões.</li>\n\n\n\n<li>Dispara a ação <code>wp_connectors_init</code>, que é onde plugins sobrescrevem metadados ou registram conectores adicionais.</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">A ação <code>wp_connectors_init</code> é o único ponto de entrada compatível para modificar o registro. Tentar definir a instância do registro fora de <code>init</code> dispara um aviso <code>_doing_it_wrong()</code>.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Próximos passos</h2>\n\n\n\n<p class=\"wp-block-paragraph\">A API de Conectores no WordPress 7.0 foi otimizada para provedores de IA, mas a arquitetura subjacente foi projetada para crescer. Atualmente, apenas conectores com autenticação <code>api_key</code> recebem o tratamento completo na interface de administração. O registro PHP já aceita qualquer tipo de conector, o que falta é a integração de frontend para conectores com mecanismos de autenticação diferentes.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Espera-se que lançamentos futuros:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Expandam o suporte para outros métodos de autenticação além de <code>api_key</code> e <code>none</code>.</li>\n\n\n\n<li>Ofereçam mais integrações nativas de interface além de <code>api_key</code>.</li>\n\n\n\n<li>Forneçam uma API de registro JavaScript no lado do cliente para interfaces personalizadas de conectores.</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">Quando esses recursos estiverem disponíveis, a ação <code>wp_connectors_init</code> será o hook principal para registrar novos tipos de conectores.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<p class=\"wp-block-paragraph\"><em>Props a <a href=\"https://profiles.wordpress.org/jorgefilipecosta/\">@jorgefilipecosta</a>, <a href=\"https://profiles.wordpress.org/shaunandrews/\">@shaunandrews</a>, <a href=\"https://profiles.wordpress.org/flixos90/\">@flixos90</a>, <a href=\"https://profiles.wordpress.org/westonruter/\">@westonruter</a>, <a href=\"https://profiles.wordpress.org/justlevine/\">@justlevine</a> e outras pessoas por contribuírem para a tela de Conectores e para esta nota de desenvolvimento.</em></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://make.wordpress.org/core/tag/7-0/\">#7-0</a> <a href=\"https://make.wordpress.org/core/tag/dev-notes/\">#dev-notes</a> <a href=\"https://make.wordpress.org/core/tag/dev-notes-7-0/\">#dev-notes-7-0</a></p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:36:\"http://wellformedweb.org/CommentAPI/\";a:1:{s:10:\"commentRss\";a:1:{i:0;a:5:{s:4:\"data\";s:91:\"https://br.wordpress.org/2026/05/15/apresentando-a-api-de-conectores-no-wordpress-7-0/feed/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:38:\"http://purl.org/rss/1.0/modules/slash/\";a:1:{s:8:\"comments\";a:1:{i:0;a:5:{s:4:\"data\";s:1:\"0\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"3518\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:9;a:6:{s:4:\"data\";s:60:\"\n		\n		\n		\n		\n		\n				\n		\n		\n\n					\n										\n					\n		\n		\n			\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"WordPress 7.0 Release Candidate 4\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:70:\"https://br.wordpress.org/2026/05/14/wordpress-7-0-release-candidate-4/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 14 May 2026 17:17:52 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:12:\"Lançamentos\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:3:\"7.0\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://br.wordpress.org/?p=3514\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:92:\"O quarto Release Candidate (“RC4”) para WordPress 7.0 está pronto para baixar e testar!\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"Andre\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:6621:\"\n<p class=\"wp-block-paragraph\">O quarto Release Candidate (“RC4”) para WordPress 7.0 está pronto para baixar e testar!</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Esta versão do software WordPress está em desenvolvimento</strong>. <strong>Por favor, não instale, execute ou teste esta versão do WordPress em sites de produção ou de missão crítica.</strong> Em vez disso, recomenda-se que você avalie o RC4 em um servidor e site de teste.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Alcançar esta fase do ciclo de lançamento é um marco importante. Embora os candidatos de lançamento sejam considerados prontos para lançamento, os testes continuam sendo cruciais para garantir que tudo no WordPress 7.0 seja o melhor possível.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Você pode testar o WordPress 7.0 RC4 de quatro maneiras:</p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Plugin</strong></td><td>Instale e ative o plugin <a href=\"https://wordpress.org/plugins/wordpress-beta-tester/\">WordPress Beta Tester</a> em uma instalação do WordPress. (Selecione o canal “Bleeding edge” e “Beta/RC Only” stream.)</td></tr><tr><td><strong>Baixe diretamente</strong></td><td>Baixe a <a href=\"https://wordpress.org/wordpress-7.0-RC4.zip\">versão RC4 (zip)</a> e instale-a em um site WordPress.</td></tr><tr><td><strong>Linha de Comando</strong></td><td>Use este comando do <a href=\"https://make.wordpress.org/cli/\">WP-CLI</a>:<br><code>wp core update --version=7.0-</code>RC4</td></tr><tr><td><strong>WordPress Playground</strong></td><td>Use a <a href=\"https://playground.wordpress.net/?php=8.0&amp;wp=beta&amp;networking=no&amp;language=&amp;multisite=no&amp;random=y4q1rn88xn\">instância do WordPress Playground</a> para testar o software diretamente no seu navegador. Nenhuma configuração é necessária, basta clicar e testar!</td></tr></tbody></table></figure>\n\n\n\n<p class=\"wp-block-paragraph\">A data de lançamento final programada para o WordPress 7.0 é <strong>20 de maio de 2026</strong>. O <a href=\"https://make.wordpress.org/core/2026/04/22/wordpress-7-0-release-party-updated-schedule/\">cronograma de lançamento</a> completo pode ser encontrado <a href=\"https://make.wordpress.org/core/2026/04/22/wordpress-7-0-release-party-updated-schedule/\">aqui</a>. Sua ajuda para testar versões Beta e RC é vital para tornar esta versão o mais estável e poderosa possível. Agradecemos a todos que ajudam com os testes!</p>\n\n\n\n<p class=\"wp-block-paragraph\">Continue conferindo o <a href=\"https://make.wordpress.org/core/\">blog Make WordPress Core</a> para <a href=\"https://make.wordpress.org/core/tag/7-0\">posts relacionadas a versão 7.0</a> nas próximas semanas para obter mais informações.</p>\n\n\n\n<h2 class=\"wp-block-heading\">O que há no WordPress 7.0 RC4?</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Quer analisar mais profundamente os detalhes e as notas técnicas para este lançamento? Dê uma olhada no <a href=\"https://make.wordpress.org/core/2026/05/14/wordpress-7-0-field-guide/\">Guia de Campo do WordPress 7.0</a>. Para informações técnicas relacionadas com os problemas abordados desde a versão <a href=\"https://br.wordpress.org/2026/05/08/wordpress-7-0-release-candidate-3/\">RC3</a>, você pode navegar nos seguintes links:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https://core.trac.wordpress.org/query?status=closed&amp;changetime=05{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2F08{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2F2026..05{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2F14{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2F2026&amp;milestone=7.0&amp;group=component&amp;col=id&amp;col=summary&amp;col=milestone&amp;col=changetime&amp;col=type&amp;order=id\">Tíquetes fechados to Trac para o WordPress 7.0</a> desde 8 de maio de 2026.</li>\n\n\n\n<li><a href=\"https://github.com/WordPress/gutenberg/commits/wp/7.0?since=026-05-08&amp;until=2026-05-14\">Tíquetes do Gutenberg 7.0</a> desde 8 de maio de 2026.</li>\n</ul>\n\n\n\n<h2 class=\"wp-block-heading\">Como você pode contribuir</h2>\n\n\n\n<p class=\"wp-block-paragraph\">O WordPress é um software de código aberto possibilitado por uma comunidade apaixonada de pessoas que colaboram e contribuem para o seu desenvolvimento. Os recursos abaixo descrevem várias maneiras de se envolver com a plataforma web de código aberto mais popular do mundo, independentemente da sua experiência técnica.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Envolva-se em testes</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Testar problemas é crucial para o desenvolvimento de qualquer software. É também uma forma significativa de qualquer pessoa contribuir. Sua ajuda para testar a versão do WordPress 7.0 RC4 é fundamental para garantir que o lançamento final seja o melhor possível.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Este <a href=\"https://make.wordpress.org/test/2026/02/20/help-test-wordpress-7-0/\">guia detalhado</a> irá orientá-lo através de recursos de teste no WordPress 7.0.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Para aqueles que são novos em testes, siga <a href=\"https://make.wordpress.org/test/handbook/get-setup-for-testing/\">este guia geral de testes</a> para obter mais detalhes sobre como configurar.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Se você encontrar um erro ou problema em potencial, informe-o na <a href=\"https://wordpress.org/support/forum/alphabeta/\">área Alpha / Beta</a> dos fóruns de suporte ou diretamente no <a href=\"https://core.trac.wordpress.org/newticket\">WordPress Trac</a>, se você estiver confortável escrevendo um relatório de erros reproduzível. Você também pode verificar seu problema contra uma lista de <a href=\"https://core.trac.wordpress.org/tickets/major\">erros conhecidos</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Curioso sobre os lançamentos de testes em geral? Acompanhe as <a href=\"https://make.wordpress.org/test/\">iniciativas de teste no Make</a> e junte-se ao canal <a href=\"https://wordpress.slack.com/messages/core-test/\">#core-test</a> no <a href=\"https://wordpress.slack.com/\">Making WordPress Slack</a>.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Traduza o WordPress</h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://translate.wordpress.org/projects/wp/dev/pt-br/default/\">Ajude-nos a traduzir o WordPress para o português!</a>&nbsp;O lançamento dessa versão também significa que&nbsp;<a href=\"https://make.wordpress.org/polyglots/handbook/glossary/#hard-freeze\">novas strings para a tradução</a>&nbsp;da versão 7.0 serão evitadas.</p>\n\n\n\n<p class=\"has-text-align-right wp-block-paragraph\"><em>Agradecemos a <a href=\"https://profiles.wordpress.org/chaion07/\">@chaion07</a></em> <em>pela revisão do <a href=\"https://wordpress.org/news/2026/05/wordpress-7-0-release-candidate-4/\">post original</a>.</em></p>\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"3514\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}s:27:\"http://www.w3.org/2005/Atom\";a:1:{s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:0:\"\";s:7:\"attribs\";a:1:{s:0:\"\";a:3:{s:4:\"href\";s:35:\"https://br.wordpress.org/news/feed/\";s:3:\"rel\";s:4:\"self\";s:4:\"type\";s:19:\"application/rss+xml\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:44:\"http://purl.org/rss/1.0/modules/syndication/\";a:2:{s:12:\"updatePeriod\";a:1:{i:0;a:5:{s:4:\"data\";s:9:\"\n	hourly	\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:15:\"updateFrequency\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"\n	1	\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:4:\"site\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"13096052\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}}}}}}s:4:\"type\";i:128;s:7:\"headers\";a:11:{s:6:\"server\";s:5:\"nginx\";s:4:\"date\";s:29:\"Tue, 07 Jul 2026 00:06:34 GMT\";s:12:\"content-type\";s:34:\"application/rss+xml; charset=UTF-8\";s:4:\"vary\";s:37:\"Accept-Encoding, accept, content-type\";s:6:\"x-olaf\";s:3:\"⛄\";s:13:\"last-modified\";s:29:\"Mon, 06 Jul 2026 23:22:54 GMT\";s:4:\"link\";s:61:\"<https://br.wordpress.org/wp-json/>; rel=\"https://api.w.org/\"\";s:15:\"x-frame-options\";s:10:\"SAMEORIGIN\";s:16:\"content-encoding\";s:4:\"gzip\";s:7:\"alt-svc\";s:5:\"clear\";s:4:\"x-nc\";s:9:\"HIT dca 1\";}s:5:\"build\";i:1760654736;s:21:\"cache_expiration_time\";i:1783425994;s:23:\"__cache_expiration_time\";i:1783425994;}', 'off');
INSERT INTO `wp_options` VALUES ('997', '_site_transient_timeout_feed_d117b5738fbd35bd8c0391cda1f2b5d9', '1783425996', 'off');
INSERT INTO `wp_options` VALUES ('998', '_site_transient_feed_d117b5738fbd35bd8c0391cda1f2b5d9', 'a:6:{s:5:\"child\";a:1:{s:0:\"\";a:1:{s:3:\"rss\";a:1:{i:0;a:6:{s:4:\"data\";s:3:\"\n\n\n\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:7:\"version\";s:3:\"2.0\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:1:{s:7:\"channel\";a:1:{i:0;a:6:{s:4:\"data\";s:112:\"\n	\n	\n	\n	\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"WordPress Planet\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"http://planet.wordpress.org/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"language\";a:1:{i:0;a:5:{s:4:\"data\";s:2:\"en\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:47:\"WordPress Planet - http://planet.wordpress.org/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"item\";a:50:{i:0;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Matt: USA 250\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=153462\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://ma.tt/2026/07/usa-250/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2410:\"<p class=\"wp-block-paragraph\">This auspicious 250th Independence Day, I find myself thinking of what <a href=\"https://om.co/2013/08/13/iamerican/\">Om wrote in iAMerican when he became a US citizen in 2013</a>.</p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">On a globe, America is a landmass, a country. In an immigrant’s heart it is a belief that future is almost always better. It may not be perfect and it is certainly not equal, but it still is one of a kind — the only place where an absolute stranger with a funny name and a funny accent with no friends or contacts can show up, work hard and actually get to do what he was destined to do. [&#8230;]</p>\n\n\n\n<p class=\"wp-block-paragraph\">In most places in the world, outsiders like me don’t have that chance. That simple truth is what makes America so special. A chance – to be somebody even if you are nobody. America is a state of mind and I have opted-in!</p>\n</blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">I feel lucky to have been born here, and if I hadn&#8217;t been, I think I would have gotten here as fast as I could. I&#8217;m grateful to the public schools that educated me, the <a href=\"https://ma.tt/about/#teachers\">teachers</a> who pushed me, the internet that freed my mind, and the culture of risk and innovation in technology that <a href=\"https://ma.tt/2006/04/a-little-funding/\">invested a million dollars</a> in a 21-year-old dropout kid trying to <a href=\"https://automattic.com/\">build a company</a> around (but not replacing) <a href=\"https://wordpress.org/\">an Open Source project</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s not unimaginable that these things could have happened someplace else, but it would have been a long shot.</p>\n\n\n\n<p class=\"wp-block-paragraph\">On the lighter side, <a href=\"https://www.youtube.com/watch?v=JYqfVE-fykk\">SNL&#8217;s Washington&#8217;s Dream skit is one of their best ever</a>, <a href=\"https://www.youtube.com/watch?v=Q3RjZY-rSsc\">Google has a pretty funny commercial reimagining the Declaration being written</a>, and <a href=\"https://www.youtube.com/watch?v=ezs9h7Td8Zg\">another famous Matthew (McConaughey) gives a great 2-minute speech</a>. &#8220;We need skeptics. Yes, we do. We do not need cynics. One cares enough to question, which we should, and the other one&#8217;s already quit.&#8221;</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sun, 05 Jul 2026 06:59:52 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:1;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:61:\"Open Channels FM: Open Source as Foundation, Not Final Answer\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2556361\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:67:\"https://openchannels.fm/open-source-as-foundation-not-final-answer/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:175:\"In ecommerce, it’s not just about the tech but how it helps merchants grow. Open source can offer control and adaptability, especially with platforms like Woo and WordPress.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 02 Jul 2026 09:59:53 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:2;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:120:\"WPTavern: #223 – Ivana Ćirković on How WordPress Credits Bridges Education and Industry in the WordPress Ecosystem\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"https://wptavern.com/?post_type=podcast&p=206102\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:130:\"https://wptavern.com/podcast/223-ivana-cirkovic-on-how-wordpress-credits-bridges-education-and-industry-in-the-wordpress-ecosystem\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:38278:\"<details>Transcript<div>\n<p class=\"wp-block-paragraph\">[00:00:19] <strong>Nathan Wrigley:</strong> Welcome to the Jukebox Podcast from WP Tavern. My name is Nathan Wrigley.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Jukebox is a podcast which is dedicated to all things WordPress, the people, the events, the plugins, the blocks, the themes, and in this case how WordPress Credits bridges education and industry in the WordPress ecosystem.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;d like to subscribe to the podcast, you can do that by searching for WP Tavern in your podcast player of choice, or by going to wptavern.com/feed/podcast, and you can copy that URL into most podcast players.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you have a topic that you&#8217;d like us to feature on the podcast, I&#8217;m keen to hear from you and hopefully get you, or your idea, featured on the show. Head to wptavern.com/contact/jukebox and use the form there.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So on the podcast today we have Ivana Ćirković. Ivana is a digital marketer with 18 years of experience working both in and out of the tech industry, and currently leads marketing at WPBakery. She&#8217;s an active participant in WordPress events, having attended, and spoken at, numerous local and international word camps over the years.</p>\n\n\n\n<p class=\"wp-block-paragraph\">In this episode, our focus is on the WordPress Credits initiative. We learn how this program, launched by the WordPress Foundation, connects students with real world opportunities to contribute to the WordPress ecosystem, earn certifications, and increase their competitiveness in the job market.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Ivana discusses her own experience as a WP Credits mentor, working with students as they learn about digital marketing, remote work, and other open source contributions. We explore, how universities can modernise their curriculums, and real world value for students by participating in the initiative, and how businesses can get involved, not just to support the community, but to help shape and discover future talent.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The program&#8217;s evolving structure also gets attention, and we learn how students are guided through hands-on activities such as translation or documentation, and how their progress is tracked publicly via profiles on wordpress.org. Ivana shares the opportunities and challenges for both educators and businesses with thoughts on accountability, mentorship, and the need to bring new faces into the WordPress community.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re interested in the future of WordPress, education, or bridging the gap between academia and industry, this episode is for you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;d like to find out more, you can find all of the links in the show notes by heading to wptavern.com/podcast, where you&#8217;ll find all the other episodes as well.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And so without further delay, I bring you Ivana Ćirković.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I am joined on the podcast by Ivana Ćirković. Did I get that right?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:14] <strong>Ivana Ćirković:</strong> Yes. Excellent.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:16] <strong>Nathan Wrigley:</strong> Thank you. This is my first interview at WordCamp Europe 2026. I&#8217;m guessing because we&#8217;re on the first day of the event and it&#8217;s quite early in the morning, it&#8217;s 10 in the morning, I&#8217;m guessing you cannot have done your presentation yet?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:30] <strong>Ivana Ćirković:</strong> Not yet. Tomorrow.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:32] <strong>Nathan Wrigley:</strong> Do you get nervous with these kind of things?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:34] <strong>Ivana Ćirković:</strong> I get nervous all the time. I&#8217;ve been doing this for 12 years, it never gets easier. It is what it is.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:39] <strong>Nathan Wrigley:</strong> Well, the presentation that you are doing is going to be the focus of what we&#8217;re talking about today. So do you just want to tell us a little bit about the topic that you&#8217;re talking about, but also just give us a bit of a general bio about who you are and what you do. So just tell us about you and about your presentation basically.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:56] <strong>Ivana Ćirković:</strong> Okay. First thing first, I would like to introduce my presentation, or the talk, that is build up around WordPress Credits initiative, which is something that WordPress has rolled out late last year in December. And I applied to be a mentor to support students into their entering into WordPress. Got accepted, did my courses, passed them and started working with students on their, first entering the WordPress society, how everything works, contributing.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And out of all of this, I came up with the idea of sharing the story about WordPress Credits. What it is, why it is important, not just for the WordPress community, but also for universities all around the world for businesses to support, because there is an angle and huge opportunity for them too. And hopefully inspire people to join and become part of it more.</p>\n\n\n\n<p class=\"wp-block-paragraph\">As far as I&#8217;m concerned, my name is  Ivana Ćirković and I am a digital marketer for 18 years. I&#8217;ve been working inside tech organisations, tech industry, but also outside of it. So I&#8217;m the multiverse. And lately, for past couple of years, I&#8217;ve been working in WPBakery, in marketing their product, and talking to people, sharing knowledge of what we do, how we do it, and so on. In the meantime I am attending many, many WordCamps, local and international ones, giving lectures, giving talks about digital marketing and all things related.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:05:39] <strong>Nathan Wrigley:</strong> So are you here at this event, not just to give your presentation, are you also here on behalf of WPBakery to represent them and the products that they have as well?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:05:47] <strong>Ivana Ćirković:</strong> Yes, we are sponsors. I am speaker, I was table lead for marketing on Contributors Day. So we are wide into the ecosystem.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:05:56] <strong>Nathan Wrigley:</strong> I have to say, having only been in this event space for about an hour, I&#8217;m actually deeply impressed by this particular event. It really is a gigantic venue. It&#8217;s so pleasurable as well to see the WordPress community in such large numbers here. And so we&#8217;re looking forward to a really good event.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Okay, let&#8217;s kick off with the topic at hand then. So it occurs to me that many people listening, whilst they&#8217;re using WordPress and they&#8217;re kind of, I don&#8217;t know, they&#8217;re building websites for people, and they&#8217;ve got products and plugins and they&#8217;re just general users. It may be that the community piece, and the educational piece, is nothing that they&#8217;ve heard of before. So would you just tell us a little bit about what WP Credits is as far as you&#8217;re concerned, just to give us that broad background of what it is?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:06:40] <strong>Ivana Ćirković:</strong> Okay. So WP Credits program is initially made to bring new young people into the WordPress, to broaden the ecosystem with the new fresh blood, new contributors. And to do so, WordPress Foundation initiated this program to connect with universities all across the world. To connect students to some programs, to learn about WordPress through contribution. For that, they will get graded and get certification, which in the end will help them be more marketable, and have more modern knowledge of what is needed in today&#8217;s job market, and to be more competitive and more appealing to potential employers.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So by doing so, WordPress Credits aims to broaden the ecosystem, to strengthen the WordPress community, and WordPress itself. But also to put new generations in more marketable place, and to help them get more profitable jobs.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:07:45] <strong>Nathan Wrigley:</strong> Thank you. That was a really nice summary. In terms of your personal commitment to it and what have you, how did you fall into it as a thing that you were doing? And is this something that you get sponsored for from WPBakery, or is it personal and simply a sort of philanthropic thing that you are doing on the side?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:08:01] <strong>Ivana Ćirković:</strong> Yeah, so basically, I&#8217;ve been doing education my whole professional life. So it&#8217;s something that comes natural to me. In my local country, in Serbia, I do informal education for high schoolers and primary school&#8217;s children about digital marketing, digital literacy. This is like very natural to me. I&#8217;m being sponsored by WPBakery to do so.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And the program works like, initiative needs people, needs more mentors to get involved. More than it needs like product and businesses to support with their products. So if there are businesses who are maybe interested in support through their product, know that you need to put your people first to actually get involved and contribute, and then you can offer products as the side piece, so to say.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:08:52] <strong>Nathan Wrigley:</strong> So yeah, it seems that you&#8217;ve got a lifelong interest in education as well. Okay, that gives me some sort of hook there.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Okay, if I was to say WP Credits to the people outside, the people who already knew about it, I think would probably peg it as entirely educational in nature, just an education initiative. But curiously, your presentation, the notes that went with that and the blurb that went on the WordCamp Europe website, you kind of make the point that it&#8217;s much bigger than that, and you get into businesses and the students themselves and universities.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So the students in universities bit, well, that&#8217;s the education piece. But the business bit, what&#8217;s going on there? Because I definitely hadn&#8217;t drawn that intuition. I thought education from top to bottom. But business, okay, where does that fit in?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:09:37] <strong>Ivana Ćirković:</strong> I will get the hot insights from the talk. So basically, there is more than what meets the eye, so to speak. Businesses have unique opportunity to shape people they want to employ by getting involved as mentors. They also get the chance to see firsthand how those young minds work in real environments, in real contribution. And they get the chance to pick and choose who they want to employ by seeing them work on some real things. Whether it&#8217;s documentation, whether it&#8217;s translation or programming, developing something, AI.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We need more people who know what they do, although they are young. By having students in this program, they are working on not fictional things, but actual things that really contribute to community and businesses as a whole. By supporting this initiative, businesses then in relations to that can get more insights into who they want to employ. So on top of that, they are building the better market for themselves as well.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:10:42] <strong>Nathan Wrigley:</strong> I guess the student university piece is fairly obvious. You know, WP Credits and the people working on that project communicate with universities, they&#8217;re probably easy to find. You know, if you go to a phone directory for example, they&#8217;ll all be there. And it&#8217;s an easy thing to do. You phone up the university and see if there&#8217;s interest. And I know that some universities have taken up the WP Credits program. And it seems to be, as far as I can work out, it seems to be working very successfully.</p>\n\n\n\n<p class=\"wp-block-paragraph\">How are you going to make the connection with businesses? Because that seems like a much more scattered, I don&#8217;t know if you&#8217;re going to be working with big businesses, you know, huge companies or if it&#8217;s going to be kind of more the businesses on the street, the smaller businesses, that kind of thing. So, I&#8217;ll just sort of hand it over at that point.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:11:23] <strong>Ivana Ćirković:</strong> So basically, web agencies, businesses around WordPress, we know they have an issue with new employees onboarding last, let&#8217;s say three to six months. That cost time and money and other people who are teaching them what needs to be done and how.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Then we have WordPress Credit students who are already doing that junior type of work within contribution. They&#8217;re already onboarded through using Slack, knowing how to do remote work, what needs to be done. So businesses supporting WordPress Credits initiative can choose those students and spend less time and money and energy in onboarding them because they already went through that by doing WordPress Credits program.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:12:10] <strong>Nathan Wrigley:</strong> Yeah, I guess if you are a small web agency, it&#8217;s highly likely that you won&#8217;t necessarily have an induction program finely tuned, so that the young people that are coming through have this sort of specialised system where they can get some accreditation. It&#8217;s probably more, okay, I&#8217;m going to assign you to John this week and then next week you&#8217;re going to go over to Susan and follow what they&#8217;re doing.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So is there a sort of structured program that, let&#8217;s say a web agency based in London could drop into and receive documentation about? Where are we at with that whole process for the busineses?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:12:44] <strong>Ivana Ćirković:</strong> Yeah, so since this initiative is still fairly new and we already have just one generation of students that are passed the program, this is something in development. So at the moment, we still don&#8217;t have like a specific structure that is based just for agencies and businesses in general, but it is something that we are considering and working towards too. So definitely.</p>\n\n\n\n<p class=\"wp-block-paragraph\">On the other hand, the upper management organisational team might not be aware to the fullest what am I about to talk. So it might come as a surprise to them, but also it is something in the works as well. So give us some time and we will come up with something.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:13:26] <strong>Nathan Wrigley:</strong> Yeah, it feels like that would be something really credible. Because if you&#8217;re a small business owner, the last thing you want to be doing is kind of wasting time. And onboarding somebody might be something that you&#8217;d have to divert weeks into, you know, syphoning employees off, writing documentation, SOPs, those kind of things. And if you could just pick something up off the shelf that was tried and tested over many years, that would actually be really handy. So good luck. I hope that that initiative comes off.</p>\n\n\n\n<p class=\"wp-block-paragraph\">In terms of students, if you were a student, let&#8217;s say you are at a university, or you are looking for work, what would you say would be some of the top line items that you would mention as to why WP Credits is worth looking at? Because, you know, if I&#8217;m at a university, there&#8217;s probably a thousand different things that I could be doing. WP Credits would be in competition with all of those. Why do you think it&#8217;s something that young people should be taking care of to look at?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:14:17] <strong>Ivana Ćirković:</strong> Yeah, I would think differently, in that sense. Universities curriculums are outdated comparing to the industry that we are living and working in. So WordPress Credits gives something that is in trend. That is happening now that people are using and working now. So students who choose to go to this program are gaining the most efficient and not outdated curriculum, and things that are being worked on in this moment.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And this is bigger than WordPress. It is initially for WordPress, but the knowledge students get, nobody can take that away. They learn to be outspoken. They learn to use all the necessary remote work tools that is applicable in all the industry.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So we are really encouraging them to be very marketable employees and people who have portfolios, whether they choose that category that brings them portfolio. That is very transparent throughout whatever they do. Because on wordpress.org, every contribution is noted. So they&#8217;re building their own business brand by doing WordPress Credits. And in that way they are more marketable and can get more business opportunities.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:15:42] <strong>Nathan Wrigley:</strong> I didn&#8217;t realise that the wordpress.org profile, is it the profile that you mean?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:15:47] <strong>Ivana Ćirković:</strong> Yes.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:15:47] <strong>Nathan Wrigley:</strong> Each time you participate in one of these credit programs, that will be a badge, for want of a better word, that you can display and it will be freely available for the public. And presumably that will be difficult to acquire. That&#8217;s the wrong word. What I mean is, it won&#8217;t be simple to acquire. You will genuinely have had to.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:16:07] <strong>Ivana Ćirković:</strong> Yes, you need to do the work. Let&#8217;s say students are interested in translation. So they go to Polyglots team and they get assigned to a mentor who is on weekly basis working with them on onboarding, helping them how to navigate through wordpress.org website, translation, what needs to be done. And basically, for that student, they need to translate to have approved translation, 150 strings approved.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So that doesn&#8217;t mean, okay, I will translate 150 words. No, no. You might need to translate 500 words out of which 150 is approved. And this is the bare minimum you need to do in order to get that badge that you contributed. Because that contribution, each contribution needs to be something very specific and tailored to help other people. That is very open and helpful.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:17:00] <strong>Nathan Wrigley:</strong> So you mentioned translations there, which obviously is just one of multiple things that you could do, and we could list them all out, but we won&#8217;t. How is that curriculum, I&#8217;m doing air quotes, how is that curriculum decided upon? In other words, how do you decide, okay, I&#8217;m going to do a bit of translation, I&#8217;m going to do a bit of work on Core, I&#8217;m going to work for the Plugin Review Team? How is that decided? And, how is it decided by the institution, I guess that that&#8217;s going to equal something which our university will stamp as part of your degree, let&#8217;s say?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:17:33] <strong>Ivana Ćirković:</strong> Yeah. So basically, that is all arranged between the foundation and universities. You won&#8217;t get IT students doing marketing if that&#8217;s not their preferable choice. So students opt in. They&#8217;re given the whole like curriculum, categories of things they can contribute to. And the one they choose, this is the one they stick to throughout all the programs.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So you cannot switch in between like translation and documentation, or plugins, or WP-CLI whatever. The whole program stick to one chosen category. And that is all aligned with the, let&#8217;s say, topic of university. So IT is preferable for IT related contributions. Communications are also more favourable towards translation community, marketing. So it&#8217;s aligned that way.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:18:23] <strong>Nathan Wrigley:</strong> So flipping that round, so we&#8217;ve been talking about it from the point of view of the students. Now let&#8217;s just flip it around to the point of view of the university. I guess the same thing applies. They would have to communicate with the Foundation and say, okay, these are the kind of things that we wish our students to do. These particular strands, we will, you know, if they do 500 translation strings, that will count as something. I guess there&#8217;s got to be some interface between the Foundation and each university to establish what a credit equals.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:18:50] <strong>Ivana Ćirković:</strong> Yeah, common ground as to how WordPress Credits adds to the official curriculum of the university. And the thing that university get out of it, they are in position to offer modern, in trend, teachings, and that makes them more appealing to next generation of students. Because the more their existing students who are in the WordPress Credits program are succeeding, the more desirable the university gets to newer generations because they don&#8217;t teach outdated curriculums. They&#8217;re aligning to what is now efficient and needed in the job market.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:19:30] <strong>Nathan Wrigley:</strong> I suppose also as well, when I was at university, there was a choice of about, I don&#8217;t know, four things to do each year. Something like that. You could do this or this or this. And you had to pick one of them and that was your pathway. This feels much more wide open because knowing the WordPress ecosystem, I know that there&#8217;s dozens, maybe multiple dozens of different things that you could be involved in.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So that&#8217;s quite appealing as well, isn&#8217;t it? You know, you can just take a little nibble of this one thing, and another nibble of this. And so there&#8217;s potentially multiple dozens of different pathways that you could pick. And whilst you say that, once you&#8217;ve decided you&#8217;ve got to stick to that, well, that&#8217;s fair enough, but the fact that you&#8217;ve got so many different ways that you could choose. That to me as a university student would&#8217;ve been really appealing. The fact that there&#8217;s so many different things that you could do.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:20:15] <strong>Ivana Ćirković:</strong> Yeah. And once they got in, the overall input that we get from students that, first they don&#8217;t know that something like this exists. And once they go deep and start work, it&#8217;s like, wow. The whole mind just shifts, and they are amazed by all the possibilities that they can do within WordPress that isn&#8217;t talked about.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:20:36] <strong>Nathan Wrigley:</strong> Yeah. And I presume they get to do it in the way that the WordPress community works, which is remotely distributed and when you wish to do it. So long as I, you make the end of the university period of whatever a semester is or something, so long as you make the deadline, you can do it at night or in the early morning or.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:20:57] <strong>Ivana Ćirković:</strong> Exactly. So they are training to be like workers as we all are today, that are not restrained with some deadlines or by official university rules. They&#8217;re accountable for the final output. How will they come to that output? It&#8217;s entirely up to them because, yes, they are young but they&#8217;re not so young that they cannot be held accountable for their actions. So they need to do the work. We got weekly mentorships and assessments. So it&#8217;s a fun ride.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:21:31] <strong>Nathan Wrigley:</strong> So just touching on that, the sort of ongoing support that every student needs, because with the best rule in the world, there&#8217;s a proportion of students who will leave everything to the last minute. I&#8217;m looking at myself in the mirror when I say that. So that ongoing support, it&#8217;s a weekly sort of huddle. And is that like a one-to-one thing or is it a one to many thing?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:21:50] <strong>Ivana Ćirković:</strong> Yeah, so depending on the number of students, if a mentor has a one or two students, it can be one-to-one. If there are more like five or six, it&#8217;s better to have a group meeting on a weekly basis, and then Slack chats in between if anything is more needed than that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So basically we go through what they did last week, are there any setbacks or they need additional help, or do they need information from other parts of the team? Are they interested in something else? So we are really trying to get them involved in a way that matters to them.</p>\n\n\n\n<p class=\"wp-block-paragraph\">One of the things that each student needs to do, no matter section they chose, is to create a blog and to have weekly blog posts. So we discuss about that. What interests them. Whether they want to be something personal like, or professional like. So it&#8217;s very interesting to see how they think and how they express themself and how they build their online persona.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:22:55] <strong>Nathan Wrigley:</strong> Do those huddles take place on a, let&#8217;s say university by university basis? So for example, when you join and you mentor students, are they from the entire WP Campus project, or are you doing it from the university of this town and the university of that town?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:23:13] <strong>Ivana Ćirković:</strong> No, it&#8217;s mixed and matched.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:23:14] <strong>Nathan Wrigley:</strong> So, okay, well that&#8217;s a real strength as well it feels, because presumably then you&#8217;re on a call with people potentially from all over the world. Certainly people that you may not have encountered before. And those sort of serendipitous chance encounters can sometimes be some of the more meaningful ones. You know, work comes out of those things, and meetups come out of those things, and unexpected things come out of those things. So that must be really nice as well, watching those kind of things happen.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:23:42] <strong>Ivana Ćirković:</strong> Yeah, it&#8217;s like nothing I experienced before. And just to have the privilege to talk and work with those people, you never know what can come up out of them, and out of our connections. And I get inspired every time we have chats and they make me want to be a better educator.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:24:03] <strong>Nathan Wrigley:</strong> Oh, that&#8217;s interesting.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:24:04] <strong>Ivana Ćirković:</strong> So, yeah, that&#8217;s my take out of all this.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:24:06] <strong>Nathan Wrigley:</strong> Yeah. Okay, so there&#8217;s actually some psychological benefit for you as well. You get a real nice feeling of it. Okay, that&#8217;s really good.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So with the best will in the world, a university, every year there&#8217;s a cohort of children, young adults, whatever it may be, whichever institution it is, and a proportion of them will work diligently and hard and they will succeed. And some others maybe not so much.</p>\n\n\n\n<p class=\"wp-block-paragraph\">How does that work? How do you ensure that everybody gets through it? And I don&#8217;t know if there&#8217;s enough data to answer this question. Again, I&#8217;m doing air quotes, how is the pass rate? Do most people that embark on this get through the necessary things? Or is there a fair bit of, I don&#8217;t know, discipline, for want of a better word, that needs to be applied and cajoling people to get through it?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:24:46] <strong>Ivana Ćirković:</strong> Yeah, so I touched base on the accountability. So we have not strict rules, but recommendations. Weekly mentor chats, async communication through Slack. They all have weekly tasks that needed to be done. So if a student don&#8217;t answer the message or come to weekly mentor call three times, they are no longer WordPress Credit students. And that is the accountability.</p>\n\n\n\n<p class=\"wp-block-paragraph\">You need to show yourself that you are willing to do the work. So if you don&#8217;t care, we won&#8217;t force you to do that if you don&#8217;t want to. We will set reminders, we will call back, we will reach out. But if you are no show, no tell anything for three times, then evidently you are not for that. You don&#8217;t wish to be there, and we won&#8217;t force you to be there.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:25:40] <strong>Nathan Wrigley:</strong> And then in some way, are you required then to report that back to the institution and sort of say, okay, we&#8217;ve reached the end of the road here, and then it&#8217;s for them to figure out how that impacts. And presumably the students can.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:25:53] <strong>Ivana Ćirković:</strong> Their grades, yeah.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:25:53] <strong>Nathan Wrigley:</strong> Yeah, their grades what have you, okay. Touching back on the sort of business side, because we&#8217;ve dwelled a lot with students and universities and we&#8217;re going to stay with students, because that&#8217;s really the underpinning of the whole thing. How has the business side of things, is it taking off? You were describing that it&#8217;s kind of like a new thing. Have you got any sort of success stories or anecdotal evidence that people do in fact want this?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:26:15] <strong>Ivana Ćirković:</strong> Yeah, so it&#8217;s still fairly new, so we don&#8217;t have those anecdotes yet. One of the reasons why I&#8217;m here at the WordCamp Europe is to find out and to get new perspective from businesses to like reach out to them to see what they think about the program. Would they want to be evolved. And how to give tips, maybe how we can improve. So stay tuned for more.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:26:38] <strong>Nathan Wrigley:</strong> Yeah. And it is interesting, when you walk around an event like this, I don&#8217;t have the exact numbers, but the demographic is definitely skewing older. There&#8217;s not so many 18 year olds. And if this community wishes to carry on, at some point the age demographic will get to retirement age.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:26:57] <strong>Ivana Ćirković:</strong> Yeah. Just last night we were talking. I&#8217;ve been in the community for 11 years. And for 11 years all the same faces are here. And we really need new faces. But to get new faces, WordPress Credits is one part of the solution. But then again, we need to meet young people where they are. And they are not on the conferences, they are not on websites, they don&#8217;t use websites, they don&#8217;t care about websites. They are on very specific social media channels. And if we want to get fresh, new, young blood, we need to go there and to present what we do in a way that matters to those kids.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:27:35] <strong>Nathan Wrigley:</strong> In terms of success, if you were to, I don&#8217;t know, let&#8217;s imagine that we could cast our minds forwards five years, let&#8217;s go for that. What would you like to have happened with WP Credits? Would you like, for example, to see a bunch of 20 somethings wandering around in an event like this? Does it matter that they&#8217;re involved in the community and doing WordPress events and contributing to Core and those kind of things? Or is success just more broadly, people are using WordPress? You know, it&#8217;s still a project. What&#8217;s your take on, what does success look like in five years?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:28:08] <strong>Ivana Ćirković:</strong> For me, I would like to see more young people involved. Yes, we will always have users because in its core, WordPress is a very useful tool. And I&#8217;m happy to stumble upon that tool many, many years ago to use it both personally and professionally. But I really want to see young people involved in a way that we were involved 10, 15 years ago, and to see what can happen with WordPress.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I strongly believe it&#8217;ll be transformed, not with AI or all other flashy trends. WordPress has always been about people. And we need new people, we need young people to get it where it needs to be.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We are getting older and don&#8217;t have strengths or stamina to do so for how many long years. By having new kids, fresh perspectives, I&#8217;m really excited to see what they can come up with next.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:29:08] <strong>Nathan Wrigley:</strong> Yeah, it&#8217;s kind of handing over the baton in a way, isn&#8217;t it? Seeing what the future holds. Yeah, I definitely have concerns that the age demographic is skewing. And no matter what has happened in the past, I don&#8217;t see it being backfilled with younger people moment.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But I think that&#8217;s largely because we just assumed that that age demographic would fill itself, because we were excited about it, so the younger generation will be excited about it. Well it turns out the world moved on. And TikTok came along, and YouTube became a massive thing and mobile phones and all the different platforms became a thing. And so the attention was put elsewhere by many young people.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And so I suppose we needed to come up with a system where we are, in a sense, just putting it in front of their face and saying, look, it&#8217;s here. You know, you&#8217;re a university student, you are somebody looking for work in a small business. Here&#8217;s a credible way of getting involved in something which potentially could change your life. That seems like the most credible way of doing it at the moment. And I guess we&#8217;ll just have to see what the next five years brings.</p>\n\n\n\n<p class=\"wp-block-paragraph\">In which case, is there anything that you felt you wanted to touch on that you wanted to get out of this chat before we finished?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:30:15] <strong>Ivana Ćirković:</strong> No, I think you did it masterfully. And we touched base on everything that needed to be said.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:30:20] <strong>Nathan Wrigley:</strong> Perfect. In that case, I will say Ivana, thank you for chatting to me today. Fingers crossed that your presentation goes well tomorrow, and that you pack the place out, and that by this time next week, you are extremely busy with the WP Credits program. Thanks for chatting to me.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:30:34] <strong>Ivana Ćirković:</strong> Thank you. Thank you for inviting me.</p>\n</div></details>\n\n\n\n<p class=\"wp-block-paragraph\">So on the podcast today we have Ivana Ćirković.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Ivana is a digital marketer with 18 years of experience working both in and out of the tech industry, and currently leads marketing at WPBakery. She’s an active participant in WordPress events, having attended and spoken at numerous local and international WordCamps over the years.</p>\n\n\n\n<p class=\"wp-block-paragraph\">In this episode, our focus is on the WordPress Credits initiative. We learn how this program, launched by the WordPress Foundation, connects students with real-world opportunities to contribute to the WordPress ecosystem, earn certifications, and increase their competitiveness on the job market.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Ivana discusses her own experience as a WP Credits mentor, working with students as they learn about digital marketing, remote work, and open source contributions. We explore how universities can modernise their curriculums and add real-world value for students by participating in the initiative, and how businesses can get involved, not just to support the community, but to help shape and discover future talent.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The program’s evolving structure also gets attention, and we learn how students are guided through hands-on activities such as translation or documentation, and how their progress is tracked publicly via profiles on WordPress.org. Ivana shares the opportunities and challenges for both educators and businesses, with thoughts on accountability, mentorship, and the need to bring new faces into the WordPress community.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you’re interested in the future of WordPress, education, or bridging the gap between academia and industry, this episode is for you.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Useful links</h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://learn.wordpress.org/course/wordpress-credits/\">WordPress Credits</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://wpbakery.com\">WPBakery</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://europe.wordcamp.org/2026/session/what-it-really-means-to-be-a-part-of-the-wp-credits-program/\">What it (really) means to be a part of the WP Credits program?</a></p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 01 Jul 2026 14:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Nathan Wrigley\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:3;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:75:\"Open Channels FM: BackTalk on Support, Decision-Making, Reputation and Risk\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2556251\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:80:\"https://openchannels.fm/backtalk-on-support-decision-making-reputation-and-risk/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:140:\"Insights on community support, decision-making, starting new projects, and the importance of agency reputation in hosting. Engage and share!\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 01 Jul 2026 13:11:31 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:4;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:64:\"Aaron D. Campbell: Open Source Support Can’t Depend on Charity\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://aarondcampbell.com/?p=2933\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:78:\"https://aarondcampbell.com/2026/06/open-source-support-cant-depend-on-charity/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:470:\"<p>Companies depend on open source software. Supporting the projects that support your business shouldn\'t be treated as charity; it should be part of sustaining the infrastructure, ecosystem, and user trust your products rely on.</p>\n<p>The post <a href=\"https://aarondcampbell.com/2026/06/open-source-support-cant-depend-on-charity/\">Open Source Support Can&#8217;t Depend on Charity</a> appeared first on <a href=\"https://aarondcampbell.com\">Aaron D. Campbell</a>.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 30 Jun 2026 13:19:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:17:\"Aaron D. Campbell\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:5;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:63:\"Open Channels FM: Thoughts on the Human Side of AI Acceleration\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555792\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:70:\"https://openchannels.fm/thoughts-on-the-human-side-of-ai-acceleration/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:155:\"AI is evolving super fast, boosting productivity but also causing burnout and a loss of human touch. We need to balance tech with authentic human insights.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 30 Jun 2026 11:06:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:6;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:50:\"WordPress.org blog: The First AI Leaders Graduates\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=20951\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/news/2026/06/ai-leaders-graduates/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4846:\"<p class=\"wp-block-paragraph\">On June 23, around 40 students from the University of Illinois Chicago (UIC), Louisiana Tech University, and the University of Louisiana at Lafayette were celebrated in Chicago as the first cohort to receive the AI Leaders Micro-Credential through <a href=\"https://ai-leaders.org/\">AI Leaders</a>, the nation&#8217;s first workforce-focused AI literacy course tied to a recognized credential. Each of them earned it by building real projects, applying generative AI to genuine work, and contributing to the open source software that powers more than 40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} of the web. Students who completed the course also earned $1,000, made possible by a donation from Automattic and UIC. This celebration was the moment the program had been building toward since it was <a href=\"https://wordpress.org/news/2026/02/ai-leaders-credential/\">first announced in February</a>.</p>\n\n\n\n<div class=\"wp-block-group has-background is-layout-constrained wp-container-core-group-is-layout-2431c55b wp-block-group-is-layout-constrained\">\n<p class=\"has-text-align-center has-white-color has-text-color has-link-color has-normal-font-size wp-elements-2 wp-block-paragraph\"><strong>Explore the project portfolios built by this year’s AI Leaders</strong></p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https://aileaderswp.blog/\"><img alt=\"\" class=\"wp-image-20975\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/aileaderswpblog-scaled.png?ssl=1\" /></a></figure>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-3e41869c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-text-align-center wp-element-button\" href=\"https://aileaderswp.blog/\"><strong>AI Leaders · Class of 2026</strong></a></div>\n</div>\n</div>\n\n\n\n<p class=\"wp-block-paragraph\">When the pilot launched, the goal was to test whether open source learning could connect directly to job pathways rather than stopping at a certificate. What makes this program distinct is that it is built on open source from the ground up: students learn on WordPress, contribute to it, and use generative AI the way the WordPress ecosystem uses it every day, leaving with a credential that employers can verify and a community that continues long after the course ends.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The pilot reflects a shared belief that AI and open source skills should be within reach regardless of where someone lives or what they can afford.</p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">WordPress was built to expand access to publishing and participation on the open web.</p>\n</blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">The program is a collaboration with distinct roles for each partner. It is funded through the <a href=\"https://osf.it.uic.edu/\">UIC Tech Solutions Open Source Fund</a>, with support from the <a href=\"https://www.uic.edu/\">University of Illinois Chicago</a> and <a href=\"https://automattic.com/?p=867048\">Automattic</a>, while the WordPress project and the <a href=\"https://wordpressfoundation.org/\">WordPress Foundation</a> contribute to the development of the curriculum itself.</p>\n\n\n\n<h2 class=\"wp-block-heading\">What Comes Next</h2>\n\n\n\n<p class=\"wp-block-paragraph\">The first cohort was just the beginning. The gathering in Chicago brought this group together with employers and agencies, and further job placements are already in motion. </p>\n\n\n\n<div class=\"wp-block-group has-off-white-2-background-color has-background is-layout-constrained wp-container-core-group-is-layout-2431c55b wp-block-group-is-layout-constrained\">\n<p class=\"has-text-align-center wp-block-paragraph\">The next round of AI Leaders is on the horizon. Subscribe for updates to be the first to hear when the next cohort opens and how to take part.</p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-3e41869c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https://ai-leaders.org/#apply\"><strong>Subscribe for AI Leaders Updates</strong></a></div>\n</div>\n</div>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-dark-strokes-grey-color has-alpha-channel-opacity has-dark-strokes-grey-background-color has-background\" />\n\n\n\n<p class=\"wp-block-paragraph\"><em>WordPress offers a wide range of educational opportunities for people at every stage, from first steps to advanced contribution. Explore workshops, lesson plans, and community-created resources designed to help you build practical skills while connecting with others who are learning and contributing at <a href=\"https://wordpress.org/education/\">WordPress.org/education/</a>.</em></p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 29 Jun 2026 20:29:26 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Mary Hubbard\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:7;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:85:\"Open Channels FM: Six Months In: What Open Channels FM Has Been Talking About in 2026\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555969\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:91:\"https://openchannels.fm/six-months-in-what-open-channels-fm-has-been-talking-about-in-2026/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:197:\"In the first half of 2026, conversations on AI\'s impact, WordPress 7.0 launch, and the importance of the open web emerged. Key themes included rethinking work, community, and embracing uncertainty.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 29 Jun 2026 07:31:58 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:8;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Matt: Om Links\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=153359\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"https://ma.tt/2026/06/om-links/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:5363:\"<p class=\"wp-block-paragraph\">There has been a lot of excitement about the OmFest idea. If you&#8217;d like to attend or contribute, <a href=\"https://docs.google.com/forms/d/e/1FAIpQLScyY9c5MowPFW6BmIitqaaF3T-ykM_d8eD2pq2XqwSt7N50zg/viewform?usp=header\" rel=\"noopener\" target=\"_blank\">please fill out this form as soon as possible</a> so we can gauge the type of venue we need.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Update: <a href=\"https://thankyouom.com/\">ThankYouOm.com from Michael Galpert pulls together all the tweets, Instagram posts, and blog posts into a beautiful site</a>.</strong></p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s truly a testament to how Om lived life to see the outpouring of remembrances <a href=\"https://om.co/2026/06/24/1966-2026/\">in comments on the post</a> and <a href=\"https://www.techmeme.com/260625/p50#a260625p50\">around the web on Techmeme</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I do wish he had been more public earlier in his health journey. You never know what you&#8217;ll learn. I&#8217;ll take that as a lesson for myself if I&#8217;m ever in a similar situation.</p>\n\n\n\n<p class=\"wp-block-paragraph\">There have been some great long-form writings about Om:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https://daringfireball.net/2026/06/om\">John Gruber ties together Apple, the Yankees, and luggage</a>. &#8220;<em>He not busy being born is busy dying</em>, wrote Dylan. Om Malik wasn’t busy dying even when he was dying.&#8221;</li>\n\n\n\n<li><a href=\"https://staceyoniot.com/thank-you-om-malik/\">Stacey Higginbotham</a> from the original GigaOM.</li>\n\n\n\n<li><a href=\"https://mathewingram.com/work/2026/06/25/om-malik-1966-2026/\">Mathew Ingram</a>.</li>\n\n\n\n<li><a href=\"https://www.nytimes.com/2026/06/26/technology/om-malik-dead.html\">The New York Times did an obituary</a>.</li>\n\n\n\n<li><a href=\"https://www.hodinkee.com/articles/in-loving-memory-of-om-malik-friend-writer-venture-capitalist-and-ever-the-believer\">Ben Clymer on Hodinkee</a>. &#8220;Om changed my life. He did it in many ways, often slowly and with subtlety, always with kindness and eminent belief in me.&#8221;</li>\n\n\n\n<li><a href=\"https://runtimewire.com/article/om-malik-taught-silicon-valley-to-read-itself\">Ryan Merket on RuntimeWire</a>.</li>\n\n\n\n<li>Om introduced <a href=\"https://krutal.blog/2026/06/26/om/\">Krutal Desai as his son</a>. &#8220;He had a rare gift of seeing 20 steps ahead while explaining things with remarkable simplicity. He gave wisdom freely, never seeking credit, only wanting to help others succeed.&#8221;</li>\n\n\n\n<li><a href=\"https://susanhobbs.blog/2026/06/27/the-gravity-of-om/\">Susan Hobbs</a>. &#8220;He was a teddy bear to those fortunate enough to know him.<br />[&#8230;] Om created gravity. He was someone you wanted to be around.&#8221;</li>\n\n\n\n<li><a href=\"https://pradeep.md/2026/06/25/om.html\">Pradeep Elankumaran</a>.</li>\n\n\n\n<li><a href=\"https://blog.naveen.com/2026/06/om-2/\">Naveen Selvadurai</a>.</li>\n\n\n\n<li><a href=\"https://explorers.com/my-friend-om/\">Christopher Michel</a>.</li>\n\n\n\n<li><a href=\"https://x.com/jgheller/status/2070267958891524448\">Jonathan Gheller</a>.</li>\n\n\n\n<li><a href=\"https://x.com/mamoonha/status/2070255545643364515\">Mamoon Hamid</a>.</li>\n\n\n\n<li><a href=\"https://boingboing.net/2026/06/25/om-malik-1966-2026.html\">Rob Beschizza on Boing Boing</a>.</li>\n\n\n\n<li><a href=\"https://www.airsugar.com/p/om-malik-1966-to-2026\">Brian Sugar</a>.</li>\n\n\n\n<li><a href=\"https://hugo.blog/2026/06/25/r-i-p-om-malik-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}f0{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}9f{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}96{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}a4/\">Hugo Barra</a> on how Om got him to write.</li>\n\n\n\n<li><a href=\"https://everwas.com/2026/06/om/\">Ian Kennedy</a>, also with some great quotes.</li>\n\n\n\n<li><a href=\"https://toni.org/2026/06/25/om-malik/\">Toni Schneider</a>. &#8220;Om was a wonderful person, artistic soul, and original thinker. He was always curious, generous, and warm-hearted.&#8221;</li>\n\n\n\n<li><a href=\"https://seanbonner.com/2026/06/29/death-and-what-we-leave-behind/\">Sean Bonner</a>. &#8220;[H]is feedback and criticism could be sharp – but it was always with the hope that things could be better.&#8221;</li>\n\n\n\n<li><a href=\"https://battellemedia.com/archives/2026/06/remembering-om-malik\">John Battelle</a>. &#8220;Om quickly decided his integrity was more important than the ad dollars he was making with Federated&#8221;</li>\n\n\n\n<li><a href=\"https://winnielim.org/journal/om/\">Winnie Lim</a>. &#8220;Om was one of the very few people in this world I can have an intense conversation about form and content with.&#8221;</li>\n\n\n\n<li><a href=\"https://glass.photo/highlights/remembering-om\">Glass.photo</a>. &#8220;It’s not lost on us that <a href=\"https://glass.photo/om\">Om’s photography</a>, often taken in frozen lands in or around the arctic circle, was the polar opposite of his personality.&#8221;</li>\n\n\n\n<li><a href=\"https://spyglass.org/om/\">M.G. Siegler</a>. &#8220;The true natural born blogger.&#8221;</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">I know I&#8217;m missing a ton, I&#8217;ll update the above. I also added a <a href=\"https://ma.tt/2026/06/om-forever/\">few more vignettes and pictures to the last post</a>.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img alt=\"\" class=\"wp-image-153374\" height=\"453\" src=\"https://i0.wp.com/ma.tt/files/2026/06/IMG_0420-1024x768.jpg?resize=604{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C453&#038;quality=89&#038;ssl=1\" width=\"604\" /></figure>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 27 Jun 2026 16:34:31 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:9;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:73:\"Open Channels FM: Why “It’s Dead” Says More About You Than the Tool\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555736\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://openchannels.fm/pop-the-email-is-dead-bubble/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:143:\"Email isn’t dead. Sure, email marketing might not work for everyone, but it’s still crucial for many businesses and personal communication.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 26 Jun 2026 09:08:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:10;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:26:\"Matt: All Roads Lead to Om\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=153320\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"https://ma.tt/2026/06/om-forever/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7253:\"<p class=\"wp-block-paragraph\">Yesterday, my best friend and brother from another mother, Om Malik, <a href=\"https://om.co/2026/06/24/1966-2026/\">passed away</a>. </p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">They say that blood is thicker than water, and what we had was way thicker than blood. — Bob Weir</p>\n</blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Om&#8217;s request was for a small family prayer ceremony. In mourning, that will be all there is. In celebration and tribute, I love that everyone is <a href=\"https://www.techmeme.com/260625/p50#a260625p50\">sharing their Om stories online</a>, like the <a href=\"https://explorers.com/my-friend-om/\">writing and photography Christopher Michel shared</a>, which very much embody the OG spirit of blogging that Om pioneered.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<h2 class=\"wp-block-heading\">A Renaissance Man</h2>\n\n\n\n<p class=\"wp-block-paragraph\">I knew Om contained multitudes, but sitting by his side these last few weeks, I&#8217;ve been amazed to learn how many deep and completely separate communities he was part of. He meant so much to so many, in so many different ways.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Om loved putting on a good conference, and I&#8217;d like to celebrate his life with an awesome event on September 29, 2026 (his 60th) in San Francisco, like an <strong>OmFest</strong>. (Update: <a href=\"https://docs.google.com/forms/d/e/1FAIpQLScyY9c5MowPFW6BmIitqaaF3T-ykM_d8eD2pq2XqwSt7N50zg/viewform?usp=header\">Sign up here</a>!) I&#8217;ll find a space where every community from the many facets of Om can come together. In the spirit of Open Source and co-creation, we can have some booths, flash talks, a gallery of his photography, pen showcase, and whatever other fun ideas people want to contribute. I can&#8217;t wait for the beautiful collision of his tech / journalism / Indian party planner / pen / coffee / shoes / photography circles, and probably some niches I couldn&#8217;t even imagine.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<h2 class=\"wp-block-heading\">A Few Vignettes</h2>\n\n\n\n<p class=\"wp-block-paragraph\">I have so much to say about Om, but right now I&#8217;m working on <a href=\"https://om.co/2026/06/24/1966-2026/\">moderating comments</a> and keeping his website tip-top, so here are a few snippets:</p>\n\n\n\n<p class=\"wp-block-paragraph\">Fundamentally, Om was a lover of humanity. He became a fast &#8220;regular&#8221; everywhere he went. He wouldn&#8217;t just buy coffee, he would also learn the name and story of every barista, the dogs and people in South Park. His deep curiosity and respect weren&#8217;t just for the fine and famous. It extended to every soul that crossed his path. His encyclopedic knowledge and photographic memory created connections not just in San Francisco, but all around the world wherever we traveled. (I need to pull the stats, but we went to five continents together, including Antarctica.)</p>\n\n\n\n<p class=\"wp-block-paragraph\">He loved people and their stories. </p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<p class=\"wp-block-paragraph\">Om and I were an odd couple. We met online through forums and email because Om was one of the earliest adopters of WordPress. We finally met in person in 2004 when I was 20 and he was 38. He connected me to the first investors I ever spoke to, Phil Black, who formed True Ventures, and Tony Conrad, and introduced me to Toni Schneider, my business soul mate, who became like a co-founder as the CEO of Automattic in our first 8 years.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And of course on the internet. I don&#8217;t know how we would count, but I would guess Om read at least 1 or 2{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} of the whole thing.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<p class=\"wp-block-paragraph\">Om was a voracious learner. I was there when he first used chopsticks, and only a few months later, he knew every sushi restaurant in San Francisco and exactly what he liked at each.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<p class=\"wp-block-paragraph\">Om is probably in the top ten in the world for finding things incredibly early. That&#8217;s why he has the best usernames! How does one guy get the @om username on WordPress.com in 2005 (user ID 719), <a href=\"https://x.com/om\">Twitter in 2006</a>, <a href=\"https://www.instagram.com/om\">Instagram in 2010</a>? The first WordPress meetup was at <a href=\"https://www.chaatcornersf.com/\">Chaat Cafe (now Corner)</a> in 2005, <a href=\"https://ma.tt/2005/01/meetup-aftermath/\">8 people showed up, and Om was one of them</a>.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<p class=\"wp-block-paragraph\">One of the biggest lessons I learned from Om is the deep appreciation of craft. When he took an interest in photography or pens, he would somehow find his way to the most obscure, highest-quality expression of that form. &#8220;What Would Om Want?&#8221; is a question I will always ponder. I want to craft products that would make Om proud.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<p class=\"wp-block-paragraph\">Om&#8217;s last word was &#8220;love.&#8221;</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img alt=\"\" class=\"wp-image-153336\" height=\"402\" src=\"https://i0.wp.com/ma.tt/files/2026/06/MCM_9460-1024x681.jpg?resize=604{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C402&#038;quality=89&#038;ssl=1\" width=\"604\" /><figcaption class=\"wp-element-caption\">In a jitney on our trip to India in 2009</figcaption></figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img alt=\"\" class=\"wp-image-153338\" height=\"402\" src=\"https://i0.wp.com/ma.tt/files/2026/06/om-citizen-1024x681.jpg?resize=604{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C402&#038;quality=89&#038;ssl=1\" width=\"604\" /><figcaption class=\"wp-element-caption\">The day Om became a US citizen </figcaption></figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img alt=\"\" class=\"wp-image-153340\" height=\"402\" src=\"https://i0.wp.com/ma.tt/files/2026/06/MAT_2822-1024x681.jpg?resize=604{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C402&#038;quality=89&#038;ssl=1\" width=\"604\" /><figcaption class=\"wp-element-caption\">In NYC with the True crew, 2008</figcaption></figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img alt=\"\" class=\"wp-image-153342\" height=\"403\" src=\"https://i0.wp.com/ma.tt/files/2026/06/MCM_0056-1024x683.jpeg?resize=604{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C403&#038;quality=89&#038;ssl=1\" width=\"604\" /><figcaption class=\"wp-element-caption\">Matching dyed blonde hair, 2016</figcaption></figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img alt=\"\" class=\"wp-image-153345\" height=\"805\" src=\"https://i0.wp.com/ma.tt/files/2026/06/IMG_0284-768x1024.jpg?resize=604{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C805&#038;quality=89&#038;ssl=1\" width=\"604\" /><figcaption class=\"wp-element-caption\">With a golden heart, 2025</figcaption></figure>\n\n\n\n<h2 class=\"wp-block-heading\">Nothing Gold Can Stay, by Robert Frost</h2>\n\n\n\n<pre class=\"wp-block-verse\">Nature’s first green is gold,<br />Her hardest hue to hold.<br />Her early leaf’s a flower;<br />But only so an hour.<br />Then leaf subsides to leaf.<br />So Eden sank to grief,<br />So dawn goes down to day.<br />Nothing gold can stay.</pre>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 26 Jun 2026 03:02:51 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:11;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"Open Channels FM: The Rise of Messaging as the Universal Tech Interface\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555622\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:78:\"https://openchannels.fm/the-rise-of-messaging-as-the-universal-tech-interface/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:246:\"Messaging is emerging as the universal interface for interacting with technology, simplifying complex tasks into straightforward communications akin to texting, thereby enhancing productivity and reducing technical barriers in digital engagement.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 25 Jun 2026 12:11:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:12;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:81:\"Open Channels FM: Aligning WooCommerce Marketing Strategies for Community Success\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2556016\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:88:\"https://openchannels.fm/aligning-woocommerce-marketing-strategies-for-community-success/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:185:\"In this episode we’re chatting about a topic that matters to everyone in the WooCommerce world and beyond: how OSS communities can come together to market themselves more effectively.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 25 Jun 2026 09:08:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:13;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:113:\"WPTavern: #222 – Destiny Kanno, Anand Upadhyay, Maciej Pilarski on How WordPress Education Programs Are Growing\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"https://wptavern.com/?post_type=podcast&p=204958\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:125:\"https://wptavern.com/podcast/222-destiny-kanno-anand-upadhyay-maciej-pilarski-on-how-wordpress-education-programs-are-growing\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:80884:\"<details>Transcript<div>\n<p class=\"wp-block-paragraph\">[00:00:19] <strong>Nathan Wrigley:</strong> Welcome to the Jukebox Podcast from WP Tavern. My name is Nathan Wrigley.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Jukebox is a podcast which is dedicated to all things WordPress. The people, the events, the plugins, the blocks, the themes, and in this case, how WordPress education programs are growing.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;d like to subscribe to the podcast, you can do that by searching for WP Tavern in your podcast player of choice, or by going to wptavern.com/feed/podcast, and you can copy that URL into most podcast players.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you have a topic that you&#8217;d like us to feature on the podcast, I&#8217;m keen to hear from you and hopefully get you, or your idea, featured on the show. Head to wptavern.com/contact/jukebox, and use the form there.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So on the podcast today, we are joined by three WordPress Education Initiative leaders, Destiny Kanno, Anand Upadhyay and Maciej Pilarski.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Together, they have spent years at the heart of WordPress training and outreach, working in roles spanning community education management, plugin development, and credit program administration. Their efforts have helped shape student engagement and university partnerships across the globe, introducing thousands of learners to WordPress.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The conversation focused on the current landscape of WordPress education with particular attention to three key initiatives, the WordPress Credits Program, Campus Connect, and Student Clubs.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Each initiative is designed to provide unique entry points for students of all ages and education levels. From high schoolers building their first site in a library to university students earning official credits for open source contributions.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We discussed the different approaches these programmes take. WP Credits ties student work directly to academic credit and mentorship. Campus Connect provides flexible, community driven, events in diverse locations and Student Clubs foster sustainable, peer led, learning within schools and other institutions. We explore how these models feed into each other, building a sustainable ecosystem for ongoing growth in the WordPress community.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We also get into the importance of repeat campus partnerships, the need for scalable facilitator training, and the role of recognition, certificates, badges, and public showcases in keeping students motivated and validated in their journey.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re curious about the growing movement to bring WordPress knowledge to the next generation, or are looking to get involved with education in your local community, this episode is for you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re interested in finding out more, you can find all of the links in the show notes by heading to wptavern.com/podcast, where you&#8217;ll find all the other episodes as well.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And so without further delay, I bring you Destiny Kanno, Anand Upadhyay and Maciej Pilarski.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I am joined on the podcast by Destiny Kanno, by Anand Upadhyay and Maciej Pilarski. Hello, one and all. Nice to have you with us.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:29] <strong>Destiny Kanno:</strong> Hello. Thank you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:30] <strong>Anand Upadhyay:</strong> Hello.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:31] <strong>Maciej Pilarski:</strong> Hello.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:32] <strong>Nathan Wrigley:</strong> So a few months ago, back in, I think it was September 2025, I was joined by two of the three participants on the call today. I was joined by Destiny and I was joined by Anand. We were also joined at that point by Isotta, but she&#8217;s not on the call today. We&#8217;ve obviously got a wonderful replacement, Maciej who&#8217;s going to do a fabulous job explaining the bits and pieces here.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But the intention of that episode, which you can find on the WP Tavern website, it&#8217;s episode number 183, was to find out about all of the overlapping education initiatives in the WordPress space. And it was born, I think, largely out of a sense of curiosity on my part, but also a somewhat sense of confusion, because there were lots of things which were going on. Some of them seemed to be slightly overlapping. There was a conflict of names in some cases. So that episode was laying out the groundworks of what has been happening in the WordPress space.</p>\n\n\n\n<p class=\"wp-block-paragraph\">When that conversation finished and we&#8217;d click the stop record button, I said, that was absolutely fascinating. This seems to be moving at such a rate, wouldn&#8217;t it be good to revisit this whole subject in about six months time?</p>\n\n\n\n<p class=\"wp-block-paragraph\">Well, we missed that target, but here we are, maybe eight months later. I think my intuition at that point was correct, because being a close observer of what&#8217;s going on in the WordPress community, I think it&#8217;s fair to say that the educational space has been somewhat turbocharged during the last eight months.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And so today&#8217;s episode, with the help of the three people I&#8217;ve just mentioned, is to describe what&#8217;s going on, what&#8217;s changed, maybe some things that have been mothballed, but certainly a lot of things that are new and interesting and have gained a lot of momentum.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But I think, dear listener, the intention of this episode is to get you involved. Is to get to the end of this episode and for your curiosity to have been turned into action. To have gotten you out of your chair, written an email, turned up to an event, helped organise a thing.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So please have that in the back of your mind. If you&#8217;re sitting listening to this in a car, at your desktop, there is actual action that could be taken at the end of this. I think the intention of all four of us on this panel would be dearly for that to happen.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Okay, let&#8217;s establish the credentials of the people that we&#8217;re going to be talking to today. So we&#8217;ll just do a little potted bio of you one at a time. So we&#8217;ll begin with Destiny, if you could just tell us a little bit about you, your relationship with education in the WordPress space, I suppose would be apropos.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:06:01] <strong>Destiny Kanno:</strong> Yeah, absolutely. So again, Destiny Kanno. I&#8217;m currently working as an education program manager sponsored by Automattic. And I work directly with the Make WordPress Community Team. And I also work adjacently with the training team as well, because education training materials, they go pretty hand in hand. And I&#8217;ve been doing this now for about four years and, yeah, it&#8217;s just evolved since my original time working on Learn WordPress, and that relaunch that happened, to now, yeah, these wonderful programs that are spreading like wildfire as you said.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:06:37] <strong>Nathan Wrigley:</strong> Fantastic. Thank you so much. Okay, we&#8217;ll move over to Anand for the same sort of introductory moment.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:06:43] <strong>Anand Upadhyay:</strong> Yes. So my name is Anand Upadhyay, and I run the WordPress plugin development company, WPVibes. Apart from that, I&#8217;m very much involved in the WordPress community and I contribute in multiple ways. It can be documentation, it can be Core, Polyglots. But I&#8217;m also keenly involved in the community part, and specifically I can say with the education initiatives, I started with WP Campus Connect in WordPress Campus Connect in 2024. And since then, after that we started joining hands with Destiny and we started evolving this program in a much bigger shape. So that&#8217;s it.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:07:16] <strong>Nathan Wrigley:</strong> Okay. Thank you so much. And last, but by no means least, Maciej.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:07:20] <strong>Maciej Pilarski:</strong> Yeah. Thanks for having me. My name is Maciej Pilarski. So I&#8217;ve been doing anything related to WordPress pretty much since 2007, so that&#8217;s been a while. But the biggest breakthrough for me was 2014 when I actually volunteered to WordCamp Europe in Sovia, Bulgaria. That opened my eyes to the whole community, everything that is happening around WordPress.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And since then, pretty much I&#8217;ve been working for multiple companies from the WordPress ecosystem. I joined Automattic in 2016. For many years I&#8217;ve been a Happiness Engineer, and since October last year, I&#8217;ve joined Isotta as one of the admins of the WordPress Credit program. And since that time, I will have been helping her out to grow that initiative.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And Destiny mentioned, it spreads like fire because at that time we had six universities onboarded, now we are at 21. The 21st, we got it after WordCamp Asia actually through a connection made there. And it&#8217;s our first institution from Africa, from Uganda. A huge shout out to Stephen Dumba, who I connected with during the event. And after that, pretty much a week after we signed our first partnership from Africa. So we&#8217;re actively growing and getting new institutions on board.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:08:42] <strong>Nathan Wrigley:</strong> Thank you so much. Gosh, there was an awful lot in there, wasn&#8217;t there? That was really interesting. We&#8217;ll try and unpack quite a lot of that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Firstly, a sort of slightly personal message from me. I don&#8217;t usually reveal much about myself on this podcast. I take the position that I&#8217;m a, kind of like an interested party, but don&#8217;t really give much of my own thoughts. However, this is different because I cannot think of a more interesting, meaningful, moral, let&#8217;s go with that word as well, use of time than educating people. It simply is the most profoundly useful thing to do with your life.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Now, obviously people will have different opinions about that, but the juxtaposition of free open source software, in this case WordPress, and education is a real sweet spot for me. I just think that is such an amazing thing to be involved in, to have going on in the background.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you think about it, an open source project, like how many open source projects have this level of stuff going on in the education space, this real international footprint. Things going on which we&#8217;ll find out about in a minute. It&#8217;s really fascinating.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And I am sure that the listenership to this podcast, the vast majority of people listening will never have encountered much of this before. Maybe they&#8217;ve seen stuff on Learn because they want to technically learn about WordPress in an online capacity, but we&#8217;re going to be delving into real world events affecting real adults, real youngsters.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And so anyway, that&#8217;s my little bit at the beginning, just how curious it is that the project is so big that we&#8217;ve got this international footprint of education. And so I suppose what we should do right at the beginning is lay out the different initiatives and just name them, and try to figure out how they differ from each other. Just so that we&#8217;ve got some kind of awareness.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So I don&#8217;t know which one of you wants to take that, but if maybe you take one each or something, I don&#8217;t know. If we just want to lay out the, just erect that tent basically so that we know what the initiatives are called, and how they differ from one another. So I&#8217;ll open that up. Whoever wants to step in.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:10:48] <strong>Maciej Pilarski:</strong> I can start with the Credits Program. So the Credits Program is based, it&#8217;s a contribution based program, internship, initiative by the WordPress Foundation that connects higher education students with the global open source community. So basically it&#8217;s an opportunity for the students as part of the educational curriculum to contribute to the WordPress community.</p>\n\n\n\n<p class=\"wp-block-paragraph\">There are two types of courses that the students can do. One of them is 50 hours, the second one is 150 hours. Usually the students do that during a full academic semester. And as part of that, students are first onboarded into the WordPress ecosystem and the wider open source ecosystem where they learn not only about WordPress, but open source as a whole, and how crucial it is for the internet.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Then the second phase is picking the contribution area to which they would like to contribute. All the contributions areas basically are the ones that are listed at make.wordpress.org. So any team that is listed there, students can pick from that area. During that phase, they work on a particular area that they have selected.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And finally, during phase three, they wrap up the whole achievements, the contribution, what they did, they publish a final post. And what is also very important as part of the credit scores, students have also assigned a mentor from the WordPress community that guides them through the whole process. We don&#8217;t leave them alone. We connect them with actual mentors from the WordPress community that are vetted by us, that guide them through the whole journey into the contribution and the whole WordPress ecosystem.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So it works on multiple levels. For me, this connection is also special because it builds this bridge between the previous generation of WordPress contributors to the new one where they are introduced and can start working on any fields of contribution.</p>\n\n\n\n<p class=\"wp-block-paragraph\">What is also important is that this is not limited to technical universities. Pretty much any type of university can participate in the program. The first university that we started with was University of Pisa, and it was the humanity studies. So the students from humanity field were the first group who started the Credits Program. There&#8217;s room for pretty much anyone from any field.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:13:18] <strong>Nathan Wrigley:</strong> Okay. There&#8217;s a lot there. Wow. I&#8217;ve just been taking notes and I&#8217;ve almost filled an entire A4 page. So WP Credits, the WordPress Credits Program, I guess the name sort of gives it away. The idea here is that you trade time for university or higher education credit. So credit being, I suppose if you were to atomise your three year degree, you might do, I don&#8217;t know, 12 modules or something like that. The idea is that one of those modules, perhaps it&#8217;s more, becomes something in the WordPress, but also curiously the free open source software space as well. I didn&#8217;t actually know that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The idea is that you link up with real world institutions. So the first one was Pisa, and maybe we can get into which other ones have come along. And in exchange for 50 hours or 150 hours, you will be given that credit, which can then go to the overall awarding of a degree or whatever it is that you are hoping to get.</p>\n\n\n\n<p class=\"wp-block-paragraph\">You&#8217;re then linked up with team members, WordPress community team members who will mentor you and shepherd you through this process. And the idea is that it culminates, I think you said in a final post, which I suppose in a sense is a bit like a dissertation or something like that, you sum up all the different bits and pieces. Yeah.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:14:29] <strong>Maciej Pilarski:</strong> Once that happens, the students also receives an official certificate from the WordPress Foundation, signed by Matt himself, that certifies that they completed the course. And what is also important to know, the whole progress through the course and what they did during the course, it&#8217;s also stored on the wordpress.org profile. So any contributions that they did, for example, photos that they&#8217;ve uploaded, this all will be visible on the wordpress.org profile. And they also receive a special badge dedicated to students who graduated from that program.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So it really gets them started into the WordPress ecosystem, and at the same time creates something like a small portfolio for any future company that would like to, for example, hire them. Because they have a proven history of contributing to the ecosystem.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:15:20] <strong>Nathan Wrigley:</strong> Okay, so that&#8217;s an interesting quid pro quo, isn&#8217;t it? So the idea is you do all this work, which on the face of it, I suppose looks very philanthropic, you know, you&#8217;re giving up your time, but you get a real thing at the back end of it. You get a certificate. You can then presumably apply for jobs and indicate, okay, I&#8217;ve done this, I&#8217;ve contributed in this meaningful way.</p>\n\n\n\n<p class=\"wp-block-paragraph\">What I think is really interesting there, and it kind of gets lost, I&#8217;ve worked in education in the past and I know the red tape that&#8217;s involved in doing anything in the education space. There is so much red tape. And I can only imagine what&#8217;s happened in the background to enable these kind of things. You know, the back and forth, the tennis of emails that go on and on and the proof that&#8217;s required to categorically show that this thing that we are doing is worth something. You know, it&#8217;s not just this Mickey Mouse. We use that expression, Mickey Mouse kind of qualification that really, it doesn&#8217;t actually require any hard work. It&#8217;s just there, nothing really in it, but you get an accreditation anyway.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I can only imagine the hard work that has gone in every single time you touch a new institution, trying to convince them that this is legitimate, that this is real. You&#8217;ve just kind of glossed over all of that by just describing what is in existence, not necessarily what has gone on to make it happen. I know that there&#8217;s probably more than the three of you involved in this, but my profound thanks for all of that hard work, which presumably is utterly and completely invisible. And I can only imagine what&#8217;s going on there. So yeah, thank you for all of that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:16:54] <strong>Maciej Pilarski:</strong> Thank you for that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:16:54] <strong>Nathan Wrigley:</strong> So that was WP Credits. So that was one wing of the things that we&#8217;re going to discuss today. Should we move on to another one and maybe somebody else wants to take the helm?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:17:03] <strong>Anand Upadhyay:</strong> I think Destiny can take Campus Connect and then I will take Student Clubs.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:17:06] <strong>Nathan Wrigley:</strong> Okay. Destiny, let&#8217;s move over to you and see what you can tell us about something different.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:17:11] <strong>Destiny Kanno:</strong> Yeah, so I&#8217;d love to tell you more about WordPress Campus Connect. And the way we ended with WordPress Credits, I think is also very critical to the story of Campus Connect because, you know, it started with Campus Connect first, and that&#8217;s how organisers such as Anand and Pooja like were able to get those connections with the universities through being boots on the ground, you know, having those relationships. Proving through action that these activities that we&#8217;re doing with the students are having real impact and are showing real results.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Slowly building up these kind of case studies in a way has helped open a lot of doors, especially with Campus Connect now, we&#8217;ve done a lot of events, especially since we last talked. Like I think this year alone, we&#8217;ve already had 22 Campus Connect events. So, like it&#8217;s not even half the year and it&#8217;s quickly becoming one of the biggest run events, WordPress official series.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But these events are like a way of opening the door, right? Hey, here&#8217;s a free learning opportunity for your students. And as you said, like the red tape is there. A lot of institutions are like, wait, so what&#8217;s in it for you? Why is, there&#8217;s a little bit of dubiousness sometimes in the reaction, right? You&#8217;re going to give your time to educate our students, why? But once they see, it&#8217;s like, no, we really are just passionate about spreading WordPress, showing students what&#8217;s capable with their website, how it applies to different skillsets as well. Like it&#8217;s not just for coders, it is for marketers, it is for designers.</p>\n\n\n\n<p class=\"wp-block-paragraph\">You know, there&#8217;s so many career opportunities that once we just get the foot in the door and we&#8217;re able to showcase that, a lot of institutions are like, okay, now I get it. I do want to highlight in Anand&#8217;s case, like they&#8217;re going to have their third WordPress Campus Connect in Ajmer this year. You&#8217;ve got repeat institutions. I&#8217;ve heard you also have institutions that are like, when are you going to come to our place and teach WordPress? You know, once the fire is lit and people see how bright and shiny it is, like people want to get involved.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But as you said, like getting it to click for people, that is like the most difficult part. And I&#8217;ll give an example of, right now in Japan, we had our first WordPress Campus Connect event on the 9th of May. So I&#8217;m like, woo hoo. Like it finally happened. But we have this community in Japan that is like very passionate, very active. So when I first was like introducing the concept of Campus Connect, people were like, okay, but like how do we do this? What&#8217;s it about? It takes like a lot of presentations, a lot of going to people in person and talking. Helping them even shape the conversation that they&#8217;re going to have with the institution to sell this amazing gift of WordPress on their campus.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And after this one on the ninth, like now we have a case study in Japan that others can now use to be a starting point for those conversations going forward. So I think, once you have that one step, the gate just slowly opens until it&#8217;s just, the doors bang open in each way. But yeah, we&#8217;ve seen really great success with Campus Connect and it&#8217;s just like honestly, it just keeps growing.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:20:30] <strong>Nathan Wrigley:</strong> Can I just ask a quick question? So I just want to draw a very clear line for everybody that&#8217;s listening to this, what the difference may be between Campus Connect and WP Credits. Because from the description that we&#8217;ve had so far, it may be that you&#8217;ve fallen into the trap of thinking, well, they sound like they might be the same thing. So could you just, Destiny, just tease out where Campus Connect differs? Maybe in the nature of the event, the timing of the event, the availability, the age group, those kind of things that separate WP Credits from the Campus Connect initiative.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:21:02] <strong>Destiny Kanno:</strong> Yeah. Thank you, that&#8217;s like a really great distinction to make. So whereas WordPress Credits is geared toward higher education, Campus Connect is geared toward, honestly any level of students as long as they&#8217;re able to browse the web safely, and enjoy and participate.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So that means, Elementary school students now are pretty good at devices. High school students, college students, vocational students. We honestly kept the door pretty open in terms of what a campus means. We&#8217;ve even had a Campus Connect event in Uganda in a library, the Lira Public Library because students were able to go there right?</p>\n\n\n\n<p class=\"wp-block-paragraph\">We were trying to make it as barrier free for students wherever their campus is. And so that&#8217;s, I think, the main difference. It&#8217;s more wide ranging in terms of who can participate as a student. And then also the fact that it could be a one-off event, so a one day event. A lot nowadays are multiple day events, they&#8217;ll maybe go two times out of a month, or a couple days consecutively. And then after that it&#8217;s up to really the organisers in the institution whether or not we have another addition on their campus the same year, or the next year.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:22:15] <strong>Nathan Wrigley:</strong> I&#8217;m going to tease out a few things. I just want to point out to, me as an English person, that is to say, not an English speaker, but somebody from England, campus has a really defined definition, and it&#8217;s usually bound to a university. Whereas it sounds like the description here, campus literally means the place where education happens, not it&#8217;s 18 years old and older, you know, people doing degrees, bachelors and PhDs and that kind of thing. Basically, if there&#8217;s an institution somewhere, that&#8217;s what the campus is in this case. Okay.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So the WP Credits program sounds like you forge your relationship with the university, and correct me if I&#8217;m wrong, it sounds like it takes place inside that institution, and it&#8217;s part of that program and what have you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The Campus Connect initiative is much more ad hoc. It could be a one-off, it could be monthly, it could be inside a library, it could be inside the school, it could be an inside an institution. It feels a bit more like, I don&#8217;t know, a WordPress Meetup, but geared towards a younger audience or something like that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And the minimum age requirement is really driven by your capacity to type on a keyboard and hold a mouse and those kind of things. And that&#8217;s kind of curious to me because I think my educational experience was always younger children. It&#8217;s really interesting how patterns are laid down at a very, very early age. Patterns that go on into much later life get laid down, typically at incredibly young ages. So this is fascinating for digging into that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And it&#8217;s not just about, say, the code, it sounds like code is on the menu, but it could be about marketing, it could be about design. Basically the gamut of anything online, CMSy, those kind of things. Okay, is there anything you want to add? Did I misunderstand anything there, or misstate anything there?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:24:02] <strong>Destiny Kanno:</strong> No, I think you&#8217;re completely right. We&#8217;re trying to convey that WordPress isn&#8217;t just a blogging software that I think is still a lot of people have a mentality of. Like there are many ways to utilise it that goes beyond that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And one thing I did want to add are a couple numbers. So since WordPress Campus Connect became official in May of 2025, an official WordPress event series, I should say, we&#8217;ve had 42 completed events, with 71 participating institutions, and over 5,500 students have been reached.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:24:37] <strong>Nathan Wrigley:</strong> That&#8217;s something else. 42 events, 71 institutions, and I think you said five and a half thousand individuals. Good grief. I don&#8217;t know what the measure of success is for this, but that feels like success to me.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I mean, imagine turning up to a WordCamp, like a flagship WordCamp and five and a half thousand people descending on you. You&#8217;d feel slightly overwhelmed. That&#8217;s a lot, isn&#8217;t it? Gosh, that&#8217;s pretty remarkable. Wow. Congratulations.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:25:05] <strong>Destiny Kanno:</strong> And the majority, the outcome, the students make a website. So we could almost count those students as also new WordPress websites that are live now on the web. So within a year, organisers around the world have been able to make that happen.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:25:19] <strong>Nathan Wrigley:</strong> Could I just perhaps draw another distinction as well, just very quickly, because it sounds like the WordPress Credit system, because it&#8217;s binding itself to institutions, it sounds like there might be more paperwork going on there, and maybe more high level meetings that need to take place. Whereas Campus Connect feels much more community driven. It&#8217;s the kind of thing that, quite literally, anybody listening to this podcast with a fair wind could have one of those going in a handful of months. If they&#8217;ve got the right initiative and they can find the audience for that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Again, is that about right? There&#8217;s sort of more opportunity to become involved with the Campus Connect initiatives. You don&#8217;t need to have that academic background or have a point of contact at a university. You basically just need a building, some interest and a bunch of students.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:26:02] <strong>Destiny Kanno:</strong> Yeah, the key thing is, you know, having a real connection to the campus that you&#8217;re going to present at. But you&#8217;re exactly right. We tried really hard to lower the barrier to organise these events. Because I don&#8217;t know if you&#8217;ve organised a WordPress event before, there&#8217;s kind of a lot of hoops you have to jump through. And we&#8217;re like, okay, how can we think about this in a different way?</p>\n\n\n\n<p class=\"wp-block-paragraph\">And I think that also has positive repercussions for how we organise other events too, that are, changes are being thought about too so that we can enable people and empower them to put these events, instead of bogging them down and process and a little bit of bureaucracy to say.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:26:38] <strong>Nathan Wrigley:</strong> So what&#8217;s really curious about that as well is we&#8217;re all in different parts of the world, aren&#8217;t we? People on the call today are in Japan and I&#8217;m in Europe and, Anand, are you in India? I think.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:26:47] <strong>Anand Upadhyay:</strong> Yeah.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:26:47] <strong>Nathan Wrigley:</strong> Yeah. Each of those events, I guess would look quite different. The kind of nature of the attendees, the nature of the kind of building it might be in, the institution. And it really is, you just grab what&#8217;s around you I suppose, and work with that. If you&#8217;ve got a connection to an institution, you can go for it. Maciej, I feel like I crosstalked you. I think you wanted to say quite a few times and I&#8217;ve just interrupted. I&#8217;m very sorry.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:27:08] <strong>Maciej Pilarski:</strong> No worries about that. So I wanted to add that those initiatives set backgrounds for each other. Because in some uni institutions, the interest sparks with a Campus Connect event, and that gets the institution interested in those initiatives, which sets background for WordCamp Credit.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And it happens also the other way around, where we start with an institution that starts credits and then we get the students interested in WordPress in general, the community, which leads to a Campus Connect event during the Credits Program. What is important is that those initiatives don&#8217;t compete with each other. They support each other.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:27:51] <strong>Nathan Wrigley:</strong> Right, so there&#8217;s a lovely virtuous cycle there, isn&#8217;t there? Where the two things can be going on in harmony, one promoting the other and they&#8217;re definitely not in competition. Okay. That&#8217;s really interesting.</p>\n\n\n\n<p class=\"wp-block-paragraph\">One final question on Campus Connect, and I&#8217;ll direct this at Destiny, just because she&#8217;s been handling that. With the WP Credits thing, there is this moment where you hold the certificate in your hand and you go, yay, did it.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Is the same thing true of Campus Connect or is it more of a show up to the one event, you know that you did that, that was great, you can file that away in your own head as a thing? Or is there some sort of accreditation, or certificate giving, or badge giving, or profile updating that might go on on wordpress.org? Is there any sort of thing that the attendees receive, and I suppose that the people that are organising might receive as well?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:28:37] <strong>Destiny Kanno:</strong> Yes. So we do have a certificate of participation that students can receive signed by WordPress Foundation Executive Director, Mary Hubbard. And that just needs to be requested by the organisers ahead of time, because we need to get the signature and all that. So yes, they can come away with that. And we&#8217;ve heard really positive things about that, like it motivates them. They&#8217;re like, yeah, I did something, which they did.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:29:01] <strong>Nathan Wrigley:</strong> There we go. That was WP Credits and WP Campus Connect.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Can I just say at this point, dear listener, if at this point you&#8217;re thinking hang on a minute, there&#8217;s a lot going on here, don&#8217;t worry, there&#8217;ll be show notes. If you go to the WP Tavern website, there&#8217;ll be show notes. I&#8217;ll try to list out as many sensible links to get you to the root of each one of these initiatives, so that you can begin your journey and fan out from there.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;m not sure what episode number this will be, but if you just go and search for, oh, I don&#8217;t know, Destiny or Anand or Maciej, you could probably find the episode that way. And all the show notes will contain all of the links.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Right, in which case, I think it might be Anand&#8217;s turn. What have you decided to take on Anand?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:29:39] <strong>Anand Upadhyay:</strong> So I will be sharing my thoughts on the third part of this whole education initiative ecosystem. So that is a Student Club. Just a few minutes before you were giving the analogue of meetup with this Campus Connect. So I would like to share the same analogue with us because we are more accustomed with like other terms of WordCamps and Meetups and contributer days.</p>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress Campus Connect is kind of like a WordCamp happening in the campus, because it&#8217;s like a big day event that holds everything happening, different kind of sessions, maybe workshops happening. So I would compare it with that thing.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And same way, credits thing, Credit Program is kind of like ongoing contribution series because more focused on the contribution part because the student devote 150 hours of their program. A lot of period goes to the contribution.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And now the same way we, if we talk about the Student club, it&#8217;s similar to like the Meetups that we have. But these are the in campus meetups for the students and by the students. How do things get started? Like the Campus Connect introduce the WordPress to those campuses and to those students, but since most of the campus, it&#8217;s a once in a year event. So once this event has sparked something about the WordPress in the students. So keeping that momentum going on, that&#8217;s where the Student Clubs come in.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So with the Student Club, it&#8217;s kind of like, as I mentioned, it&#8217;s like an in campus meet program. So a student can gather themselves, they can form a club and a couple of students can be nominated as club organisers, student club organiser from their campus. And then they organise the in-campus events, maybe like once in a month or twice a month, depending on academic calendar. There are a lot of hurdles in doing those things continuously.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But they usually do once or twice a month. They do a kind of a meetup in their campus. The students gathered together. They learn from variable resources available from WordPress. And from those resources, they share with the other students. It&#8217;s kind of a group learning, group study, that we use. Education live, we always do that. It&#8217;s kind of a group study. They&#8217;re learning from themselves. If someone has learned something, they are helping others to learn those things.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So I would just like to give some of the examples from my city. There are multiple Student Clubs are going on. When we went to the campus, we just taught like a small group of students about the WordPress, because we&#8217;d have some limitations of the resources, of the setting arrangement. We cannot call all the students of the campus and, okay, come together and I have a amazing workshop. So we have given the WordPress walk through to the limited number of students.</p>\n\n\n\n<p class=\"wp-block-paragraph\">After that, they form a Student Club in their campus because they got very much interested. Then the first session they did was like, they started teaching to their juniors, like the students who have just entered the campus. They took a session for them. So they told, whatever we have told them, they have taught the same thing to the juniors.</p>\n\n\n\n<p class=\"wp-block-paragraph\">After that, in the next few session, they experimented different things. Like in some session they&#8217;re just doing a fun quiz around WordPress. And in some sessions they are doing a kind of like a, I would say like a hackathon kind of thing. So they are just picking up a website. Or you can, just similar to the speed build challenge that Jamie do. So they have just one website open on the screen and everybody&#8217;s like cloning that website.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So there are different ways students are engaging through those student clubs. So it is helping to keep the momentum going on so that the student keep learning about WordPress and they are also connecting with the community members for the guidance about how they can learn more. What should they learn next if they are sharing their experience. Like we have covered these things and, what should we go next?</p>\n\n\n\n<p class=\"wp-block-paragraph\">And in the recent WordCamp Asia, they&#8217;re also one of the Student Club lead from my city. She joined the event and there are conversation with the, like other community members who has offered them like, okay, we can come to your campus, or we can do, have a webinar for your campus where we can teach you particular subjects, particular topics. Maybe they can talk about SEO, maybe they can talk about plugin development.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So this is also opening the horizon for them, to learn from people across the world. So that is how the Student Clubs are happening. The examples I&#8217;ve gave, again, from my own city because I&#8217;m closely mentoring them, but there&#8217;s similar things are happening across the world.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So it is helping to create a kind of sustainable environment for the long-term sustainable environment in the campus. So the next time when we go to that campus, we are not going to teach like the basics of WordPress, because we want like, the ecosystem should be built within the campus, so every student know about the WordPress. Because last time when we went to the campus, we have to tell everything about WordPress because why you should learn WordPress.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So the Student Clubs, my ambition is that, wherever the Student Club is from, next time a Campus Connect event is happening, next time we should not tell them about what is WordPress and why they should learn this thing. There should be already a sustainable ecosystem.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And I feel that all these three programs are like very much interconnected. And the real impact of these programs, we will be able to see in the next two or three years. And there will be a regular ongoing activities around WordPress in the campus.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And these are also kind of a balance program as well. Like the Campus Connect is introducing WordPress to the students, Credits Program is motivating them more towards like the contribution part. And I would say that Student Clubs is more inclined towards getting new users to the WordPress. Because if we keep on focusing on the contribution, contribution, but if we discard the like increasing the number of new users, so we are not going to win. We need a balanced state.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The Student Club is trying to, learning how to build website, how to mastering the skills of the WordPress. And later on, many of them are going to join the contribution part as well.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So this whole ecosystem is built around bringing more people to the contribution, bringing more people to use WordPress, build websites, as in, for the individuals as a business as well. So that&#8217;s how all these three programrs are very much interconnected, and growing together fast.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:35:16] <strong>Nathan Wrigley:</strong> It feels like, of the three things that we&#8217;ve talked about, so WP Credits, Campus Connect, the Student Club, this final one that you&#8217;ve just covered, it feels like that&#8217;s got a very flat hierarchy to it. In other words, there&#8217;s like this peer learning. So it feels like more or less anybody can show up and demonstrate anything, which might then lead to somebody else thinking, okay, that was interesting, I&#8217;ll take on next month&#8217;s one because I&#8217;ve now seen that&#8217;s doable. Less hierarchy, if you know what I mean? So a much more flat structure.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:35:45] <strong>Anand Upadhyay:</strong> Because when we started Campus Connect, we also get a lot of attraction in the local community as well. And people join our Meetup groups. But then it becomes difficult for us, how to plan about the topics for our meetup. We have some experienced professionals coming in. We have some students coming in, and we plan the topics that suits the professionals. The student will feel like, okay, what&#8217;s they&#8217;re talking, we are not getting anything in our mind. If we bring the topics, very basic topics and the professionals who are joining the community meetups, they&#8217;ll feel like, okay, these are very basic stuff, why am I coming here?</p>\n\n\n\n<p class=\"wp-block-paragraph\">Student Clubs giving them their own platform, giving them a own opportunity. Okay, these are all the familiar faces. It is also giving the opportunity to come on the stage, come onto the stage and get out of your fear as well. It is also generating leadership qualities in them. Okay, we have to keep this momentum going on and we have to keep the activities going on. So there are a lot of ways, apart from learning WordPress, there are a lot of other ways it is helping the students as well.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:36:40] <strong>Nathan Wrigley:</strong> When you have to stand up in front of a bunch of people and deliver something, obviously there&#8217;s a whole bunch of us that are just really confident at doing that, quite happy to stand up and do that kind of thing off the bat. But equally, there&#8217;s people for whom that is just the most terrifying experience possible. You know, standing up in front of two or three people, oh boy, you know, anything above that is just off the books.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And I was just wondering about that, whether or not there&#8217;s, in this particular style of event, the Student Club, whether there is a growing corpus of, I don&#8217;t know, previously done topics or topic suggestions or slide decks or anything like that, which might enable people to feel that level of confidence? I don&#8217;t know if that&#8217;s something which is being put together. Just resources which enable somebody who doesn&#8217;t have the confidence, let&#8217;s go with that word, who then may gain that confidence. And I&#8217;m going to pass this to Destiny because she&#8217;s waving her hand.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:37:30] <strong>Destiny Kanno:</strong> I was really hoping I could shamelessly plug this project. This is like, you&#8217;ve said the most opportune thing. So I&#8217;m actually developing right now what I&#8217;m like tentatively calling the Meetup Activity Library. It comes with like kits on certain topics. So for example, WordPress Playground was the first one I built. But it comes with the facilitation guide, which is a doc. So the facilitator can read through, understand the steps they&#8217;re going to go through in the activity, how to pace it. And then a presentation deck which they would display, if that&#8217;s available to them, to the folks that they&#8217;re presenting to. And it&#8217;s a hands-on activity only. So it&#8217;s not only presentation. The facilitator of course guides and talks them through things, but then people are getting hands-on experience with that topic along the way.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:38:16] <strong>Nathan Wrigley:</strong> That is a beautiful remover of barriers, because I think just having that little document, that little crutch, you don&#8217;t have to feel that you, okay, I&#8217;ve got to come up with a topic. Not only have I got to come up with a topic, but then I&#8217;ve got to research the topic, deliver the topic. If you can have it all on a thing that you can crib from, I don&#8217;t know, it just arms you with that confidence as you walk in. I think that&#8217;s such a brilliant topic. And, Maciej.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:38:40] <strong>Maciej Pilarski:</strong> Both Destiny and Anand mentioned two keywords, sustainability and facilitator. The goal of also getting all those educational initiatives going is also create in a sustainable way. We&#8217;re not pushing for numbers, but growing them in a smart way where we don&#8217;t get too many students so we get overwhelmed. We need to have enough mentors to accommodate those students, and also enough facilitators to be able to scale the program, to grow it in the future.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And it&#8217;s exactly what Destiny is now doing, the Facilitator Training Program, which gets more people from the educational sectors, community organisers, everyone on board, to jump on those educational initiatives and help us to grow. Because the number of every, all those students involved in participating in those programs is increasing and we need to be able to accommodate them. And through the Facilitator Training Program, this allows us to do that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:39:42] <strong>Nathan Wrigley:</strong> It&#8217;s so interesting in open source software spaces as opposed to corporate spaces. I suppose the metric of success for anything like this in the corporate universe would be how many people showed up and gave us money in exchange for this knowledge or, you know, something akin to that. Basically a metric of humans in a room and money gained. And of course, the measurement of this is so not that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I did wonder, Destiny obviously very proudly rattled off the statistics for Campus Connect, you know, the five and a half thousand attendees and all of that. I wondered if there were success criteria of some kind in the background, which guide you. You know, it&#8217;s not like, okay, well we didn&#8217;t meet that we&#8217;re going to abandon it all. But more, things like you would like to see happen, so aspirational goals. It sounds from what Maciej was saying that maybe the attendance growing slowly over time is some kind of measure of success. Maybe there is none of that, but I&#8217;ll just open that one up to see if you want to take that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:40:38] <strong>Destiny Kanno:</strong> I think one definite measure of success is repeat events on certain campuses. So if the campus is saying, we love that, please come back, or please come again soon. I think that is a really great indicator that, not only did the students get something great out of it, but the school believes in it. And that&#8217;s what we want to do. We want to create these systems that, not only bring people into WordPress, but also continue this cycle of, you know, growth within the community, but also ownership by the institution.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Another measurement of success is the institution is like, okay, great, how do we learn how to do that ourselves? So we have some folks now working in the institution that are organising WordPress Campus Connect events that are helping facilitate these Student Clubs. So the faculty and educators themselves, they&#8217;re directly getting involved. And that for us as community members too, whose volunteer time is quite limited, as Maciej was saying, like it is a great multiplier that makes everything much more sustainable.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:41:45] <strong>Maciej Pilarski:</strong> So from the WordPress Credits perspective, we don&#8217;t hope all the students to turn into contributors. That would be amazing but that might not happen. I can share with you some numbers. So currently we have 450 students globally enrolled. For the whole program so far, 75 graduates.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We hope that some or as many as possible of those graduates who completed the program will stay and become active contributors to the WordPress community, stay engaged.</p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s one of the goals we are aiming for the Credits Program, to not just get this done, but this is building the next generation of contributors. We know that like we are ageing, we&#8217;re getting older every year. We are not getting younger, unfortunately. Getting those students staying in the community allows us to build those next generations of WordPress contributors that will also have completely different perspectives to how the community functions, how it was built.</p>\n\n\n\n<p class=\"wp-block-paragraph\">What brought us here might not move us forward. So these new students will bring us this new, fresh perspective of how they would like the community to function and move it to the future, to be current, to stay up to date with what&#8217;s happening globally.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:43:00] <strong>Anand Upadhyay:</strong> That&#8217;s why it&#8217;s very difficult to like measure the impact in numbers because how it is impacting in the longer term. But yeah, it&#8217;s going to impact. And I would say also, like Destiny mentioned, one of the metrics is like this campus is willing to have the Campus Connect again and again in the campus.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So I just want to share one more. Like I just recently got a call from one of the faculty coordinators from one of the campus where we have a Student Club. And now they have like two months of vacations. And he called me like, okay, now the vacations are going on, students will not be here, so what can we do for the students to keep their involvement with the WordPress in those two months? So can we do something online? Can we do something like this?</p>\n\n\n\n<p class=\"wp-block-paragraph\">When we get these calls, these kind of communications, that these are interactions that we have, this gives us a sense of like accomplishment. Okay, yeah, we were able to create some kind of interest in the students. Because we cannot expect that if we are going to like any campus and 100 or 200 students are participating in our Campus Connect, they are all going to jump into the WordPress. They are getting a lot of different kind of opportunities as well.</p>\n\n\n\n<p class=\"wp-block-paragraph\">There are other technologies as well, which are, some students are going into that, some students are going into that. But we are showcasing the WordPress as one of the career opportunities. And they have a choice of multiple options, so they will choose what they do. But yeah, the impact will be seen in the next few years. Just like Maciej said, mentioned that he went to the WordCamp as a volunteer and it&#8217;s bring him into the community.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And the same is with me. I attended the WordCamp and just after coming out of the WordCamp, I started the Meetup group in my city. So I got inspired from that. So that is a result of that WordCamp. And that cannot be measured in the numbers. That can only be sensed when we are doing this kind of conversation. Okay, that WordCamp helped me, that WordCamp helped me.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The same way in future, these students who will join the community or the WordPress industry, they will be talking about, okay, I got first introduced about WordPress through a WordPress Campus Connect event or I got introduced to the contribution through WP Credits Program. So when these conversation will be happening in the future, then we will say that those are the real metrics that we are looking for.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:45:00] <strong>Nathan Wrigley:</strong> That&#8217;s really interesting, and I like that. It sounds like there&#8217;s not so much a focus on statistics, you know, literal, brutal numbers, more kind of playing it forwards and measuring the impact over many years, not, you know, a handful of months into the future.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:45:15] <strong>Destiny Kanno:</strong> So yes, we&#8217;re not like, okay, here&#8217;s our KPIs, you know, and here&#8217;s our hard metrics. But one thing I really noticed that our community is, it could be better at doing, is just talking about what happened. Because then you hear all these success stories and there are numbers in that. So like for example, Ajmer again, Women&#8217;s Day event this year. 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} of tickets sold were to students. And that&#8217;s directly because of the involvement in going to these campuses and teaching WordPress. And I&#8217;m like, that&#8217;s amazing, that&#8217;s direct injection of 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} youth into the WordPress community.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:45:52] <strong>Anand Upadhyay:</strong> And they sold out so fast.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:45:53] <strong>Destiny Kanno:</strong> And they sold out really fast, yeah.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:45:55] <strong>Anand Upadhyay:</strong> The organisers were hoping like, now we have to pitch out to sale our tickets. And they have planned a social media campaign around that. Okay, we will be periodically pitch a student on the social media to encourage the ticket purchase. And within one day, we sold out. And the whole social media campaign was like their whole planning was gone. We don&#8217;t have tickets.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:46:14] <strong>Nathan Wrigley:</strong> It&#8217;s really interesting that there&#8217;s all this success going on, and yet, as Destiny said, it is hard to get that discovered. Maybe it&#8217;s a case of shouting louder about the previous success. Maybe things like this podcast will help in some small way for things like that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But I know what you mean. There&#8217;s a lot of people talking about the code, and there&#8217;s a lot of people talking about the plugins and the themes and whether or not we&#8217;re going to get collaborative editing in version 7 or 7.1. All of that seems to suck up all of the oxygen in the room. And yet, without a throughput of, let&#8217;s go for young adults, coming into the WordPress space, there&#8217;s not really a great deal of hope for a project over decades unless we get people of a much younger age beginning now. And I&#8217;ll just hand the torch to Maciej because I think he&#8217;s got something to add.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:47:05] <strong>Maciej Pilarski:</strong> But this is also changing because at WordCamp Asia, we were able to introduce the educational table during the contributor day. And I&#8217;m also organiser of WordCamp Europe that&#8217;s going to happen really soon in two, three weeks, beginning of June. And during WordCamp Europe, we will also have a contributor table, dedicated to education, but for the first time also educational track.</p>\n\n\n\n<p class=\"wp-block-paragraph\">During the second day, we will start the whole day with topics related to education. We will have a discussion panel rethinking learning in WordPress that Mary will be participating. And later in that afternoon, we will have actual students, who take part in the program. Sharing the experience, presenting the results. Not only students from universities, but I&#8217;m also leading a group of high school students who&#8217;ve been working for the whole past semester with a teacher on some projects related to WordPress building websites. So they are super eager and excited to show them.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We will also showcase some students, teachers stories, how both of those sites motivated each other, learn from each other, and basically help us keep growing the community.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So WordCamp Europe definitely will feature some of those things. And we&#8217;re slowly introducing more and more those things into those flagship events and into the broader community.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:48:28] <strong>Nathan Wrigley:</strong> Really nice. Yeah, that&#8217;s really nice to hear. I think it&#8217;s a difficult circle to square, the idea of making this stuff visible so that everybody&#8217;s aware of it. Even if they&#8217;re only interested in running their agency, or writing code or whatever it is. Maybe to realise that this is some version of the underpinnings of the WordPress community without which the software ultimately doesn&#8217;t exist.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And it is quite curious. I don&#8217;t know if I&#8217;m reading between the lines here, I think I&#8217;m not, but I get the impression that, I&#8217;m going to use the phrase like, I don&#8217;t know, from higher up, let&#8217;s put it that way. It feels like education is taking a more central place. It feels like for example, Mary Hubbard, it feels like you&#8217;ve got a real advocate there. Again, I could be reading between the lines, but it feels like the words coming out of her mouth, I hear the word education coming out of her mouth quite a lot when she&#8217;s on stage.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So it feels like you&#8217;ve got some big hitters, let&#8217;s go with that. I don&#8217;t know if you&#8217;ve got anything you want to add to that, but it feels like the importance of this is more profound this year than it was a few years ago.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:49:33] <strong>Maciej Pilarski:</strong> You are correct. Mary is a big supporter of that and she also created this space for us to grow those initiatives that like allows us to grow that. Isotta started the first Credits Program at the Pisa University as an experiment. And from there it was proven that this actually works. It gets us universities and new contributors.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And then on the other side, there was those Campus Connect events that also organically grew up on their own. So basically there was a need. It feels like there was this hive mind somehow that worked also for all of us. All of us felt this need to introduce those things. It looks like we&#8217;ve reached a certain growth level for the community that we organically felt that that&#8217;s the direction that we should start heading.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:50:24] <strong>Nathan Wrigley:</strong> Yeah. What&#8217;s interesting there as well is that it very much overlaps with maybe a concern. So we&#8217;ve touched on this at various points without saying it out loud quite. If you go to, and I&#8217;m going to exclude WordCamp Asia 2026 from what I&#8217;m about to say, because that event was very different. If you go to a typical WordCamp, the age skews, and I&#8217;m doing air quotes, older. You don&#8217;t typically look around and see a bunch of teenagers.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So that&#8217;s a concern. There&#8217;s this, like a pyramid, like a reverse pyramid, and if we don&#8217;t get the younger people coming up, the edifice of this entire project kind of becomes a lot more shaky. And we&#8217;ve lived through 22 plus years of WordPress, and I think quite a lot of those people began, a lot of the people who&#8217;ve been involved in the community began their careers using WordPress and they&#8217;ve kind of moved through WordPress as it&#8217;s evolved over those 22 years.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And not to, I don&#8217;t know quite how to say this. At some point they&#8217;re going to stop contributing. Their age will become something, you know, they want to retire or they want to move on or do some other things. Unless we build the scaffolding and put things in place so that young people feel they&#8217;ve got a place here, feel that, I don&#8217;t know, some proprietary system is not the way they want to go, they want to support the ethic of open source.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Unless these building blocks, these educational building blocks are put in place, then that&#8217;s going to be a bit of a concern. So to your point, Maciej, it organically grew. And what a nice thing that it did kind of organically grow because it&#8217;s sorely needed at the same time. There isn&#8217;t really a question in there. But anyway, there&#8217;s my observation. Anand, did you have something to say? I think you did.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:52:04] <strong>Anand Upadhyay:</strong> Yeah. So just want to add that thing you have raised recently. So the way that we want to teach the students about the open source as well, because if you go to the WP Credit curriculum, so the initial lessons, they learn through the, given to them to learn from the learn.wordpress. So it&#8217;s all about like open source ethics, and how the WordPress community, WordPress project works.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So this opens up their mind about the open source. Because in the education system, it is something that is not clearly mentioned. There are simple, just simple definitions around the open source. But open source is much more than those definitions.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And especially the open source community like WordPress. It&#8217;s more about the people. So the students also learn about how the community is working, how the people are working from the different time zones, people are joining hands for running the bigger events like WordCamp Asia or these Credits Programs. The students will learn all those things as well, and I&#8217;m sure when they will join as a contributor in the future, they will have lot of experience before joining as well.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:53:02] <strong>Nathan Wrigley:</strong> Thank you. I love that expression, by the way. You just dropped it in in the middle of a sentence there. You said people are joining hands. What a perfect summation of the entire enterprise being discussed today. Maciej, you raised your hand.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:53:14] <strong>Maciej Pilarski:</strong> Yeah, and besides the community goals and keeping it going, I have also a very personal goal that also is behind all of those things that I do. From my own experience, I had a pretty difficult and bumpy educational path, let&#8217;s call it. Unlocking those possibilities for those students, helping them out, making it easier for them, it&#8217;s one of my very personal goals, because I know it does not need to be very difficult or crazy when you study, especially when you are young. You&#8217;re not sure fully which direction you would like to go. So creating for them, one of those opportunities that might click for them is also something very personal and close to my heart. Because not everyone needs to struggle or have like difficulties, so.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:53:58] <strong>Nathan Wrigley:</strong> I am so glad you said that because that encapsulates all of it. That&#8217;s the entire point. It&#8217;s got to be that, right? So we&#8217;ve spent a long time talking about the minutiae of this, that, and the other thing. It all goes, like they&#8217;re spokes on a wheel. And the whole point is that little bit in the middle, which is the child, the adult, the human being somewhere who just wants to make use, wants to grow, wants to learn things, wants to figure things out.</p>\n\n\n\n<p class=\"wp-block-paragraph\">With open source, with this kind of learning, there is potentially zero impediment, or at least very few impediments to actually get that learning underway. And so I think maybe we lost sight of that in this conversation a little bit. So I&#8217;m glad that you grounded it there, Maciej, right towards the end. That&#8217;s perfect. Destiny, was there anything you wanted to say? I don&#8217;t know if you were indicating that you did.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:54:48] <strong>Destiny Kanno:</strong> I know we&#8217;re like probably over time, but there&#8217;s still so much to share. Like even thinking about keeping WordPress relevant, right? For us and then also for youth. I think about the new AI Leaders Credential that was announced and is being worked on. And how tying WordPress to AI is like really helping students engage more, and see like the relevancy of it in a different way. Not even for the students, like for me, that&#8217;s challenging me and I think other organisers and learners of WordPress to be adaptable and think about WordPress differently in a new way of this year as AI keeps advancing.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And then you were also talking about wins, right? How do we celebrate that? I did want to surface, we have the Education Buzz Report, which goes out every month, which aims to try to surface all of these educational wins that are happening in the community. And I just have received some further collaboration from marketing to hopefully also broadcast that on our socials going forward so that we do get the word out.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And lastly, like celebrating the students too. There was a post that went out about the Student Clubs and the success. And we just want to make sure that in this, that they feel seen, right? And that this feels like a space for them. And I know WordPress Credits, we&#8217;re working on something to showcase, no, something went out recently. A post went out recently to showcase some of the successes of the students. And we just want to keep highlighting that as well. Because their work and the way they operate, especially because they&#8217;re coming in with different lenses, is really important to showcase and highlight and make sure that they feel like they deserve that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:56:26] <strong>Nathan Wrigley:</strong> Yeah, there was a post, I&#8217;ll try and link to it. I think it was like a week ago about the Student Clubs. There were three or four images, three or four photos and there were so many smiling faces in those pictures. It was absolutely lovely. Lots of people gathered in classrooms. I couldn&#8217;t exactly tell where, but it was just so nice seeing people kind of enjoying WordPress, having a nice time, bit of camaraderie, hanging out with each other, learning things. It was absolutely wonderful.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Unfortunately, I think time might have got the better of us. Hopefully, dear listener, what you&#8217;ve gained is an understanding that there&#8217;s so many layers to this educational initiative. It doesn&#8217;t appear to be in any way standing still. It&#8217;s growing. It&#8217;s interesting. There&#8217;s a lot going on, and you can be involved.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I will put links in the show notes to any of the places where I feel you would be best making a start with that. Maybe the contributors to this panel can drop some things, you know, if they&#8217;ve got a particular link. So again, wptavern.com. If you want to go over there, we will look for the links.</p>\n\n\n\n<p class=\"wp-block-paragraph\">This giant edifice that you maybe know nothing about, and maybe at the end of this episode, some parts of you is tuned in and thinking, I would like to be involved in that. And the truth is, you can be. It&#8217;s all available to you to get involved and you could start today.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So there we go. With that said, I&#8217;m just going to say a great big thank you to Destiny, to Anand, and to Maciej. It kinds of feels like we need to come back. Let&#8217;s do it again in six months or so, and we&#8217;ll see where we&#8217;re at. Oh, I&#8217;ve got a lot of nodding faces. That&#8217;s nice. So maybe we&#8217;ll revisit this in a few months time.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But seriously, from the bottom of my heart, Destiny, Anand and Maciej, profound respect to you and all of the different things that you are doing. Thank you so much for chatting to me today.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:58:13] <strong>Anand Upadhyay:</strong> Thank you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:58:13] <strong>Maciej Pilarski:</strong> Thank you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:58:14] <strong>Destiny Kanno:</strong> Thank you.</p>\n</div></details>\n\n\n\n<p class=\"wp-block-paragraph\">On the podcast today we’re joined by three WordPress education initiative leaders, Destiny Kanno, Anand Upadhyay and Maciej Pilarski.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Together, they have spent years at the heart of WordPress training and outreach, working in roles spanning community education management, plugin development, and credit program administration. Their efforts have helped shape student engagement and university partnerships across the globe, introducing thousands of learners to WordPress. You can see their bios further down.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The conversation focused on the current landscape of WordPress education, with particular attention to three key initiatives: the WordPress Credits Program, Campus Connect, and Student Clubs. Each initiative is designed to provide unique entry points for students of all ages and education levels, from high schoolers building their first site in a library, to university students earning official credits for open source contributions.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We discussed the different approaches these programs take: WP Credits ties student work directly to academic credit and mentorship, Campus Connect provides flexible, community-driven events in diverse locations, and Student Clubs foster sustainable, peer-led learning within schools and other institutions. We explored how these models feed into each other, building a sustainable ecosystem for ongoing growth in the WordPress community.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We also got into the importance of repeat campus partnerships, the need for scalable facilitator training, and the role of recognition: certificates, badges, and public showcases, in keeping students motivated and validated in their journey.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you’re curious about the growing movement to bring WordPress knowledge to the next generation, or are looking to get involved with education in your local community, this episode is for you.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Useful links</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Previous episode of the podcast related to this episode:<br /><a href=\"https://wptavern.com/forums/topic/183-destiny-kanno-isotta-peira-and-anand-upadhyay-on-how-wordpress-is-shaping-the-future-of-education-for-students-worldwide\">#183 – Destiny Kanno, Isotta Peira and Anand Upadhyay on how WordPress is shaping the future of education for students worldwide</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://make.wordpress.org/community/\">WordPress Community Team</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://events.wordpress.org/campusconnect/\">Welcome to WordPress Campus Connect</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://profiles.wordpress.org/stephendumba1/\">Stephen Dumba&#8217;s WordPress.org profile</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://make.wordpress.org/handbook/wordpress-credits-contribution-internship-program/\">WordPress Credits: Contribution Program for Students</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://wordpress.org/education/student-clubs/\">WordPress Student Clubs</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://events.wordpress.org/campusconnect/2025/ajmer/\">WordPress Campus Connect in Ajmer</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://make.wordpress.org/community/2026/05/01/peer-review-needed-hands-on-wordpress-meetup-activity-library/\">Peer Review Needed: Hands-On WordPress Meetup Activity Library</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://make.wordpress.org/community/2026/04/03/introducing-the-wordpress-facilitator-training-program/\">Introducing the WordPress Facilitator Training Program</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://wordpress.org/news/2026/02/ai-leaders-credential/\">Piloting the AI Leaders Micro-Credential</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://make.wordpress.org/community/2026/06/03/monthly-education-buzz-report-may-2026/\">Monthly Education Buzz Report – May 2026</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://learn.wordpress.org\">Learn WordPress</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://wordpress.org/news/2026/04/student-clubs-build-momentum/\">WordPress Student Clubs Build Momentum</a></p>\n\n\n\n<h2 class=\"wp-block-heading\">Links provided by the guests</h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WordPress.org Education page:<br /><a href=\"https://wordpress.org/education/\">https://wordpress.org/education/</a> (and all subpages)</li>\n\n\n\n<li>WordPress Credits Institution application form:<br /><a href=\"https://make.wordpress.org/handbook/wordpress-credits-contribution-internship-program/#get-involved\">https://make.wordpress.org/handbook/wordpress-credits-contribution-internship-program/#get-involved</a></li>\n\n\n\n<li>Call for WP Credits mentors and mentor application form:<br /><a href=\"https://make.wordpress.org/handbook/wordpress-credits-contribution-internship-program/a-guide-for-wp-credits-mentors/call-for-mentors/\">https://make.wordpress.org/handbook/wordpress-credits-contribution-internship-program/a-guide-for-wp-credits-mentors/call-for-mentors/</a></li>\n\n\n\n<li>Any companies interested in supporting the Credits Program:<br /><a href=\"https://make.wordpress.org/handbook/wordpress-credits-contribution-internship-program/get-involved-company-guide/\">https://make.wordpress.org/handbook/wordpress-credits-contribution-internship-program/get-involved-company-guide/</a></li>\n\n\n\n<li>Student form to apply their institution for the Credits Program:<br /><a href=\"https://airtable.com/appIzQKfwTn5dyPVp/shr6Gf1mMMEAxevw4\">https://airtable.com/appIzQKfwTn5dyPVp/shr6Gf1mMMEAxevw4</a></li>\n\n\n\n<li><a href=\"https://make.wordpress.org/community/handbook/education/wordpress-facilitator-training-program/\">WordPress Facilitator Training Program</a></li>\n\n\n\n<li>Education buzz reports: <a href=\"https://make.wordpress.org/community/tag/education-buzz/\">https://make.wordpress.org/community/tag/education-buzz/</a></li>\n\n\n\n<li>Apply to organize a WPCC event: <a href=\"https://events.wordpress.org/campusconnect/organize/\">https://events.wordpress.org/campusconnect/organize</a></li>\n\n\n\n<li>Apply to create a student club: <a href=\"https://make.wordpress.org/community/handbook/education/student-clubs/request-the-creation-of-a-wordpress-student-club/\">https://make.wordpress.org/community/handbook/education/student-clubs/request-the-creation-of-a-wordpress-student-club/</a></li>\n\n\n\n<li>Ai credentials:<br /><a href=\"https://wordpress.org/news/2026/02/ai-leaders-credential/\">https://wordpress.org/news/2026/02/ai-leaders-credential/</a></li>\n</ul>\n\n\n\n<h2 class=\"wp-block-heading\">Guest bios:</h2>\n\n\n\n<h3 class=\"wp-block-heading\">Destiny Kanno</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Destiny Fox Kanno, sponsored contributor acting as a Community Education Programs Manager at Automattic. Destiny works closely with the Community team and Training Team, with a focus on growing, enabling and amplifying WordPress Campus Connect, Student Club, WordPress Credits and other education initiatives.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Anand Upadhyay</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Anand Upadhyay is a long-time WordPress contributor and community advocate based in Ajmer, India. Active in the ecosystem since 2010, he has contributed to several Make WordPress teams including Core, Docs, Community, and Polyglots, with a strong focus on empowering others to get involved. He is the founder of <a href=\"https://wpvibes.com\">WPVibes</a>, a WordPress plugin development company that builds performance-driven tools for WordPress and WooCommerce users.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Anand is also a regular WordCamp speaker, Meetup organiser, and someone deeply committed to bringing WordPress education to students. In 2024, he launched the first WordPress Campus Connect event, which went on to become a global program officially recognised by the WordPress Foundation. Anand continues to support and mentor student communities through events, workshops, and open-source advocacy.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Maciej Pilarski</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Maciej Pilarski is a Community Wrangler at Automattic, where he works on WordPress.org with a focus on educational initiatives that connect the next generation of contributors to the global WordPress community.</p>\n\n\n\n<p class=\"wp-block-paragraph\">As one of the admins behind the WordPress Credits Program, Maciej works with universities across Central &amp; Eastern Europe and Asia to bring students into open source contribution, pairing them with mentors, building institutional partnerships, and helping turn academic coursework into real-world impact on software used by 43{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} of the web.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Originally from Poland and now based in Okinawa, Japan, Maciej brings a uniquely cross-cultural perspective to community building, bridging local ecosystems in places like Kraków, Riga, Tallinn, and Tokyo with the wider WordPress world. He&#8217;s passionate about making open source contribution more accessible and making sure the WordPress community reflects the full diversity of the people who use it.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 24 Jun 2026 14:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Nathan Wrigley\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:14;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:46:\"Open Channels FM: Revisiting What Matters Most\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2556050\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://openchannels.fm/revisiting-what-matters-most/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:205:\"In this episode, Bob Dunn recaps six months of key themes, highlighting the surge in AI discussions, ongoing debates about the open web, and WordPress\'s enduring relevance, while embracing honest dialogue.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 24 Jun 2026 12:58:56 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:15;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:77:\"Open Channels FM: BackTalk on Interoperability, Infrastructure and Pragmatism\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555826\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:83:\"https://openchannels.fm/backtalk-on-interoperability-infrastructure-and-pragmatism/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:147:\"Ongoing challenges in decentralized social networks, emphasizing the need for practical solutions and immediate usability for developers and users.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 24 Jun 2026 11:57:32 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:16;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Matt: No Bubble\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=153299\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://ma.tt/2026/06/no-bubble/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:425:\"<p class=\"wp-block-paragraph\">A throwback from 2007: a local Bay Area a cappella group called The Richter Scales made a Webby Award-winning viral video about how that bubble felt. <em>Hat tip: <a href=\"https://toni.org/\">Toni</a>.</em></p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n\n</div></figure>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 24 Jun 2026 06:57:52 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:17;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"WordPress.org blog: Browse the New Mercantile Swag Store\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=20930\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:50:\"https://wordpress.org/news/2026/06/open-web-merch/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3868:\"<p class=\"wp-block-paragraph\"><a href=\"https://mercantile.wordpress.org/\">Mercantile</a>, the official swag store of the WordPress project, has a newly redesigned storefront with a catalog that now sits front and center, and a design tuned to hold up across a wide range of screen sizes. There are also small touches, like automatically selecting a variant when only one is in stock and order emails styled to match the look and feel of the store.</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img alt=\"\" class=\"wp-image-20931\" height=\"1055\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/image-1.png?resize=2048{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C1055&#038;ssl=1\" width=\"2048\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Throughout the design, the storefront leans into the history and culture of WordPress. Visual and copy choices nod to familiar elements of the project, from the metabox and the admin bar to Wapuu making the occasional appearance, with small open source and code references for those who look closely. The aim was a storefront that feels uniquely WordPress.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Under the hood, the storefront shows what a modern WordPress and <a href=\"https://woocommerce.com/\">WooCommerce</a> site can do. It is built almost entirely with blocks, including a block-based cart, checkout, mini-cart, and order confirmation, supported by a set of custom theme blocks created for the store. The <a href=\"https://developer.wordpress.org/block-editor/reference-guides/interactivity-api/iapi-about/\">Interactivity API</a> powers the catalog navigation and modal states, the store runs on WordPress 7.0, and accessibility is built in throughout, honoring reduced-motion preferences across animations and meeting color contrast standards. Product pages surface per-product attributes such as size, material, and care, so shoppers have the details they need before adding an item to the cart.</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img alt=\"\" class=\"wp-image-20932\" height=\"800\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/image-2.png?resize=2048{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C800&#038;ssl=1\" width=\"2048\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\">This latest redesign supported the Mercantile booth at <a href=\"https://europe.wordcamp.org/2026/\">WordCamp Europe</a>. To make in-person sales work smoothly, the team enabled local pickup at checkout and added a set of event-only products refined to match the rest of the catalog. Fifty orders were completed at the event using in-person payments, a strong real-world test of the new checkout flow.</p>\n\n\n\n<p class=\"wp-block-paragraph\">There is more on the way! A playful experiment in progress will let curious shoppers explore a text-based version of the store from the command line, a small tribute to the developers who make up much of the WordPress community. Subtle hints pointing the way will appear once it is ready.</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img alt=\"\" class=\"wp-image-20933\" height=\"719\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/image-3.png?resize=2048{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C719&#038;ssl=1\" width=\"2048\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\">The new Mercantile is the work of many contributors who designed, built, tested, and refined it together. Every purchase supports the <a href=\"https://wordpressfoundation.org/\">WordPress Foundation</a>, a 501(c)(3) nonprofit organization, in its mission to democratize publishing and preserve open source software for generations to come. Take a look around and find something you love.</p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-3e41869c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https://mercantile.wordpress.org/\">Shop at <strong>mercantile.WordPress.org</strong></a></div>\n</div>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 22 Jun 2026 15:07:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"jillq\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:18;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:72:\"Open Channels FM: Navigating Burnout in the Age of AI-Driven Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555430\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:79:\"https://openchannels.fm/navigating-burnout-in-the-age-of-ai-driven-development/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:180:\"AI transforms developer workflows, causing cognitive overload and blurring work-rest boundaries. Establishing intentional breaks is crucial to maintain balance and prevent burnout.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 22 Jun 2026 10:08:08 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:19;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:24:\"Matt: Hill For A Stepper\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=153269\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://ma.tt/2026/06/hill-stepper/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:798:\"<p class=\"wp-block-paragraph\">In honor of Father&#8217;s Day, I wanted to add to the <a href=\"https://ma.tt/chuck/\">two quotes from my Dad&#8217;s obituary</a>, &#8220;Seven days without chicken made one weak.” and  “If you fail at raising your children, nothing else mattered.” with another saying he had.</p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Ain&#8217;t no hill for a stepper.</p>\n</blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;d like to learn more about this, <a href=\"https://waywordradio.org/stepper-like-you/\">check out this part of the A Way with Words podcast</a>, and apparently, it <a href=\"https://www.youtube.com/watch?v=Lui5y2AcYpM\">might have come from the musician John Gaar</a>.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 22 Jun 2026 06:58:38 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:20;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:25:\"Matt: Death by PowerPoint\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=153252\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:42:\"https://ma.tt/2026/06/death-by-powerpoint/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:760:\"<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">PowerPoint makes us stupid. </p>\n</blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">— Gen. James N. Mattis of the Marine Corps, the Joint Forces commander</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https://www.nytimes.com/2010/04/27/world/27powerpoint.html\"><img alt=\"\" class=\"wp-image-153254\" height=\"340\" src=\"https://i0.wp.com/ma.tt/files/2026/06/27powerpoint_CA0-articleLarge.webp?resize=600{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C340&#038;quality=80&#038;ssl=1\" width=\"600\" /></a></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Classic <a href=\"https://www.nytimes.com/2010/04/27/world/27powerpoint.html\">2010 NYT <em>We Have Met the Enemy and He Is PowerPoint</em></a>.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sun, 21 Jun 2026 06:03:40 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:21;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Matt: Best Trash\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=153245\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"https://ma.tt/2026/06/best-trash/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:1194:\"<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">A typography savant on staff had spent a month designing link underlines (literally just lines) that were more visually pleasing than Chrome or Safari’s defaults. On Tuesdays, engineers stayed late at the office, fixing design imperfections over dinner. One of them began a 2,500-word <a href=\"https://medium.com/@fat/mediums-css-is-actually-pretty-fucking-good-b8e2a6c78b06\" rel=\"noopener\" target=\"_blank\">post</a> about Medium’s CSS code with a quote attributed to Lil Wayne: “I believe that to be the best, you have to smell like the best, dress like the best, act like the best. When you throw your trash in the garbage can, it has to be better than anybody else who ever threw their trash in the garbage can.”</p>\n</blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">From Harris Sockel&#8217;s essay <a href=\"https://www.piratewires.com/p/what-happened-to-medium\">What Happened to Medium</a>, which I think is meant to be a dunk? But I think it&#8217;s awesome. Medium&#8217;s design and typography has always been really impeccable. I love when people obsess like this.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 20 Jun 2026 13:51:14 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:22;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:24:\"Matt: Midjourney Medical\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=153216\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:41:\"https://ma.tt/2026/06/midjourney-medical/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3191:\"<p class=\"wp-block-paragraph\">I&#8217;m sorry I couldn&#8217;t be there in person, but I was so excited to watch the <a href=\"https://www.midjourney.com/medical\">Midjourney Medical</a> launch from afar. This is a really big deal. <a href=\"https://x.com/DavidSHolz\">David Holz</a>, one of the most underrated pioneers in AI, has taken money from <a href=\"https://www.midjourney.com/explore?tab=top\">making cat pictures</a> to build a full-body ultrasound scanner that can give you <a href=\"https://www.midjourney.com/medical/blogpost\">incredible visibility in 60 seconds</a>.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img alt=\"\" class=\"wp-image-153220\" height=\"302\" src=\"https://i0.wp.com/ma.tt/files/2026/06/female_lower_abdomen_mask-458023b86b6cf387-1024x512.webp?resize=604{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C302&#038;quality=80&#038;ssl=1\" width=\"604\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\">You can <a href=\"https://x.com/i/broadcasts/1MJgNNoAPLyGL\">re-watch the livestream here</a>, which I recommend. You might remember David from Leap Motion, which <a href=\"https://ma.tt/2012/05/leap-motion/\">I blogged back in 2012</a>. It&#8217;s so cool to a small but mighty independent company innovate and apply learnings across seemingly disparate sectors.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I wish all my friends in jazz and the arts who are  despondent about tech could meet David:</p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">“We’re going to be a little confusing for the next six months as we announce all the things, but I’m hoping as they all are out there, they form a picture which I hope feels cohesive. Most of them are around creativity, but some of them, like this, are just around positive human futures that we actually want to be a part of. And I think this is an important thing for AI companies to do—for all humans to do.” — David Holz</p>\n</blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">If you understand imaging, you know the tradeoffs between X-ray, CT (computed tomography), MRI (magnetic resonance imaging), and ultrasound, and Midjourney&#8217;s approach doesn&#8217;t cover everything, but what&#8217;s incredible is the speed, amount of data, and using AI to process and get something useful out of it. Ultrasonics will be an incredibly exciting area over the next few years, first for imaging and later <a href=\"https://www.mayoclinic.org/tests-procedures/high-intensity-focused-ultrasound/about/pac-20596150\">for intervention</a>. I can imagine a future where you dip into one of these once a month just to keep an eye on things, not just to find bad stuff but to see the impact of exercise or dietary changes.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We&#8217;re fairly new to scanning healthy people, and I always advise friends getting their first whole-body MRI with <a href=\"https://www.biograph.com/\">Biograph</a> or <a href=\"https://prenuvo.com/\">Prenuvo</a> that it&#8217;s very common to hear something scary at first, only to find it&#8217;s benign. Also, I&#8217;ve now heard many examples of things that were caught and treated early, years before they might otherwise have been noticed.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 20 Jun 2026 04:09:58 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:23;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:79:\"WordPress.org blog: Kim Parsell Memorial Scholarship Opens for WordCamp US 2026\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=20927\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:64:\"https://wordpress.org/news/2026/06/kim-parsell-wcus-scholarship/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4552:\"<figure class=\"wp-block-image size-full\"><img alt=\"\" class=\"wp-image-20941\" height=\"1080\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/Kim-Parsell-Blog-post.png?resize=1920{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C1080&#038;ssl=1\" width=\"1920\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Applications are now open for the 2026 Kim Parsell Memorial Scholarship, which supports one active WordPress contributor who identifies as a woman and has not previously attended WordCamp US. The scholarship helps make it possible for a community member with financial need to join WordCamp US 2026 in Phoenix, Arizona, and take part in one of the largest annual gatherings in the WordPress project.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The scholarship honors Kim Parsell, a longtime WordPress contributor whose work and presence left a meaningful mark on the project. Kim was known for her care, generosity, and commitment to helping others feel welcome in open source spaces. For readers who are less familiar with her story, the <a href=\"https://us.wordcamp.org/2019/memories-of-kim-parsell/\">tributes shared by friends and colleagues</a> offer a deeper look at her role in the WordPress community and the lasting impact she had on those who knew her. Through this scholarship, the WordPress Foundation continues to recognize contributors who reflect that same spirit of participation and community.</p>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress is built by people from many backgrounds, experiences, and areas of expertise. Events like WordCamp US create space for contributors to meet in person, learn from one another, and continue the work that supports the software and the community around it. For some contributors, the cost of travel, lodging, and registration can make attending difficult. The Kim Parsell Memorial Scholarship helps reduce that barrier for one eligible contributor each year.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Scholarship Details</h2>\n\n\n\n<p class=\"wp-block-paragraph\">One scholarship will be awarded for WordCamp US 2026. Applicants must:</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Identify as a woman. </li>\n\n\n\n<li>Be actively involved as a contributor to WordPress.</li>\n\n\n\n<li>Have never attended WordCamp US before.</li>\n\n\n\n<li>Demonstrate financial need to attend the event.</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">The scholarship includes the cost of a WordCamp US 2026 ticket, round-trip flight, and lodging. Applications are open through July 10, 2026, and all applicants will be notified of the decision by July 24, 2026.</p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-background wp-element-button\" href=\"https://wordcampcentral.survey.fm/wcus-2026-kim-parsell-scholarship-application\" style=\"background-color: #6c214f;\">Apply for the Kim Parsell Memorial Scholarship</a></div>\n</div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p class=\"wp-block-paragraph\">WordCamp US 2026 will take place August 16–19, 2026, at the Phoenix Convention Center in Phoenix, Arizona. Contributors, attendees, volunteers, organizers, and sponsors will come together to share ideas, learn from each other, and continue building the future of WordPress. For many contributors, attending in person creates new ways to collaborate, find support, and stay connected to the open source work that happens throughout the year.</p>\n\n\n\n<p class=\"wp-block-paragraph\">To learn more about eligibility, visit the <a href=\"https://wordpressfoundation.org/kim-parsell-memorial-scholarship/\">Kim Parsell Memorial Scholarship page</a>. Community members are encouraged to share this opportunity with contributors who may qualify. You can also learn more about attending WordCamp US 2026 on the <a href=\"https://us.wordcamp.org/2026/tickets/\">WordCamp US tickets page</a>, explore <a href=\"https://us.wordcamp.org/2026/call-for-volunteers/\">volunteer opportunities</a>, or review <a href=\"https://us.wordcamp.org/2026/call-for-sponsors/\">sponsorship opportunities</a>.</p>\n</div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img alt=\"\" class=\"wp-image-20939\" height=\"1978\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WCUS26_Sign.png?resize=943{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C1978&#038;ssl=1\" width=\"943\" /></figure>\n</div>\n</div>\n\n\n\n<p class=\"wp-block-paragraph\"></p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 19 Jun 2026 16:55:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Brett McSherry\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:24;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:49:\"Open Channels FM: Open Channels FM v4.8 Changelog\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555724\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://openchannels.fm/open-channels-fm-v4-8-changelog/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:208:\"Bob Dunn has launched a blog commentary and a weekly series, \"Open Tabs.\" Do the Woo is now an independent podcast. Updates include a redesigned homepage, new episode features, and a newsletter format change.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 19 Jun 2026 09:23:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:25;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:92:\"WordPress.org blog: Global Partners Across the First Half of the 2026 WordPress Event Season\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=20910\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:67:\"https://wordpress.org/news/2026/06/global-partners-first-half-2026/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7579:\"<figure class=\"wp-block-image size-full\"><img alt=\"\" class=\"wp-image-20911\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/55169598894_0199c1bbb9_o-scaled.jpg?ssl=1\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\">This post recaps how the WordPress project&#8217;s five Global Partners — Jetpack, WordPress.com, WooCommerce, Bluehost, and Hostinger — supported community events during the first half of 2026. Across more than a dozen regional <a href=\"https://events.wordpress.org/novisad/2026/developer-day/\">the first WordPress Developers Day</a>, and a growing network of <a href=\"https://events.wordpress.org/campusconnect/\">WordPress Campus Connect</a> events, Global Partners staffed booths, sponsored sessions, and connected with developers, freelancers, students, and agency owners around the world.</p>\n\n\n\n<h2 class=\"wp-block-heading\">A global footprint</h2>\n\n\n\n<p class=\"wp-block-paragraph\">The year began in January with <a href=\"https://nepal.wordcamp.org/2026\">WordCamp Nepal</a>, where Jetpack joined the community in Kathmandu. The momentum carried into India, where <a href=\"https://kolhapur.wordcamp.org/2026\">WordCamp Kolhapur</a> and, a week later, <a href=\"https://pune.wordcamp.org/2026\">WordCamp Pune</a> brought Global Partners face-to-face with a student-heavy audience of roughly 200-250 attendees. In Pune, a session on connecting WordPress with AI workflows drew a large crowd, and attendees were curious about WordPress.com plans, new AI features, and Automattic for Agencies. </p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img alt=\"\" class=\"wp-image-20920\" height=\"675\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/img_1932.jpg?resize=1206{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C675&#038;ssl=1\" width=\"1206\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\">In February, Jetpack traveled to <a href=\"https://portharcourt.wordcamp.org/2026\">WordCamp Port Harcourt</a> in Nigeria, an inclusive and well-organized event with 256 attendees that featured talks on inclusion and accessibility. Locally produced swag was a standout success there, a reminder that the WordPress community&#8217;s reach extends well beyond Europe and North America.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Across Europe</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Spring brought a wave of European events. At <a href=\"https://madrid.wordcamp.org/2026\">WordCamp Madrid</a>, with 280 attendees, WordPress.com served as a Global Sponsor and ran a Wapuu treasure hunt that drew 97 participants. </p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img alt=\"\" class=\"wp-image-20921\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/55230328181_175ece15a5_o-scaled.jpg?ssl=1\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\">Down the coast in France, <a href=\"https://nice.wordcamp.org/2026\">WordCamp Nice</a> gave Jetpack a chance to connect with 247 freelancers and developers, an audience that appreciated concrete, easy-to-explain solutions and asked questions about newsletters, security, and Jetpack&#8217;s broader feature set.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://vienna.wordcamp.org/2026\">WordCamp Vienna</a> stood out for its developer-heavy crowd of 277. From a Jetpack-branded booth staffed on both days, the team engaged with agencies and merchants, fielded numerous questions about WooCommerce and security, and booked 8 agency meetings. Many builders were interested to learn that Automattic stands behind both WordPress.com and WooCommerce. In Italy and Germany, <a href=\"https://torino.wordcamp.org/2026\">WordCamp Torino</a> and <a href=\"https://leipzig.wordcamp.org/2026\">WordCamp Leipzig</a> both reflected growing curiosity about AI, a theme that resurfaced throughout the year. At Leipzig, with 109 agencies, hosting companies, and freelancers in attendance, WordPress.com staffed a booth where tote bags were in high demand, while conversations kept returning to AI and WordPress Studio.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://slovenia.wordcamp.org/2026\">WordCamp Slovenia </a>and <a href=\"https://portugal.wordcamp.org/2026\">WordCamp Portugal</a> closed the European stretch. WordPress.com brought a booth to Ljubljana, and in Porto, it appeared with both a booth and logo presence alongside WooCommerce, which suited an event filled with e-commerce builders and Woo payment providers. The first WordPress Developers Day in Novi Sad introduced a new format, with Jetpack as a global sponsor and nearly 30 in-depth conversations on Jetpack, WooCommerce, performance, and the realities of client work.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Community in Uganda</h2>\n\n\n\n<p class=\"wp-block-paragraph\">In May, <a href=\"https://kampala.wordcamp.org/2026\">WordCamp Kampala</a> brought four Global Partners onto the sponsor roster: Jetpack, WooCommerce, Bluehost, and WordPress.com. The event, themed &#8220;Tech for Social Good,&#8221; welcomed more than 200 attendees and reflected the energy of a fast-growing local community.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Support from Global Sponsors</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Behind every one of these events is a layer of support that does not always appear at a booth. In 2026, Bluehost and Hostinger both joined the <a href=\"https://events.wordpress.org/sponsor/\">WordPress community sponsorship program</a> as top-tier Global Sponsors, alongside Jetpack and WordPress.com. Their contributions help underwrite the global WordCamp program and the community events that make a year like this possible. That program-level backing is what allows organizers in Kathmandu, Porto, and Kampala to bring their events to life, and the WordPress community is grateful to every partner that invests at that scale.<br /></p>\n\n\n\n<h2 class=\"wp-block-heading\">Campus Connect reaches 6,200 students</h2>\n\n\n\n<p class=\"wp-block-paragraph\">One of the most notable stories of 2026 is not a WordCamp at all. It is <a href=\"https://events.wordpress.org/campusconnect/\">WordPress Campus Connect</a>. As of early June, the program has passed 6,200 students, with 25 events completed in 2026, 45 events all-time, and 42 more in planning or already scheduled. WordPress.com has played a direct support role throughout, including providing hosting for WordPress Campus Connect events around the world.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The connective tissue between these events and the broader community is real. An organizer first met at WordCamp Mukono went on to help lead WordPress Campus Connect work in Uganda. A student who built her first WordPress site at a WordPress Campus Connect event later attended a WordCamp. These events serve as a pathway for the next generation of WordPress contributors, builders, and professionals.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Looking ahead</h2>\n\n\n\n<p class=\"wp-block-paragraph\">If 2026 has shown anything, it is that interest in WordPress, and in the tools and services that Global Partners provide, continues to grow around the world. The questions being asked at booths and in sessions are sharper, the audiences more diverse, and the community&#8217;s reach more genuinely global. Thank you to Jetpack, WordPress.com, WooCommerce, Bluehost, and Hostinger for being part of that story this year, and to every organizer, volunteer, speaker, and attendee who made these events possible.</p>\n\n\n\n<p class=\"wp-block-paragraph\">To find an upcoming event near you, visit <a href=\"https://central.wordcamp.org\">WordCamp Central</a>. To learn how organizations can support the WordPress project, see the <a href=\"https://events.wordpress.org/sponsor/\">community sponsorship program</a>.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 18 Jun 2026 17:01:21 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Harmony Romo\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:26;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:69:\"Open Channels FM: AI Hype and Hope Navigating Optimism and Skepticism\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555778\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:76:\"https://openchannels.fm/ai-hype-and-hope-navigating-optimism-and-skepticism/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:170:\"In this episode, hosts and guests share diverse perspectives on AI\'s rise, touching on its potential, challenges, and how it\'s reshaping industries and human interaction.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 18 Jun 2026 09:58:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:27;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:64:\"WPTavern: #221 – Rahul Bansal on Using AI Everywhere at rtCamp\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"https://wptavern.com/?post_type=podcast&p=204828\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:78:\"https://wptavern.com/podcast/221-rahul-bansal-on-using-ai-everywhere-at-rtcamp\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:55356:\"<details>Transcript<div>\n<p class=\"wp-block-paragraph\"><strong>Nathan Wrigley:</strong> Welcome to the Jukebox Podcast from WP Tavern. My name is Nathan Wrigley.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Jukebox is a podcast which is dedicated to all things WordPress, the people, the events, the plugins, the blocks, the themes, and in this case using AI everywhere at rtCamp.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;d like to subscribe to the podcast, you can do that by searching for WP Tavern in your podcast player of choice, or by going to wptavern.com/feed/podcast, and you can copy that URL into most podcast players.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you have a topic that you&#8217;d like us to feature on the podcast, I&#8217;m keen to hear from you and hopefully get you or your idea featured on the show. Head to wptavern.com/contact/jukebox? And use the form there.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So on the podcast today we have Rahul Bansal. Rahul has a long and accomplished history in the WordPress ecosystem. As the founder and CEO of rtCamp, a company he started 17 years ago, he&#8217;s led his agency through the rapidly changing landscape of the web, helping enterprise clients such as Google, Fortune 500 companies, and major publishers solve complex problems with innovative WordPress based solutions.</p>\n\n\n\n<p class=\"wp-block-paragraph\">rtCamp specialises in everything from large scale website builds, to more bespoke projects like Chrome extensions and SaaS connectors, and has grown to a team of hundreds over the years.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Today&#8217;s episode takes a deep dive into Raul&#8217;s recent talk at WordCamp Asia, which focused on what it will take to launch and scale an enterprise WordPress agency in the future.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The conversation focused on real, hard won, lessons from rtCamp&#8217;s journey, but also how rapidly the playbook is changing with advances in technology, particularly the explosion of AI tools and workflows.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We discuss Rahul&#8217;s philosophy around hiring, namely building a team of people whose strengths complement each other rather than just replicating your own skillset. This approach has allowed rtCamp to adapt to new challenges, fill gaps in expertise, and whether major industry changes.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We then explore how this idea of complimentary sets can also apply to choosing the right kinds of clients, those who value your expertise because they need what you offer, rather than simply hiring somebody who does what they already know.</p>\n\n\n\n<p class=\"wp-block-paragraph\">A theme that emerged in the conversation was specialisation. Rahul outlines how, whereas rtCamp&#8217;s earliest differentiator was a simple focus on WordPress, when virtually nobody else in India was, today&#8217;s agencies must drill down much further to stand out choosing niches within niches, such as WooCommerce, or payment gateway integrations, and becoming recognised experts in those areas in order to thrive in a much more crowded field.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Towards the end of the episode, the discussion turns to what might be the most significant topic for agencies today, artificial intelligence. Rahul describes how recent advances in AI have not only altered his agency&#8217;s practises, but given them a firm mandate. If something in rtCamp can be done by AI it will be.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We talk about how AI is being leveraged inside rtCamp to automate and optimise everything from sales and proposal writing to project management, and even technical proof of concept builds. With a unified platform for all business processes, the agency is now able to significantly reduce costs, speed up delivery, and focus on higher value consulting and creativity, reshaping roles and team composition as a result.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re interested in what it takes to stand out and succeed in the evolving world of enterprise WordPress agencies, how to confront uncertainty with both optimism and realism, and how AI can become not just a bolt-on feature, but the operational backbone of your business, this episode is for you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re interested in finding out more, you can find all of the links in the show notes by heading to wptavern.com/podcast, where you&#8217;ll find all the other episodes as well.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And so without further delay, I bring you Rahul Bansal.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I am joined on the podcast by Rahul Bansal. Hello, Rahul.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rahul Bansal:</strong> Hello Nathan. Thanks for having me here.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nathan Wrigley:</strong> You are very welcome. Rahul and I were both at WordCamp Asia and that is going to be the main focus of the podcast today. We&#8217;re going to be talking about agencies, growth in agencies, and then probably delving into AI a little bit at the end because of a recent announcement that came out of rtCamp, which is the company that Rahul founded many years ago.</p>\n\n\n\n<p class=\"wp-block-paragraph\">In order to, I suppose, lend credibility to a conversation about agency work, would you mind Rahul, just introducing yourself and tell us a little bit about who you are, what you do in WordPress, and maybe give us a few little interesting facts about rtCamp and what you do over there.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rahul Bansal:</strong> So I&#8217;m, as you mentioned, founder and CEO of rtCamp. We started this 17 years ago. We primarily help large enterprise client, sometimes we build websites for their marketing team, which is the most common use case of WordPress. But at the same time, we help large tech companies like Google communicate better with the WordPress ecosystem for their offering. Like sometimes we build products that includes neither thing, neither plugin, but something like Chrome extension. For large companies sometimes we build like SaaS connectors for technology companies.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Yeah, so we work with, like a big companies really Fortune 500, and the idea is to deliver something related to WordPress in one form or another form.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nathan Wrigley:</strong> If you go to the rtCamp website, you can probably Google it I would&#8217;ve imagined, then you&#8217;ll be able to get some impression of what the company is like.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I think last time we spoke you were into the sort of 200 employees level. I&#8217;m not sure if those numbers have gone up or down or what have you. But you get an impression of how large it is. And one of the interesting things that I spotted during my time at WordCamp Asia was just how vibrant the community, the WordPress community is. So maybe we&#8217;ll get into that a little bit as well.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;m going to concentrate to begin with on the presentation that you gave at WordCamp Asia. If you would like to see that, wordpress.tv will have a video. And if the video is already available, I will link to it in the show notes. But the presentation that Rahul gave was entitled, how to Start an Enterprise WordPress Agency in 2026. And I&#8217;ll just read the blurb that goes with it because it was fairly short and easy to manage.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Building a WordPress agency business for large enterprises. In this talk, I&#8217;ll share the story of how rtCamp grew from a small WordPress shop into a globally recognised enterprise agency, trusted by Fortune 500 companies and major publishers. If you&#8217;re starting an agency today or looking to move up market in 2026, this session will give you a realistic roadmap building on real lessons from my personal experience.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So I suppose what I&#8217;m going to do at the beginning, Rahul, if it&#8217;s all right with you, is just ask you to tell us some of the bits and pieces that you mentioned during that. Some of the advice that you would give an agency owner beginning in 2026.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rahul Bansal:</strong> Yeah. So first, like I deviated a little bit from the blurb because when I applied this talk I had a different frame of mind that, hey, I&#8217;m going to do this. And then as I was preparing the talk, and in during those months, especially like last few months, the AI has reshaped everything. And then I realised that a lot of what worked for rtCamp won&#8217;t work even for rtCamp if I start again today.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Rather than making it as a nice story about what worked for us, I lean more towards practical advice, and that&#8217;s where the essence remained. But I focus more on the 2026 part, because when we started, it was 2006. The first time when I used WordPress was 2006. rtCamp started in 2009. 20 years is a big time. And then at the end of this 20th year, like we are going through this AI led change.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So a lot of things that worked for me won&#8217;t work anymore. And that is how I restructured my talk to take enough from our history, enough from our learnings, what worked for us.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The way we hire is very different. And after the talk, if that one line that stick with the audience, that many people told me that the hire your complementary set was the most different idea. And it&#8217;s timeless idea. It&#8217;s relevant in AI world also.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So the idea was basically that we have this bias that when we try to scale, like basically when we go from freelancing to agency business, the idea of building a business, we try to find people like us. But my idea was that we should initially, especially, we should find people who are opposite of us. Like I was good at engineering, bad at sales, so my co-founder is sales heavy. My English was not good. His English was very polished.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So I literally listed down my weakness and found people who were opposite of me. Even interesting part was that, to the few initial hires I asked the questions, whose answer I had no idea whether they&#8217;re saying right or wrong.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So that was the most interesting idea and I think that&#8217;s still relevant today. I will do exactly same thing if I have to start building a new agency. I will build in WordPress, build in AI, any kind of business I will, my initial few hires will all together will cover each other&#8217;s weaknesses.</p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s at certain scale then you need to replicate, like, you need 50 engineers, you need 20 React engineers, you need five people who can write same proposal. That comes much later. But starting is all about finding your complementary set. And this was inspired by a set theory from math class that I attended in when I was like some 12-year-old. That stuck around before the life. And that is what I put in this talk as a biggest lesson we learned and that worked.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The second most specific thing that I would say, practical advice, like that was more about hiring advice, but that is not only hiring address, that is, I advise in many walks of life applicable.</p>\n\n\n\n<p class=\"wp-block-paragraph\">When you&#8217;re looking for your client, you have to look for complimentary set there as well. Because you are trying to sell to agencies like yours, your margins gets hit a lot. You need to find people who do not understand WordPress at all because then, that is why your expertise become more important and premium for them, because they need to depend on you. They value you more. You are not commoditised for them.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So that hiring your complementary set works across the board. But then the most specific advice I gave that I didn&#8217;t follow myself, I would say. Actually there was nothing to follow that. When I started WordPress was just a blogging platform. There was custom post type were not yet part of WordPress Core. Everybody was just building blogs. We were playing around themes, and the race was to make our blog look unique. The metric usually was like traffic and how many email subscribers you got.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So there was no niche to pick. Like, that was the only thing WordPress was doing. And after post type, people started building a lot more than WordPress. Actually people started pushing WordPress earlier, and as a result of that, WordPress created those APIs to make it easy to extend WordPress beyond blogging platform.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But today, in 2026, there is so many things happening. And if you&#8217;re starting new and you do what rtCamp did on day one, like, hey, we are WordPress agency. That is not going to work.</p>\n\n\n\n<p class=\"wp-block-paragraph\">It worked for us 20 years back because we were like, probably only one in India at that time who said at that time that we will be only taking WordPress project. Because India was a land of outsourcing. Like in supply chain, it was like a, it&#8217;s like a Chinese manufacturer saying that, hey, we are only going to assemble if you are building for iPhone. So it&#8217;s like, hey, we are only going to write PHP if it is going to end up as a WordPress theme or plugin. We are not going to do what was Cake PHP project at that time. We are not going to write custom PHP script.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So in a way we picked the whole WordPress as a niche among the largest set of choices available to us. But if your largest set of choices was building a iOS company, like mobile app company. Mobile app was big because with the introduction of iPhone, there was a sudden shift and huge demand for iOS apps, and we haven&#8217;t built one till 17 years. Like literally we built our first iOS app, public iOS app last month.</p>\n\n\n\n<p class=\"wp-block-paragraph\">That time we were like, well, we are going to only do WordPress. So now that advice translate into, pick a niche within WordPress because WordPress itself is the web now. That time, WordPress was very small. Now you can choose e-commerce. Within e-commerce then you can probably pick WooCommerce. Within WooCommerce then probably you can pick like, depending on your market, payment gateway specialisation, ERPs, back office specialisation, subscription based businesses.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Start by picking a niche as small as possible and then go bottoms up, rather than starting with everything. So that was the key takeaway of my session, I would say that. Pick a niche, position yourself as a expert in the niche. Don&#8217;t just say that, hey, we build WooCommerce store, or we build WordPress site.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nathan Wrigley:</strong> Okay. Yeah, I&#8217;ve got all of that. So firstly, hiring. That&#8217;s an interesting one. Hire people that are different from you. I was imagining when you were saying that, I wonder how long you can do that, because you can&#8217;t, eventually, you have a company of a hundred people and all of them are not the same as you. Eventually it must be nice to find somebody who&#8217;s a little bit like you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But then also you mentioned picking clients who will trust your expertise, I think is a good way of describing that. Because they themselves are perhaps not expert within that WordPress platform.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And now of course, moving forwards, what worked for you in terms of being a WordPress agency 17 odd years ago, that was, as it turns out, really successful. But now you are going to be amongst tens of thousands in India alone, if all you say is that you are a WordPress agency. So you need to go a little bit more specialised and niche down.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I wonder, Rahul, with the benefit of hindsight, it&#8217;s always easy to look back and sort of see for example, from my perspective, I see rtCamp as an entirely successful enterprise. You know, you began all those years ago, and decisions were made and you grew and you grew and you grew and you grew, and now we are where you are now. Committing a lot to WordPress with incredible growth and a really amazing agency on your hands.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But I&#8217;m just wondering, looking back, with the benefit of hindsight, were there any moments where you made some decisions where you were very nervous about how it was going to be?</p>\n\n\n\n<p class=\"wp-block-paragraph\">So for example, one of those could be WordPress. There was no writing on the wall that said WordPress will be the successful CMS. That really could have gone either way. It could have been Drupal, it could have been something that some kid in a basement created. So I&#8217;m just wondering, are there moments when you look back and you think to yourself, gosh, I am so glad that we did that random choice than all the others that we could have made?</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rahul Bansal:</strong> Yep. So it&#8217;s a reality that, one of the co-founders we lost, within the first year of company formation was because, I refused to add Joomla to our offering. And Joomla I think was market leader at that time when we started. So we were like more like engineers, like some were good at sales, some were good at communication, but we were all from the same kind of school, like we didn&#8217;t know if there was any survey existed.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So we didn&#8217;t back by any data. The only reason we chose to stay with WordPress or build this agency with WordPress because we were using WordPress. So rtCamp for the most part, people missed that. So rtCamp was not started as an agency. rtCamp was basically a media company, a blog network. And that blog network was running on WordPress. As a technology blogger. It&#8217;s like just imagine WP Beginners, like that is more relevant example.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So by the way, we, and WP Beginner were operating at the same time, that&#8217;s the power of niche. Like say I chose to focus on WordPress and say very very well. And my technical blog was everything like from iPhone to Windows operating system to Mac OS update to web APIs, to HTTP2. Whatever, like it was a larger technology blog So we were more like a stripped down version of TechCrunch rather than picking a niche. And Syed picked this WordPress as a niche.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Both were contemporaries in that same era. Now just imagine Syed in those days I started an agency. So we were using WordPress, we needed to stand out because, social network or blogging or web was still a fancy place. Like minimalism wasn&#8217;t the trend. It was how much you can push, like how you can make your website look different without using Flash. That was the coolest thing. Like how much you can push jQuery, how advanced CSS you can write. So all those things led to we customising our WordPress a lot.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Another thing that worked in our part was, our blog was one of the biggest in India. Globally also, it had good traffic. In fact, it had so much traffic that one of the most Googled keyword in my name was Rahul Bansal, how much money this guy make. Like that was the first question I used to get asked because traffic was insane. We used to get a lot of traffic.</p>\n\n\n\n<p class=\"wp-block-paragraph\">That led us to writing nice WordPress code. In early days, like especially when I was freelancer, I had to write amazing WordPress code that will scale and host it in a way that it will also scale. So not only WordPress, we choose Nginx before it become a norm. Like before there was. anybody started any WordPress managed hosting company. We managed to scale WordPress at a very high level.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And so now we, are this famous blog running on WordPress handling so much traffic, on Linode&#8217;s $10 something plan. Customising it. So we got this natural market. We got initial customers were technically our competitors, like other tech bloggers. It&#8217;s like TechCrunch hiring Mashable to customise their blog So something like, because Mashable has a tech team. So that was at early story of rtCamp.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And then we realised that we are making more money and faster money via customising WordPress. So we started cutting down on our editorials. And then, slowly, slowly like the business has shifted from, being a blogging agency, to WordPress custom development agency. That&#8217;s why we chose WordPress.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And that has been the principle since then, like we only sell what we use. That was the reason we didn&#8217;t, so it wasn&#8217;t any ideological decision. So the ideology is at open source level. So rtCamp is committed to providing open source solution to its client from day one.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Joomla tick that box. But Joomla didn&#8217;t tick the box that we use Joomla. We don&#8217;t use Joomla. There was no reason for us to have our blog running on WordPress and website running on Joomla, and that&#8217;s why we stick around WordPress when there was no data, no trend. And I think in hindsight it was just luck. I would say like it could have backfired.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nathan Wrigley:</strong> Well, okay, I really like this story. Firstly, I like the fact that you are identifying luck as a component, because I think too often when you listen to people who have had success, they sort of chart this narrative of how brilliant the decisions were along the journey and how impeccable, you know, we did this and then we did this, and then we did this, and then we did this. But never a nod to luck.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And of course, with the benefit of hindsight, we did this, we did this, we did this does lead to where you are now. But I really enjoy it when founders and people have that confession in them. Yeah, there was a bit of luck.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But also, and we&#8217;ll get onto this in a minute, because a big part of what you are about to do, or have recently done with your business kind of leans into what you&#8217;ve just been saying.</p>\n\n\n\n<p class=\"wp-block-paragraph\">It sounds like you were led by what was in front of you, if you know what I mean? It doesn&#8217;t sound like there was a great big, okay, by 2016 or 2026, we want to be here. It was more like, okay, this is where we&#8217;re at now. These are the things that are coming to us. Okay, looks like WordPress, not only are we using it, but it looks like people want us to help them to use it. Well, let&#8217;s go there then. Let&#8217;s put the blogging to one side and let&#8217;s become more of a, I don&#8217;t know, a technical helper for you and your website.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So there&#8217;s this sort of lucky piece, but also the willingness to steer into favourable winds, if you know what I mean? I love that story. Thank you very much for that. I also admire your humility in all of that. That&#8217;s lovely.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So the next thing then, I suppose that I want to get into is some change in the landscape at the moment. And again, this maps to what you were just saying about move where the wind takes you. We all know that AI is a thing. You cannot have missed that. But I think a lot of people are taking nervous steps into their business and how they&#8217;re doing things with AI and maybe biting off a little bit here with AI and leaving the rest as it is, and biting off another chunk here, and leaving the rest as it is and slowly moving into AI.</p>\n\n\n\n<p class=\"wp-block-paragraph\">You have a very different approach. And I will link in the show notes to a blog post on the rtCamp website, which I read several weeks ago. I&#8217;ve got to say, I was a little bit, not surprised, that&#8217;s the wrong word, but it was written in such a way that I thought, gosh, now that&#8217;s interesting.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Because in it you painted the case that rtCamp in the future is going to do AI everywhere. And I know we hear that all the time. You know, we&#8217;re going to use AI here, and we&#8217;re going to use AI there. You have painted your colours on the mast, and literally, I think you said, if it can be done with AI, it will be done with AI. There will be no stone left unturned.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Okay. Firstly, why? Why have you got that approach? What&#8217;s the reason? Now, I&#8217;m sure it&#8217;s fairly obvious, but lay it out for us anyway.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rahul Bansal:</strong> Yeah. So I don&#8217;t know from where it comes, anytime I see things going south across industry like COVID or, like AI, like everybody was gloomy, my brain kind of think of opposite. So in my brain, I&#8217;m not building, I&#8217;m actually imagining an AI only agency with humans required to probably feel capture. That&#8217;s how my brain works. So it&#8217;s like AI first.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Then again, like WordPress, so I have been lucky more than once in my life. So before this AI came, this famous saying by Steve Jobs like you can only connect the dots looking backward. Three to four years ago, riding on the digital boom, we survived the COVID, like all agencies grew. rtCamp grew a lot more, and a lot faster in very short span of time. And to manage this humongous workforce, we needed to refactor a lot internal tooling, softwares, processes, to the point that we have internally codified our mission that we want to build McDonald&#8217;s of consulting business, inspired by that movie Founder. That was also part of my talk at WorkCamp Asia.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And in fact, I had somebody to literally a complimentary set example. I know we want to build this, but I don&#8217;t have that kind of mental model. So that&#8217;s the brief I give to our chief delivery officer that you have to give me this. McDonald&#8217;s of agency business.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We start thinking of every process that we can repeat, and we realised that we need to take control of our software stack. And we ended up finding something, in open source. That&#8217;s, I would say truly a spiritually aligned to the WordPress ecosystem called Frappe ERPNext, which handle our accounting, payroll, project management, CRM. So many business processes in one single source of truth, like single source of truth for so many things. Earlier it was all siloed data.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So this was started with a different intent, to scale rtCamp, 2000 people, 5,000 people, 10,000 people, because that was a business model then. Agencies growth with capacity. You want to sell more, you need to hire more. Basically agencies growth was limited by on one dimension, the inventory, human inventory you can have. So we started implementing this open source back office software automation with the idea that we will own, central piece of our operating system of connecting, getting thousands of people working together.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Then AI happened, and then we realised we don&#8217;t need to hire those many people anymore. Year on year, we moved from 200 to 250, but I think next 50 will be very slow. Because, now we are no longer aiming to sell, or hire people. But as luck would&#8217;ve been, we ended up creating this system of record, which is unified and cleaned. When we think of a client or a project or a human. All aspect of their metadata is available in a single system.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So that is why we can leverage AI more than a company, agency to agency. For agencies using say, Jira for project management. QuickBook for accounting, some other software. If their operations is scattered across 6, 7 software, we have leverage over them. Not only we are paying very less because all our software is open source. The data is first party. Like sitting duck there to query in any way we can. We are not limited by SaaS providers, enterprise plan or this AI capability.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So that is where we realised that we can take this huge bet on AI where we can now build a lot more, in a lot less time using AI across the board. And if you look at a business like not just WordPress business, when you buy something, like you buy a car from a car company. You are actually paying for everything that company does, advertising, researching on the EV technologies, hiring a brand ambassador to put billboard, sponsoring F1. Anything that company does. every penny they spend on their business, the customer ends up paying it.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So we thought like now we have a single stack, which technically takes care of 70 to 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} critical nature of our business operations. From when the lead enters the CRM, the project management, time entry, people&#8217;s new management, everything is linked. Everything is beautifully linked in a single unified interface and database. So why don&#8217;t we just use AI to cut down the cost.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Because now we cannot charge by hours, we can try, but, it&#8217;s not making sense anymore for clients. They want us to commit to fix output bid. Now when we say, hey, we can migrate this thing for 100k, or we can build this website for half million dollars. So those numbers, traditionally, and actually all the time will include all the operation cost. Like my salary. I&#8217;m not doing any coding work, but my salary will be eventually paid by all the clients. Electricity bill that is also going to be paid by all the client.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So we thought like rather than just thinking AI to build a website, let&#8217;s use AI to bring our operational costs dramatically down. Because we have single source of truth for maximum data we have, and that is where we went all AI in. Now it&#8217;s like we can submit a proposal in one third of the time.</p>\n\n\n\n<p class=\"wp-block-paragraph\">In old days we used to build PPTs. Now we vibe code a WordPress demo site and attach it to the proposal. Hey is this something that you want? Not just the screenshot, not just the Figma, like we are actually building Playground, like websites, and launching them and sharing those links to the client. Go play with it. We are even trying to copy the design systems if they&#8217;re migrating. So migration is a big category of work we do.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So that is what we mean by going AI ready. So we are leveraging AI to reduce the cost of sale, increase probability of winning the project by pitching them something. And then while estimating the effort, like let&#8217;s say we would traditionally say, oh, this might cost us a thousand hours. Now we blindly said Make it 30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} less, as if it will be done in 700 hours and it will be, sometimes it backfires.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But then on some project it&#8217;ll be 500 hours. In some project it&#8217;ll be 900 hours, but average will come back to 700 hours. Then again, the idea is we have a central operating system, which gives us, like bird&#8217;s eye view of how healthy our projects education are. Are we getting returns on our AI engagement? And all this is possible because few years back we took a bet in different direction.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Like we choose WordPress because we wanted to be a better media agencies, and that was what media agencies were doing in the early days. But we ended up building an agency business with the WordPress. Likewise we choose this Frappe ERPNext software. To operationalise our back office. But now it is starting out to be our advantage point in this areas like we are able to do AI a lot more. In the end, it&#8217;s all about bringing the cost down at certain quality. You have to keep the quality up, and just make it more affordable. If that is not. as a business you cannot do that with AI, then something is wrong.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So AI is not about building something new. I have another approach. So if you&#8217;re an agency people are hiring you to move things from A to B, like you are the movers and packers of internet. I put crudely, what rtCamp does. We move things, like a shipping company who moves your house, remove you from Sitecore to WordSpace.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And that&#8217;s still big part of our business. We don&#8217;t have to reinvent or reimagine different experiences all the time. Sometimes we have to just do what everybody&#8217;s doing, the boring part. Put AI there to make it efficient, more cost effective. And if you do that, that means more people wanting to shift to new house. Again, a different approach. People think that they need to build something out of the world to benefit from this AI way.</p>\n\n\n\n<p class=\"wp-block-paragraph\">My idea is that pick a boring thing and make it so affordable that people who were sitting on the fence, just imagine travel, Middle East travel. Like this is a very actually a bad example, might sound inhuman, but, say like X number of people wanted to experience Dubai as a destination, but let&#8217;s say, it was beyond their budget. For some even unfortunately now suddenly that comes within their budget, they will be able to do that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">People wanted to move to WordPress Initially, agencies were quoting a hundred thousand dollars for that big shift. Now if you can, suddenly you can do it in 50k a lot more people will shift. So, you don&#8217;t have to do things like out of the world thing. You don&#8217;t have to invent new. You have to sometimes just make existing problem more efficient to solve.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And it was not always about money, especially in large client. It was not always about 100k versus 50k versus half million versus 1 million. It was about timeline. It&#8217;s like you are refurbishing your home and it is going to take three month, then it&#8217;s a different mental model, like to put up yourself in a hotel or a second home for three months. If a magically a new company appears and hey, we can refurbish your home overnight. You don&#8217;t mind checking into hotel for one night. And that is where I feel like this WordPress will be net gain because of AI. Agencies has to be optimistic, and think differently to gain from AI.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Like, what people are doing is everybody&#8217;s trying to act like a ChatGPT, OpenAI, it&#8217;s their job to invent AI algorithm. We are agency. Our job is to apply AI, not invent AI. We don&#8217;t have to think of what is Opus 4.8 will do. Let cloud engineers think of that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So we need to understand we are AI&#8217;s consumers or consultant, and that is where some people are getting it wrong by vibe coding things that they&#8217;re not able to sell to anyone. Then they will cry that, hey, six months later they will realise they built stuff nobody bought. Now they don&#8217;t have money to pay AI bills, or their developer salaries and then they will try that, hey, AI took over job, AI killed our business. No, think what existing problems we can solve with AI cheaply, efficiently, with better quality. And a lot of work is there to be done.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nathan Wrigley:</strong> There&#8217;s a lot in there, but one of the things that I&#8217;m taking out is. So prior to AI coming along and demonstrating to us all what it could do, which by the way didn&#8217;t kind of happen overnight, although it feels like it did, there was a sort of, a year in which we could suddenly see, oh boy, it&#8217;s getting much more performant and much more interesting. But prior to that, it sounds like post COVID, you kind of inspected your business and were thinking, okay, how can we refine everything that we&#8217;ve got in the business and how can we put it all into this one system?</p>\n\n\n\n<p class=\"wp-block-paragraph\">And again, with the benefit of hindsight, and I&#8217;m maybe going to use the word luck, maybe that&#8217;s not the right word. You, having done that work, then meant that when AI did come along, you weren&#8217;t trying to link up four or five or six or ten different things. You had this one source of truth. Which meant that you could cut waste, for want of a better word. You know, waste could be measured in terms of dollars or it could be measured in terms of time or it, whatever it may be.</p>\n\n\n\n<p class=\"wp-block-paragraph\">You happened to be in that place because you&#8217;d done that preparatory work, not necessarily knowing that AI was going to come along and make all of this fun stuff possible. But with the benefit of hindsight, that&#8217;s exactly what it did.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And it&#8217;s curious, you said 70 or 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} of the business could be streamlined in that way. And I&#8217;m so staggered by that number. I thought you&#8217;d be in the kind of, I don&#8217;t know, 20, 30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} or something like that. But a full 70 to 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}. So does that mean 70 to 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} of the things available, or do you mean that you were able to cut 70 to 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} of the cost or the time? Because I wasn&#8217;t sure which 70 or 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} you were meaning.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rahul Bansal:</strong> It meant different things. First like, as I mentioned that we are not thinking AI adds just something to sell, but something to consume first. Because, again, dog fooding principle. We managed to sell WordPress better because we were a blog network. That&#8217;s why we could understood publishers better. We got into this Frappe ERPNext consulting because we built our backend with it. Now before we make any promise with AI, we have to be net gainer with the AI. And we believe that our internally, we will be.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So there are two parts, actual cost of building something and the meta cost. Like cost of sale, like the writing proposal. marketing costs, like case studies, going to even preparing for articles. Non build cost is definitely, we are able to bring, I would say it&#8217;s already half, but it&#8217;ll be, further down. I will give you a very simple example.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Like in early days is when somebody used to submit rtCamps form, inquiry form, a human, would manually check like, Hey, what is the domain name of this email id? Are they on LinkedIn? Some 30 minutes and then they will write a note hey, this looks like a good quality lead. We are fortunate that we get a lot of inbound inquiries, so we had to have prioritise, like which leads we are going to respond first.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Now, as soon as somebody submits a form an AI integration does that, within minutes. And the notes are much more details, it creates action items. Across like WordPress our Frappe CRM, our Slack, everything runs like a clockwork, and we don&#8217;t need a human. So that, junior human job is definitely gone. So in sales team, we used to have like this entry level job. That is no longer there. Some jobs are actually going to get vanished. So now going on a call, meeting notes, a lot of those things are getting automated. So the cost of sale has dramatically came down.</p>\n\n\n\n<p class=\"wp-block-paragraph\">What is the effect? Like, say we can now assume flat 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} discount compared to earlier pricing when we are thinking of a migration project. Like, let&#8217;s say, in early days, we used to think like hey, anybody wanting to migrate from Adobe Experience Manager? We must assume that they need to pay us 100k. On the initial call, we can say, hey, that would probably cost something like minimum 50,000 dollars.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The minimums, the starting numbers has came down because we need less energy to have those pre-sales conversations. Less number of minutes of ours spent building those demos. Very fast discovery. Data mapping sometimes happens in minutes. In fact we did one 10 days to prepare this migration literally in five days, that was unthinkable. And that included data migration, QA testing, like automation testing where somebody built a bought in panel, which would randomly open a Zendesk ticket and verify that all metadata and deploys are migrated into new health desk system, all within five days.</p>\n\n\n\n<p class=\"wp-block-paragraph\">This is where I have been saying that the cost of building custom solutions will fail. For like so low, like it&#8217;s 60, 70, 58. Like definitely more than half. It&#8217;ll be reduced by half more. People will buy custom solutions. So agencies are going to grow from here in just these one or two years. Because agencies, to price something upfront, we need consistencies. Like I&#8217;m running an airline and if my jet fuel is my biggest cost, and that is out of my control. Then how do I price my tickets? That&#8217;s AI hallucination, which is, I would say the jet fuel version of aviation industry.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Something happens in Middle East and fuel prices goes up. A war starts. So now when AI hallucinates so it&#8217;s like what we are internally tracking, or what we call as a KPI or internal metric is that, worst case, AI gains, that&#8217;s already 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}. Best case is more than 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}. In some cases it&#8217;s literally 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}. This range will keep compressing and that&#8217;s what I think 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} is my expectation in two years. We will have that maturity that, the build time will fall by 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}. That means. the client companies will hire more agencies to do more work.</p>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress will emerge as a winner, not only for its ecosystem, but its ability to expose structured data without any proprietary walls. AI was so fast that only an open source can keep up with it. In fact, we are seeing more migration inquiries with with the AI boom.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nathan Wrigley:</strong> Oh, interesting. I was going to ask a sort of follow up question. Do you think that you, so you were mentioning, how to describe it, a rising tide carries all boats, or you certainly implied that the pie is getting bigger, if you know what I mean? So you are getting more phone calls, more migrations, more work, and you can obviously do that more affordably. And because you can pass on some of those savings to the clients, the price point lowers and so you get more inquiries because there&#8217;s this virtuous cycle of price going down, but quality staying the same or getting better.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I wonder if you, given your success in the past, I wonder if that transition will be easier for you, because the phone is already ringing, than it would be for somebody who was beginning in 2026? Because we all know when you begin, getting the phone to ring is probably the hardest thing. You know, getting those first 5, 10, 15 reliable clients, whatever it is that makes you work.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I wonder if you are in a uniquely good position, having a history of clients, a roster of clients that will come back to you. And also just being famous, for want of a better word, in the WordPress space, for doing the kind of things that you do. I wonder just what your thoughts are on that.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rahul Bansal:</strong> They&#8217;re both pros and cons. The only con for rtCamp is that our business model, a big part of what&#8217;s traditional like setting our flagship revenue stream for last 8 to 10 years was staffing solutions. We used to provide engineers, sometimes to other agencies, sometimes to publishers. So usually they used to have the leadership layer with them. We were more of executors, and if AI within the IT industry, the first casualty of AI revolution was that people who code, or people who can only code but cannot think. But luckily our hiring was very different.</p>\n\n\n\n<p class=\"wp-block-paragraph\">While it is taking time, so as I said, net headcount addition has been slowed down. I think this is probably first time rtCamp&#8217;s career site doesn&#8217;t have any engineering opening. If we would&#8217;ve been like a publicly listed or like a shareholder owned company, we might have got mandate to fire a hundred people right now, because we have already gained by, so much that, our one third of our WordPress engineers are currently out of work when the work is rising.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Because traditionally, when we needed eight people, now we were able to do in four people. But now we are using this. We have our own challenges, going from one kind of business to another kind of business model. The switch is causing some friction, but we are communicating it openly. We are giving people like more freedom. You give us ideas like which part of the entire business equation you can optimise. Is it editorial experience, is it migration cost? Is it data mapping, visual testing? So people are constantly building.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So change is there. Change is scary. It is scary for us also because we don&#8217;t want to fire people. We don&#8217;t want to lay off people. We want to return this team. From here onwards, we don&#8217;t see we are hiring more engineers for at least a year, because we have enough of them. But, we are so optimistic about this WordPress growth and the pie getting bigger.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We are hiring more sales and marketing team. Two days back I was telling like traditionally, we had this 90 to 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} ratio, like in 200 people, our headcount team, we would have 20 people. That would be, we can call as a sales and marketing department, I think next 50 hires will be only sales and marketing.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nathan Wrigley:</strong> Oh, that&#8217;s a big skew, isn&#8217;t it? So you&#8217;ll go to more like 30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} marketing as opposed to 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} marketing.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rahul Bansal:</strong> Yeah sales and marketing. By the way, when we say sales, sales in rtCamp means slightly different. It&#8217;s more of a initial consulting, basically making those solid promise, which can be backed by engineering, not over promising. So our sales team needs are more like a WordPress consultant, but we have a category within rtCamp which we call Growth Engineers, who are some of our best coders. But rather than writing code, they go on the first client call and make promises on behalf of WordPress which are practical, feasible, and real.</p>\n\n\n\n<p class=\"wp-block-paragraph\">That is what our internship look like, because coding is race to bottom. Eventually the cost of building will shrink to the point that you don&#8217;t need many, you won&#8217;t need many traditional developers in any agency. You will need people who can imagine what needs to be built. There might be 20 different ways and which way this project should be executed. That prompt engineering, context in engineering.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So the value is shifting and it&#8217;s definitely shifting away from people who can only code. That is why, probably from two years now, we might be at 300 people. Hundred of them will not be coding at all. But they will be prompting AI. They will be building vibe coded prototype in pre-sale stage to gain that customer confidence like early on that day. What you want is possible with the WordPress. It won&#8217;t cost that much. It&#8217;ll be given you fast enough that your life won&#8217;t be disrupted for many months, like your business operations won&#8217;t be disrupted for many months, so this is a thing</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nathan Wrigley:</strong> Yeah, nobody could deny that we&#8217;re in interesting times. I think a lot of people are very confused by what&#8217;s going on at the moment. You know, they&#8217;re trying to figure out a path. They&#8217;re trying to figure out how it affects their business. They&#8217;re probably in, I would imagine, quite a lot of cases, quite keen to stick to the ways that they&#8217;ve done it in the past. But certainly the picture that you&#8217;ve painted over at rtCamp is that you are aligning yourself with a very different future, kind of embracing AI, seeing where it can take you, trying to adapt your business. Being optimistic about it rather than pessimistic. Because I think there is quite a lot of pessimism around there at the moment. But seeing the opportunity and seizing it.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Absolutely fascinating. There was so much to unpack there. I feel like we could talk probably for another nine hours about this because it genuinely is never ending. I would love to prize back the curtain a little bit more. However, time allows only this much. So what an interesting conversation. Thank you very much, Rahul.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Just before we end, could you just tell us where we can find you online, should somebody want to, you know, maybe they&#8217;re experiencing a bit of anxiety of their own. Their agency is in a rudderless ship at the moment and they&#8217;re trying to figure it out. Where can people get in touch with you best?</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rahul Bansal:</strong> I am actually available on all social networks. I use LinkedIn least and email is most level way, I&#8217;m a bit old school there. But, yeah, Twitter. I check daily.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nathan Wrigley:</strong> I will link to your bio in the show notes, but also, I will link to the presentation that you gave and any other bits and pieces that we discussed that I can find links for. I will mention those well. So head to wptaven.com, search for the episode with Rahul in it.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Thank you so much for chatting to me, and all I can say is all the best. I hope that all of the intuitions that you have turn out to bear fruit and be fruitful for you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Thank so much for chatting to me today.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rahul Bansal:</strong> Thank you Nathan.</p>\n</div></details>\n\n\n\n<p class=\"wp-block-paragraph\">On the podcast today we have <a href=\"https://www.linkedin.com/in/rahul286/\">Rahul Bansal</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Rahul has a long and accomplished history in the WordPress ecosystem. As the founder and CEO of  rtCamp, a company he started 17 years ago, he’s led his agency through the rapidly changing landscape of the web, helping enterprise clients such as Google, Fortune 500 companies, and major publishers solve complex problems with innovative WordPress-based solutions. <a href=\"https://rtcamp.com\">rtCamp</a> specialises in everything from large-scale website builds to more bespoke projects like Chrome extensions and SaaS connectors, and has grown to a team of hundreds over the years.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Today’s episode takes a deep dive into Rahul’s recent talk at WordCamp Asia, which focused on what it will take to launch and scale an enterprise WordPress agency in the future. The conversation focused on real, hard-won lessons from rtCamp’s journey, but also on how rapidly the playbook is changing with advances in technology, particularly the explosion of AI tools and workflows.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We discuss Rahul’s philosophy around hiring, namely, building a team of people whose strengths complement each other, rather than just replicating your own skillset. This approach has allowed rtCamp to adapt to new challenges, fill gaps in expertise, and weather major industry changes.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We then explore how this idea of “complementary sets” can also apply to choosing the right kinds of clients, those who value your expertise because they need what you offer, rather than simply hiring someone who does what they already know.</p>\n\n\n\n<p class=\"wp-block-paragraph\">A theme that emerged in the conversation was specialisation. Rahul outlines how, whereas rtCamp’s earliest differentiator was a simple focus on WordPress (when virtually no one else in India was), today’s agencies must drill down much further to stand out, choosing niches within niches, such as WooCommerce or payment gateway integrations, and becoming recognised experts in those areas in order to thrive in a much more crowded field.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Towards the end of the episode the discussion turns toward what might be the most significant topic for agencies today, artificial intelligence. Rahul described how recent advances in AI have not only altered his agency’s practices, but have given them a firm mandate, if something within rtCamp can be done by AI, it will be.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We talk about how AI is being leveraged inside rtCamp to automate and optimise everything from sales and proposal writing to project management and even technical proof-of-concept builds. With a unified platform for all business processes, the agency is now able to significantly reduce costs, speed up delivery, and focus on higher-value consulting and creativity, reshaping roles and team composition as a result.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you’re interested in what it takes to stand out and succeed in the evolving world of enterprise WordPress agencies, how to confront uncertainty with both optimism and realism, and how AI can become not just a bolt-on feature but the operational backbone of your business, this episode is for you.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Useful links</h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://rtcamp.com\">rtCamp</a></p>\n\n\n\n<p class=\"wp-block-paragraph\">Rahul&#8217;s presentation at WordCamp Asia 2026: <a href=\"https://asia.wordcamp.org/2026/session/how-to-start-an-enterprise-wordpress-agency-in-2026/\">How to start an enterprise WordPress agency in 2026</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://wordpress.tv/2026/04/21/how-to-start-an-enterprise-wordpress-agency-in-2026/\">The same presentation on WordPress.tv</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://rtcamp.com/blog/17-years-of-good-work/\">A year of reinvention as we turn 17</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://frappe.io\">Frappe tools</a> mentioned several times during the podcast</p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://x.com/rahul286\">Rahul on X</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://www.linkedin.com/in/rahul286/\">Rahul on LinkedIn</a></p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 17 Jun 2026 14:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Nathan Wrigley\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:28;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:94:\"Open Channels FM: BackTalk on Mission, Media, Localization, AI, and Giving Back to Open Source\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555607\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:97:\"https://openchannels.fm/backtalk-on-mission-media-localization-ai-and-giving-back-to-open-source/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:189:\"The content reflects on past discussions highlighting the importance of amplifying diverse voices, localizing strategies, and contributing to the open-source ecosystem for future relevance.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 17 Jun 2026 09:40:01 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:29;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Matt: Audio Wars\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=153172\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"https://ma.tt/2026/06/audio-wars/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:1875:\"<p class=\"wp-block-paragraph\">It looks like Ubiquiti is coming for Sonos with its <a href=\"https://store.ui.com/us/en/category/premium-iot/products/upl-port\">PoE Audio Port, a $199 device</a> that closely resembles <a href=\"https://amzn.to/4vXqjcH\">the $499 Sonos Port</a>, and <a href=\"https://store.ui.com/us/en/products/upl-amp\">$599 PowerAmp</a>. Sonos is going up-market with <a href=\"https://www.sonos.com/en-us/shop/amp-multi\">the Amp Multi</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Sonos has <a href=\"https://www.bloomberg.com/news/features/2026-03-10/sonos-new-speaker-heralds-revival-under-ceo-tom-conrad-after-app-fiasco?sref=tT7Af65V\">had a rough patch</a>, but I&#8217;m pretty ride or die for them, and some of my favorite people are there: <a href=\"https://www.linkedin.com/in/tomconrad/\">Tom Conrad, the CEO</a>, <a href=\"https://www.linkedin.com/in/hbarra/\">Hugo Barra on the board</a>, and <a href=\"https://miketatum.com/\">Mike Tatum</a> in CorpDev (he&#8217;s the guy who got me to drop out of college and join CNET back in 2004!).</p>\n\n\n\n<p class=\"wp-block-paragraph\">The only time I don&#8217;t do Sonos in a home is for the <a href=\"https://syngspace.com/\">amazing audio experience of Syng Alpha</a>. The triphonic thing can be really magical. (Analog/vinyl is <a href=\"https://ma.tt/2009/04/visiting-shindo-labs/\">still Shindo Laboratories</a>, but that&#8217;s just for special occasions.)</p>\n\n\n\n<p class=\"wp-block-paragraph\">For headphones right now, it&#8217;s either <a href=\"https://www.colorware.com/collections/wordpress\">some custom Airpods Pro 3</a> or <a href=\"https://amzn.to/44c5wGf\">the Sennheiser HDB 630</a> (<em>Hat tip: <a href=\"https://pud.com/\">Pud</a></em>, who is also making some crazy headphones).</p>\n\n\n\n<p class=\"wp-block-paragraph\">On the go, I love pairing two <a href=\"https://amzn.to/4fQSchD\">Logitech Megaboom 4s</a>.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 17 Jun 2026 06:59:03 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:30;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:77:\"Open Channels FM: Summer Updates New Features and Changes to Open Channels FM\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555698\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:84:\"https://openchannels.fm/summer-updates-new-features-and-changes-to-open-channels-fm/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:192:\"Bob Dunn updates on Open Channels FM\'s recent developments, including a homepage redesign, the launch of \"Do the Woo\" as a standalone podcast, and upcoming features like Open Channels FM Live.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 16 Jun 2026 11:55:19 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:31;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:20:\"Matt: Assorted Links\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=153102\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:39:\"https://ma.tt/2026/06/assorted-links-2/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:10498:\"<p class=\"wp-block-paragraph\">Sometimes you have to just start with beauty.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Listen to <a href=\"https://open.spotify.com/album/3eXr4s3rCLxNJpxqaIDyqJ?si=Z2vNOEF2Rm-s6BAkCVN4hg\">Jon Batiste&#8217;s <em>Beethoven Blues</em></a>, then <a href=\"https://www.youtube.com/watch?v=7VM8MsR4K10\">relish this interview, where he plays and talks about it</a>. I can&#8217;t <a href=\"https://theisolationjournals.substack.com/p/black-mozart\">wait for Black Mozart</a>, which is already starting <a href=\"https://open.spotify.com/prerelease/4WWjrjAmp0Xqah9zqgir4M?si=6ea98fbd9d1d40ee\">to trickle on Spotify</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Forget all <a href=\"https://www.ferrari.com/en-EN/auto/ferrari-luce\">that Ferrari stuff</a>, what <a href=\"https://www.wallpaper.com/design-interiors/lighting/jony-ive-lovefrom-balmuda-sailing-lantern\">Jony Ive did with his LoveFrom Sailing Lantern</a> is divine. I&#8217;ve now seen it in person, and it&#8217;s the light at the end of the tunnel.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img alt=\"\" class=\"wp-image-153109\" height=\"340\" src=\"https://i0.wp.com/ma.tt/files/2026/06/sailing-lantern-1024x576.jpg?resize=604{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C340&#038;quality=89&#038;ssl=1\" width=\"604\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\">That led me to discover how awesome <a href=\"https://us.balmuda.com/\">Balmuda is</a>, and stumble upon the Japanese word <em>Monozukuri</em>, which, according to Google, &#8220;(ものづくり) is a foundational Japanese philosophy that translates literally to <em>the art and science of making things</em>&#8221; It goes far beyond standard manufacturing or production, representing a deep, holistic mindset that embraces craftsmanship, a relentless pursuit of perfection, pride in one&#8217;s labor, and a deep respect for materials.&#8221; Look <a href=\"https://global.toyota/en/newsroom/corporate/39758220.html\">at how Toyota embodies it</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Om has a <a href=\"https://om.co/2026/06/07/the-myth-the-mythos-and-the-man/\">beautiful and prescient post on The Myth, the Mythos and the Man</a>.  It predicted some of this <a href=\"https://www.techmeme.com/260615/p20#a260615p20\">Fable kerfuffle</a>.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Connection</h2>\n\n\n\n<p class=\"wp-block-paragraph\">How <a href=\"https://source.android.com/docs/core/ota/modular-system/tethering\">amazing is tethering on Android</a>? I have a <a href=\"https://amzn.to/49TXYeM\">Pixel 10 Pro</a> with a USB-C Ethernet hub plugged into the WAN port of a <a href=\"https://store.ui.com/us/en/products/udr-5g-max\">Unifi Dream Router 5G Max</a> because the <a href=\"https://www.qualcomm.com/modems/products/snapdragon-x62-5g-modem-rf-system\">Qualcomm chip Unifi uses</a> is two generations behind what&#8217;s in the phone. (Hat tip: <a href=\"https://jesse.blog/\">Jesse</a>.) How <a href=\"https://satellitemap.space/constellation/starlink\">amazing are the 10,653 Starlink satellites floating above us, providing broadband from space</a>, from a company I heard <a href=\"https://x.com/gjurvetson/status/2065452568902279655\">might have had an IPO last week</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I reconfigure ports, channels, and flows, as nurses do for arteries and cannulas.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Numbers Don&#8217;t Lie, Check The Scoreboard</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Not <a href=\"https://www.nytimes.com/athletic/7355407/2026/06/13/knicks-nba-championship-game-5-win/\">just the Knicks</a>. After a 3-year hiatus of Review Signal benchmarks, the headline was <a href=\"https://www.therepository.email/review-signal-publishes-2026-hosting-benchmarks-after-three-year-gap-powered-by-its-own-open-source-load-testing-platform\">that Pressable dominated every category</a>, and with perfect uptime. However, the real story is about <a href=\"https://wp.cloud/\">WP.cloud</a>, which is behind the top scores for not just Pressable and WordPress.com but also the <a href=\"https://www.bluehost.com/cloud-hosting\">Bluehost Cloud plans</a>, beating <a href=\"https://www.oracle.com/cloud/\">Oracle Cloud</a> and <a href=\"https://cloud.google.com/\">GCP</a>-based solutions. </p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://wp.cloud/\">WP.cloud</a> is <a href=\"https://ma.tt/files/2026/06/bezos-aws.jpeg\">our AWS</a>; <a href=\"http://pressable.com/\">Pressable</a> is our demo site. We want <em>every</em> host to offer the fastest and <em>most secure</em> WordPress possible. I&#8217;m happy to focus on infrastructure and let others figure out marketing and such <a href=\"https://en.wikipedia.org/wiki/Hi_and_Lois\">foofram</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you speak Danish and would like a random Radical Speed Month art project detour, check out <a href=\"https://automattic.github.io/nima/\">Joen Asmussens&#8217; Nima</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://automattic.com/\">Automattic</a> has been shipping, shipping, shipping. <a href=\"https://wordpress.com/blog/2026/06/10/wordpress-com-is-now-available-in-stripe-projects/\">Start a WP.com site from the terminal with Stripe Projects</a>. <a href=\"https://akismet.com/blog/introducing-the-official-akismet-php-sdk/\">Akismet PHP SDK</a>. Fun experiments from Radical Speed Month like <a href=\"https://wordpress.com/blog/2026/04/27/studio-code-beta/\">Studio Code</a>, <a href=\"https://www.stattic.net/\">Stattic</a>, <a href=\"https://wordpress.com/workspace/\">Workspace Mac App</a>, <a href=\"https://github.com/Automattic/cortext\">Cortext</a>, <a href=\"https://pressship.org/\">Pressship</a>, <a href=\"https://wapuu.studio/\">Wapuu Studio</a>,  <a href=\"https://studiowrite.app/\">Studio Write</a>, <a href=\"https://wordpress.org/plugins/desktop-mode/\">Desktop Mode</a>, <a href=\"https://flavorpress.io/\">FlavorPress</a>, <a href=\"https://github.com/jonathanbossenger/concilium\">Concilium</a>, <a href=\"https://developer.woocommerce.com/2026/05/07/woocommerce-for-claude/\">WooCommerce insights in Claude</a>, and <a href=\"https://en.wikipedia.org/wiki/Kaizen\">the <em>kaizen</em></a> of hundreds of behind-the-scenes bug fixes and improvements across our product suite. </p>\n\n\n\n<p class=\"wp-block-paragraph\">Much of this came from those not historically in a product or engineering role, which we&#8217;re learning to navigate. I loved how customer-centric many things were. We also made a lot of rookie mistakes, but that&#8217;s part of how you learn, and I believe the acceleration of learning will be the biggest legacy of the Radical Speed Month experiment. That, and the fun games on <a href=\"https://automattic.com/work-with-us/\">our intranet</a>. <img alt=\"🙂\" class=\"wp-smiley\" src=\"https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png\" style=\"height: 1em;\" /></p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img alt=\"\" class=\"wp-image-153136\" height=\"201\" src=\"https://i0.wp.com/ma.tt/files/2026/06/automattic-game-center-banner-1024x341.jpeg?resize=604{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C201&#038;quality=89&#038;ssl=1\" width=\"604\" /></figure>\n\n\n\n<h2 class=\"wp-block-heading\">AI Hangover</h2>\n\n\n\n<p class=\"wp-block-paragraph\">I have <a href=\"https://ma.tt/2023/10/wowza/\">drunk from the sweet nectar of Waymo</a>, and now find myself calling an Uber so I can talk to 72-year-old Antoly from Azerbaijan, whom I slip a hundred-dollar bill as I step out. I weep when I see talented colleagues speak and write with words not quite their own. I <a href=\"https://www.pangram.com/\">masochistically Pangram everything</a> even though it sometimes mistakes my own hand-crafted prose for slop, or is that actually my soul being sanded down by consuming too many statistically probable next tokens?</p>\n\n\n\n<p class=\"wp-block-paragraph\">The uncanny valley of software, writing, products, and presentations so polished on the surface but built on thin foundations of understanding gives me an almost physical, nauseous reaction. I write this even as I listen to <a href=\"https://www.youtube.com/watch?v=tRsQsTMvPNg\">Claude FM music for thinking and building</a>,  probably <a href=\"https://ma.tt/files/2026/06/mythos-jailbreak-791x1024.jpeg\">Mythos-injected with subliminal messages</a> to remind me of the hours of audio transcribed in minutes; the programs that would have taken a team months, conjured from my hand in hours; the way I feel <a href=\"https://www.youtube.com/watch?v=8XV8aBNOIqI\">like Neo in the Matrix</a>, rapidly downloading new domains of knowledge.</p>\n\n\n\n<p class=\"wp-block-paragraph\">What&#8217;s the name for the paradox, <a href=\"https://en.wikipedia.org/wiki/Jevons_paradox\">like Jevon&#8217;s</a>, that AI abundance and polish makes you crave messy, imperfect humanity even more?</p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s good to debate and ruminate, but only in small doses. Like salt in a dish, a little goes a long way. Avoid the <a href=\"https://pmc.ncbi.nlm.nih.gov/articles/PMC11036542/\">existential angst</a> of charting new territory by getting your hands dirty and trying things. You learn the most from failures when you can <a href=\"https://apagefrommunakusbook834350529.blog/2023/02/03/learning-to-laugh-at-yourself/\">laugh at yourself</a>.  <a href=\"https://amzn.to/4vmWaDB\">Build one to throw away</a>.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Write Different</h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Writing is not the most important thing; thinking is. But writing is probably the best way to improve your thinking.</p>\n</blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">I saw this quote attributed to me and didn&#8217;t remember it, so I thought it might be an AI hallucination, but it&#8217;s actually something I said! In <a href=\"https://perell.com/podcast/matt-mulleweg/\">this early-years podcast with David Perell</a> buried on some corner of his site. Now <a href=\"https://www.youtube.com/@DavidPerellChannel\">David&#8217;s production quality is stellar</a>, and he gets amazing guests like <a href=\"https://www.youtube.com/watch?v=yb9Tz-RQFN4\">Maria Popova to discuss their craft</a>. I&#8217;ve enjoyed his rise and look forward to <a href=\"https://perell.com/\">following him</a> in the decades to come.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<p class=\"wp-block-paragraph\">I could edit and link much more, but sometimes you have to just <a href=\"https://vimeo.com/12238385\">press the Publish button</a> and <a href=\"https://www.youtube.com/watch?v=bJVOo4K_GGM\">let go</a>.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 15 Jun 2026 19:20:04 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:32;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:96:\"Open Channels FM: The Balancing Act: Freedom, Convenience, and Open Source in an AI-Driven World\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555638\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:100:\"https://openchannels.fm/the-balancing-act-freedom-convenience-and-open-source-in-an-ai-driven-world/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:341:\"So many of us are in a evolving relationship between freedom, convenience, and open source software in the world shaped by AI. The promise of freedom which is central to the open web and open source movements has to be continually weighed against the growing demand for convenience and simplicity. While open source software offers [&#8230;]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 15 Jun 2026 12:16:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:33;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:49:\"Akismet: Introducing the official Akismet PHP SDK\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"http://akismet.com/?p=284799\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:66:\"https://akismet.com/blog/introducing-the-official-akismet-php-sdk/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4711:\"<figure class=\"wp-block-image size-large\"><img alt=\"\" class=\"wp-image-284805\" height=\"429\" src=\"https://akismet.com/wp-content/uploads/2026/06/screenshot-2026-06-10-at-11.38.37-am.png?w=1024\" width=\"1024\" /></figure>\n\n\n\n<div class=\"wp-block-jetpack-markdown\"><p>For twenty years, Akismet has kept spam out of WordPress. But spammers don’t care what your site runs on and neither do we.</p>\n<p>Last month we launched the <a href=\"https://akismet.com/blog/introducing-the-official-akismet-drupal-module/\">official Akismet Drupal module</a>. Today we’re introducing the engine that powers it: the official Akismet PHP SDK, a first-party client that brings Akismet to any PHP application.</p>\n<h2 id=\"what-it-is-and-who-itâ€™s-for\">What it is, and who it’s for</h2>\n<p>The Akismet PHP SDK is a first-party PHP client for the Akismet API. It’s built for the platforms the WordPress plugin doesn’t reach: custom apps, SaaS backends, and PHP frameworks like Laravel and Symfony. (The official plugins are still the way to go for <a href=\"https://wordpress.org/plugins/akismet/\">WordPress</a> and <a href=\"https://www.drupal.org/project/akismet_antispam\">Drupal</a>.)</p>\n<p>Under the hood it’s built to feel at home in a modern PHP codebase:</p>\n<ul>\n<li>Covers the full Akismet API, from comment-check and spam/ham submissions to key verification, usage limits, and account stats.</li>\n<li>Works with any PSR-18 HTTP client you already have (Guzzle, Symfony HttpClient, and the like) through auto-discovery.</li>\n<li>Ships a typed exception hierarchy that redacts your API key, so credentials never leak into your logs.</li>\n</ul>\n<h2 id=\"a-two-minute-quick-start\">A two-minute quick start</h2>\n<p>Install it with Composer:</p>\n<pre><code class=\"language-bash\">composer require automattic/akismet-sdk\n</code></pre>\n<p>Then check a submission:</p>\n<pre><code class=\"language-php\">use Automattic\\Akismet\\Akismet;\nuse Automattic\\Akismet\\DTO\\Content;\nuse Automattic\\Akismet\\Enum\\ContentType;\n\n$akismet = Akismet::create(\n    apiKey: \'your-api-key\',\n    site: \'https://your-site.com\',\n);\n\n$content = new Content(\n    userIp: $_SERVER[\'REMOTE_ADDR\'],\n    userAgent: $_SERVER[\'HTTP_USER_AGENT\'],\n    body: $formData[\'message\'],\n    authorEmail: $formData[\'email\'],\n    type: ContentType::ContactForm,\n);\n\n$result = $akismet-&amp;gt;check($content);\n\nif ($result-&amp;gt;isSpam()) {\n    // Reject it, flag it, or queue it for review.\n    // $result-&amp;gt;shouldDiscard() marks the blatant spam you can drop outright.\n}\n</code></pre>\n<p>That’s the loop: build a <code>Content</code> object, call <code>check()</code>, act on the result.</p>\n<h2 id=\"already-running-in-production\">Already running in production</h2>\n<p>The official Akismet <a href=\"https://www.drupal.org/project/akismet_antispam\">Drupal module</a> is built on this SDK. The SDK handles the API contract and type safety, while the module handles Drupal’s service wiring, queues, and moderation UI. That’s the pattern for Laravel, Symfony, and anything else you build: the SDK owns the Akismet integration and your framework owns the glue.</p>\n<h2 id=\"whatâ€™s-new-in-1-5-0\">What’s new in 1.5.0</h2>\n<p>We have just released v1.5.0, which is about giving Akismet more to work with, and giving you more back:</p>\n<ul>\n<li><strong>Richer content signals:</strong> <code>Content</code> now carries the site’s language and character set, plus the surrounding conversation context, so every check has more to go on.</li>\n<li><strong>More insight into every verdict:</strong> <code>CheckResult</code> now surfaces the error and classification Akismet returns, so you can log and act on <em>why</em> something was flagged, not just whether it was.</li>\n<li><strong>Extended multi-site reporting:</strong> For keys that span many sites, the new extended key-sites data adds per-site metadata for cleaner reporting and account hygiene.</li>\n</ul>\n<h2 id=\"get-started\">Get started</h2>\n<p>The SDK is open source and live on Packagist today.</p>\n<ul>\n<li>Install: <code>composer require automattic/akismet-sdk</code></li>\n<li>Packagist: <a href=\"https://packagist.org/packages/automattic/akismet-sdk\">automattic/akismet-sdk</a></li>\n<li>Source and docs: <a href=\"https://github.com/Automattic/akismet-sdk-php\">github.com/Automattic/akismet-sdk-php</a></li>\n</ul>\n<p>You’ll need an Akismet API key to make calls. Akismet’s <a href=\"https://akismet.com/pricing/\">Personal plan</a> is pay-what-you-can and free for personal, non-commercial sites. If you’re running something commercial, pick a paid plan that matches your traffic. Either way your code stays identical, since the plan lives with your API key, not in the SDK.</p>\n</div>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 15 Jun 2026 10:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Derek Springer\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:34;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:59:\"Open Channels FM: The Changelog: Still Here, Still Doing It\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555551\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:64:\"https://openchannels.fm/the-changelog-still-here-still-doing-it/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:305:\"A bit over four years ago, in 2022, I recorded an episode from San Diego. I was getting ready for an event, about to attend my first-ever Contributor Day (which, yes, felt a little absurd given how many WordCamps I&#8217;d been to by that point). To fill the time before things kicked off, I sat [&#8230;]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 12 Jun 2026 08:10:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:35;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"Dennis Snell: Gutenberg Package Activity\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"https://fluffyandflakey.blog/?p=3901\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:67:\"https://fluffyandflakey.blog/2026/06/11/gutenberg-package-activity/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:1001:\"<p class=\"wp-block-paragraph\">Last week at <a href=\"https://europe.wordcamp.org/2026/\">WordCamp Europe</a> there was a get-together among WordPress Core committers and a question arose concerning the separate Gutenberg <code>npm</code> packages that are built and distributed. I was curious about how frequently they are updated and which ones are most active, so I asked Codex to review <code>git</code> commit activity, gather commits per package which touch files in that package, and then render it into a plot. It produced this.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Also available <a href=\"https://fluffyandflakey.blog/wp-content/uploads/2026/06/gb-package-rates.html\">as a PNG image</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Script available <a href=\"https://gist.github.com/dmsnell/107642d8791e5bb88c4a3f9c521dad3d\">in a gist</a>.</p>\n\n\n\n<div class=\"wp-block-group alignwide\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n\n</div></div>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 11 Jun 2026 20:34:47 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Dennis Snell\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:36;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:97:\"Open Channels FM: WordCamp Europe Takeaways: Community Vibes, Tech Advancements and Smarter Tools\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555456\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:102:\"https://openchannels.fm/wordcamp-europe-takeaways-community-vibes-tech-advancements-and-smarter-tools/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:215:\"This Open Channels FM episode from WordCamp Europe discusses the event\'s vibrant atmosphere, the integration of AI in WordPress workflows, and the positive community outlook on evolving technology and opportunities.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 11 Jun 2026 08:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:37;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:104:\"WPTavern: #220 – Cathy Mitchell on Why WordPress Events Matter: Community, Connection, and Giving Back\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"https://wptavern.com/?post_type=podcast&p=204704\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:115:\"https://wptavern.com/podcast/220-cathy-mitchell-on-why-wordpress-events-matter-community-connection-and-giving-back\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:52587:\"<details>Transcript<div>\n<p class=\"wp-block-paragraph\">[00:00:19] <strong>Nathan Wrigley:</strong> Welcome to the Jukebox Podcast from WP Tavern. My name is Nathan Wrigley.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Jukebox is a podcast which is dedicated to all things WordPress, the people, the events, the plugins, the blocks, the themes, and in this case, why WordPress events and community matter.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;d like to subscribe to the podcast, you can do that by searching for WP Tavern in your podcast player of choice, or by going to wptavern.com/feed/podcast, and you can copy that URL into most podcast players.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you have a topic that you&#8217;d like us to feature on the podcast, I&#8217;m keen to hear from you and hopefully get you, or your idea, featured on the show. Head to wptavern.com/contact/jukebox, and use the form there.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So on the podcast today, we have Cathy Mitchell. Cathy has been working with WordPress since 2007. What began as a fun personal project during her maternity leave soon evolved into a fully fledged business with the launch of WPBarista in 2008. Over the years, Cathy has garnered extensive experience in the WordPress space, and is now working towards the 2026 WordCamp Canada.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The conversation focuses on the powerful role of community within the WordPress ecosystem, something that Cathy is deeply passionate about. We discuss how open, welcoming, and international the WordPress community feels, compared to more traditional corporate or volunteer environments. A theme that emerged was how involvement in WordPress has provided Cathy, and many others, with a sense of belonging and fulfilment, especially after life changes like becoming an empty nester.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The discussion explores the motivations for volunteering and organising within the WordPress community, both from the perspective of newcomers looking for purpose and connection, and business owners assessing the return on investment from contributing or sponsoring events. This includes how easy it is to get involved, the unique lack of barriers and red tape, and the value of altruism and camaraderie.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Other topics we explored with a broader impact of technology and loneliness, the importance of service and community for wellbeing, challenges in sponsorship amid changes economic times, and the vital need to engage the next generation in open source.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re interested in the human side of WordPress, how volunteering shapes both individual and the broader community, and what the future might hold for WordPress events and contributors, this episode is for you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re interested in finding out more, you can find all of the links in the show notes by heading to wptavern.com/podcast, where you&#8217;ll find all the other episodes as well.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And so without further delay, I bring you Cathy Mitchell.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I am joined on the podcast by Cathy Mitchell. Hello, Cathy.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:25] <strong>Cathy Mitchell:</strong> Hello. Thanks for having me.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:27] <strong>Nathan Wrigley:</strong> You are very welcome. Cathy and I have been having, well, 15 minutes or so of chit chat just before we started the podcast. I&#8217;ve been learning a little bit about Cathy and we&#8217;re going to share all sorts of information.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I think probably broadly we could talk about it as being the WordPress community, which is a subject which is dear to my heart.</p>\n\n\n\n<p class=\"wp-block-paragraph\">However, before we get into that, Cathy, I&#8217;ve had an introduction from you over the last few minutes, but would you mind sort of giving us your potted version of that, your shorter version, your bio if you like. Tell us who you are and how come you&#8217;re featuring on a WordPress podcast.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:58] <strong>Cathy Mitchell:</strong> Well that&#8217;s a whole lot of imposter syndrome. Why I am featuring, because you&#8217;re kind enough to have me. I&#8217;ve been working with WordPress since 2007 and it was just something fun that I did to begin, much like you with podcasting.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And then a couple years in, I told my friends that they&#8217;d have to start paying me, or I was going to go back to work, find a real job. This was during my mat leave, and so it kind of just took off from there in 2008, started WPBarista.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And now I&#8217;m very interested in the community because I was looking for something to do in the WordPress community last year. Dan in the Canada Slack got a hold of me and said, hey, do you want to help with the WordCamp? And I said, sure. You know, I had time.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And he got me in and brought me right up to like being on the organising team. And it was so fun but so shocking. Like, there is a lot of red tape in the corporate world before they let you do anything meaningful. Like you have to sweep the floors for a whole long time before they let you actually do something you&#8217;re good at. So this was remarkable. And this year I find to my surprise, I&#8217;m leading the 2026 WordCamp Canada.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So that&#8217;s what I&#8217;m doing now. And we&#8217;re going to focus on community too. So I&#8217;m very excited about this topic, both from a corporate, like what do we get out of this? Or are we supposed to get something out of this? And from a personal standpoint, it&#8217;s been amazing to meet these people, and to be given a chance. And I found out I&#8217;m not the only one. This is like normal, which is bizarre and wonderful.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:05:37] <strong>Nathan Wrigley:</strong> My experience of the WordPress community, so I started in WordPress actually quite a long time after you did. Maybe sort of six or seven years after you began using WordPress. I really didn&#8217;t know that there was a community at all. I just downloaded the software and used the software. And then I can&#8217;t even remember really how it happened. It might have been through things like Facebook Groups or something like that, where I was trying to learn a particular thing? Or perhaps there was something in the dashboard which indicated that there was an event nearby.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But I found myself, to my own surprise actually, I found myself at a WordPress event in London, WordCamp London, which at the time was going really strong. You know, hundreds and hundreds of people would show up every year.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And I remember purchasing a ticket and getting the train ticket and thinking, what am I doing? What am I possibly hoping to get out of this? And showing up and kind of being a bit like a timid rabbit sitting in the corner a little bit, and then it kind of worked out fairly quickly. Okay, this is all fairly benign. Nobody seems to be all that boastful. Nobody seems to be sort of shoving corporate speech down my throat, or trying to sell me anything unnecessarily.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And during the course of a day or maybe a couple of days, opened up a little bit and got chatting to people. And lo and behold, within a couple of years, a significant proportion of my free time, let&#8217;s call it that, outside of the commitments of daily life and family and all of that kind of thing, was taken up with doing WordPressy things in my spare time.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And so I, I don&#8217;t know if the story maps the same as you, I&#8217;ve shared mine, maybe you&#8217;ll share something similar in a moment. The community to me is much more than just, oh, there&#8217;s a community there. It genuinely is a seriously important part of my life. To the point where if that was to be sort of whipped away, or somebody like a Thanos type character suddenly clicked their fingers and that disappeared, I don&#8217;t know what I would do with myself. I would really have to go out there and find an awful lot of other things to do. Was it a bit like that for you?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:07:41] <strong>Cathy Mitchell:</strong> Not at all. I went to the forums first. And in 2008, 2009, there were some big names nowadays that were just answering us in the support forums. And so I learned from the best of the best, I think. And they would answer my ridiculous questions. I had no idea about PHP. I didn&#8217;t even know HTML. I didn&#8217;t even know what the internet was, like as broad concept. I asked my husband at the time like, okay, I don&#8217;t understand how my computer is talking to someone else&#8217;s computer, like you need to draw me a picture.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So anyway, I&#8217;ve only recently, I went to a couple of events, but I&#8217;ve always had the business mind. If I can&#8217;t see an ROI financially, I&#8217;ll say, from what I&#8217;m doing, then I don&#8217;t have time for it. But that was also during a time when I had a young family and then I became a single mum and then I had to work this business. And so it&#8217;s only really recently that I&#8217;m looking around and seeing people like you and going, this is unique.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;ve been in volunteer communities, and now that my kids are all grown up, I&#8217;m kind of looking for those opportunities. What meaningful thing can I do with my time? And this just seems so unique. Like I volunteered at other places and there&#8217;s so much red tape and there&#8217;s so much, I don&#8217;t know, different feelings than this one. This one&#8217;s very open.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:09:09] <strong>Nathan Wrigley:</strong> I think the bit that is so curious to me is you can sort of dip in and dip out of it. Because, I don&#8217;t know, let&#8217;s say for example, you do something much more local, involved with your hometown or something like that. And you get involved in it and there&#8217;s a certain kind of, pressure is the wrong word, I suppose you can dip in and dip out of that as well, but do you know what I mean? You get involved in those philanthropic things locally and you get to know things and it becomes more of a habit, and you do the same thing over and over again. At least that&#8217;s my experience.</p>\n\n\n\n<p class=\"wp-block-paragraph\">What I quite like about this is the international flavour of it. The fact that I&#8217;m being introduced people from really different parts of the world and cultures. And it&#8217;s very, very open, and it&#8217;s a real contrast to the bit that you just mentioned, where the corporate bit, and obviously there&#8217;s a side of our community which is very much devoted to turning a profit and what have you. But there&#8217;s a significant proportion of the people who don&#8217;t have that metric in their head when they&#8217;re introducing themselves to people.</p>\n\n\n\n<p class=\"wp-block-paragraph\">They are just trying to be helpful and trying to deliver on the promise that the internet gave us back in the 1990s of, here&#8217;s the infrastructure to pass information around freely. Wouldn&#8217;t it be nice if everybody had the capacity to publish things, or to share things online without some sort of corporate overlord or paywall or algorithm? Which we&#8217;ve now probably regret deeply allowing that to happen to the internet.</p>\n\n\n\n<p class=\"wp-block-paragraph\">All of those kind of things come into play. I have constantly, for the last decade, tried to sum up and capture what this is. And I always fail. It simply feels nice, is all that I&#8217;ve got, really. This community, the people in it that I hang out with, it just feels like a nice thing to do. That&#8217;s all I&#8217;ve got. No wisdom beyond that. It&#8217;s bizarre, isn&#8217;t it?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:10:53] <strong>Cathy Mitchell:</strong> I&#8217;ve been trying to quantify it too, and especially planning this next conference. I feel much like a student because there&#8217;s a large group, probably most people are not like me. Like they&#8217;re like you, at least the ones, in Slack that I&#8217;m talking to on a daily basis. And they&#8217;re the original nerds who are so happy, like were inspired and spent their free time, like this wasn&#8217;t their job. Promoting this and like answering my questions in forum as an absolute noob. So in that way I feel like I would really like to give back now.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But the community, yeah, I can&#8217;t quite put my finger on. I just talked to a sponsor yesterday and she is of course wanting to get in front of her audience, which is agency owners. But there&#8217;s a real sense of promoting the community because the healthier the community, the healthier all of us are. Not just financially, but it creates the forward momentum, I think as far as open source as a whole too. Like there&#8217;s a bunch of us, me included, even though I kind of am taking a corporate angle that really believe that open source could change the world. I still do, maybe even more so because AI is, can actually talk to things that are open source. Less so if everything&#8217;s behind a paywall.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:12:09] <strong>Nathan Wrigley:</strong> I think one of the things that you mentioned there, which suddenly sort of struck me is whilst there are a handful of people out there, and I say a handful, there&#8217;s obviously many millions of people. I think it&#8217;s fair to say that many people prefer to be in proximity to other people, to do things, to be in conversation with people, to have a shared experience. You know, we go to the cinema or the movie theatre to watch a movie. I mean I know the screen&#8217;s bigger and everything, but part of it is to be with other people and to go ooh and ah, at the same time and go to firework displays and concerts and things like that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Now all of that stuff can be done in an isolated environment in your house. You know, you can watch Netflix and you can watch the TV and get a similar kind of experience. But I think there&#8217;s some sort of core part of me at least, and the people that I hang out with at these kind of events and online who just enjoy that shared experience, that willingness to be involved in a similar task. Just to be pointing in the same direction as a bunch of other people, pulling together on the same team. And it&#8217;s unquantifiable. I literally can&#8217;t encapsulate it, but I think you and I are talking about the same thing.</p>\n\n\n\n<p class=\"wp-block-paragraph\">What&#8217;s interesting is I accidentally found it fairly early on in my WordPress journey. Serendipity played a really blinding hand for me there. But I think had I not had, bit like that film Sliding Doors, I could easily have missed the cues which sent me to that WordCamp or whatever it was that got me started. And I probably could have gone for a decade or more and not even noticed it was a community and maybe discovered it much more recently.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And it sounds like that&#8217;s kind of happening to you. You mentioned that you are, I think in the show notes you described it as, it&#8217;s a lovely phrase, empty nesting. Does that mean when your children grow up and go away? Is that what that means?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:13:53] <strong>Cathy Mitchell:</strong> Yeah. That&#8217;s a pretty common phrase over here.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:13:55] <strong>Nathan Wrigley:</strong> Oh, okay.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:13:56] <strong>Cathy Mitchell:</strong> This side of the pond. You know, you kick the little birdies out, and they&#8217;re spreading their wings. All of a sudden we&#8217;re left with, it&#8217;s a different life stage. I think we were talking a little bit about it. You&#8217;re getting there.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:14:08] <strong>Nathan Wrigley:</strong> I&#8217;m going to there very, yeah, awh, it&#8217;s kind of filled with melancholy. On the hand, obviously I would love for my children to grow up, but on the other hand it&#8217;s, pulls all the heartstrings, doesn&#8217;t it?</p>\n\n\n\n<p class=\"wp-block-paragraph\">So you are finding space in your life to do this kind of stuff. I&#8217;m going to ask a question, which is maybe a little bit personal, I don&#8217;t know. Hope you don&#8217;t read it in the wrong way. Do you find this stuff like meaningful and significant? Do you get a sense of fulfilment and satisfaction from the work that you are doing? For example, with WordCamp Canada.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Because there must be moments when it&#8217;s a real chore and, you know, you&#8217;ve got far too many tasks which are spilling over, and you think, gosh, I&#8217;m just a volunteer. There&#8217;s no quid pro quo here. I&#8217;m just doing it out of the goodness of my heart. But on balance, do you get that warm and fuzzy feeling from doing all of this?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:14:54] <strong>Cathy Mitchell:</strong> That&#8217;s a good question. I had time, so I started volunteering at a bunch of things. I started volunteering teaching kids, and then to go the complete other end of the spectrum, I did a seniors class at my local college last month. I just started volunteering because in my opinion, as a little amateur psychologist, I think service, serving our community is kind of the best way to, like you said, pull alongside someone. And then when you have like a focused goal, there&#8217;s a togetherness and I really need to grow my community.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Me, and I think quite a few other people, there&#8217;s this whole epidemic of loneliness to be frank. Having raised the kids and then having done the job, now all of a sudden it&#8217;s like, I have time to invest in a real community. And I really want it to be worthwhile. I don&#8217;t want to sweep the floors for, maybe it&#8217;s an age thing, I don&#8217;t know. I&#8217;m so, so grateful that they let me do something that I&#8217;m good at, as far as organising, because they didn&#8217;t have to. That&#8217;s a big responsibility to put on somebody. And I am praying it all works out in the fall.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But it comes because of the huge number of volunteers that all work together. So my job&#8217;s just basically pulling all these people together, and making sure that we&#8217;re talking to each other. Because one person can&#8217;t possibly do all of the work that comes with putting on a conference. At least not part-time. But yeah, I&#8217;m finding it immensely rewarding because I also feel like I&#8217;m good at it. Everybody loves to do something they&#8217;re good at.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:16:28] <strong>Nathan Wrigley:</strong> You mentioned something earlier where you sort of implied that you were very surprised that in the WordPress world, you were given a bunch of responsibility for an event. I mean, basically, I think a lot of that, isn&#8217;t there? There&#8217;s a lot of, whoever can show up does get the job really, because there&#8217;s a paucity of volunteers. And for an event of the magnitude of WordCamp Canada, if you&#8217;ve ever been to events like that, you sort of walk in and on every level it feels like a corporate event. You know, it&#8217;s very polished, highly polished. There&#8217;s catering, the venue&#8217;s all been booked, you&#8217;ve got name badges and there&#8217;s probably some translation going on, and there slides and every, there&#8217;s timetables and everything. And it&#8217;s all done by volunteers.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And I remember the same sort of thing, being asked to do a variety of different things and thinking, wait, really? You don&#8217;t know the inside of my head. I will mess this up so badly. But that is such a nice characteristic of our community. And you&#8217;ll fail together, if you know what I mean? You know, it is not like anybody&#8217;s going to let you deeply fail. People will step in and help you, should you need to.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:17:31] <strong>Cathy Mitchell:</strong> Yeah, we have to say yes, like it&#8217;s part of the culture is, if people volunteer, we have to find a way to say yes. Like our default is yes, not, well, have you done this first?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:17:43] <strong>Nathan Wrigley:</strong> Yeah. It&#8217;s interesting because you obviously have done a lot of this kind of corporate stuff, and so have the impression that you ought to be qualified, I don&#8217;t know, a decade or two decades of this particular thing in order to be trusted to do it. And this is just, yeah, this is so different. Anybody? Bueller. Okay, you&#8217;ll do it. Great. Fine. That&#8217;s great, yeah.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:18:03] <strong>Cathy Mitchell:</strong> Yeah. You&#8217;re hired.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:18:04] <strong>Nathan Wrigley:</strong> Yeah, that&#8217;s it. That&#8217;s I&#8217;ve never done it before. It doesn&#8217;t matter. You&#8217;ll be brilliant.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:18:07] <strong>Cathy Mitchell:</strong> We&#8217;ll help you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:18:08] <strong>Nathan Wrigley:</strong> Yeah. And that camaraderie of binding together on a particular thing, in your case WordCamp, but the broader project, you know, the WordPress project as a whole, I feel it&#8217;s full of these kind of people. And we will get into in a minute I&#8217;m sure, how that maybe has changed for some people in the more recent past, and about the fact that the community does feel like it&#8217;s in a bit of a challenging place at the moment.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But I just want to go back a little bit because you mentioned, and neither of us I suspect will have the answer to this, but I&#8217;m interested in your intuitions anyway. You mentioned that people nowadays, maybe this has always been the case, but it feels like there&#8217;s been a change. Loneliness seems to be a very common thing now. And my sort of back of the napkin calculus points me in the direction of wondering if it is actually oddly technology. The very thing that we&#8217;re celebrating. If technology might be responsible for it.</p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, I look around and I see a lot of people who give an awful lot of what would&#8217;ve otherwise been free time, time that they could have gone out and socialised and what have you. And, you know, you sort of end up sitting on the couch and scrolling through social media and things like that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Television has become so absolutely fascinating. You know, there&#8217;s like a billion different channels, and essentially there&#8217;s a thousand ways to keep yourself entertained all by yourself, and never speak to another human being, or be in proximity to another human being. There&#8217;s no question there, I just wondered if you had an observation or a similar thought process.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:19:39] <strong>Cathy Mitchell:</strong> I looked up, because I knew we were going to talk about this, the stat on it. Because I know I&#8217;ve had the same feeling. And I&#8217;ve heard people talk about it, but I didn&#8217;t really know if that was like true or not, because whenever I am thinking or researching something, of course that&#8217;s what the algorithm shows me. So I&#8217;m always kind of hesitant, like is this actually real or am I just seeing this?</p>\n\n\n\n<p class=\"wp-block-paragraph\">But it did say in a 2021 report, the US Surgeon General, and this is in the States, no 2023, that the health impact of a loneliness epidemic. Okay, General Vivek Murthy declared a loneliness epidemic in 2023. And he said that the health impact is the same as smoking 15 cigarettes a day. It&#8217;s not good for us. And that the biggest effect, 79{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} reported feeling lonely of the 18 to 24-year-old group, which is more like 40 some percent. What was it? 41{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} of 66 plus.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:20:35] <strong>Nathan Wrigley:</strong> Okay, so the younger you skew, the more lonely you are likely to be.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:20:40] <strong>Cathy Mitchell:</strong> Yeah. And we also see, now I don&#8217;t know if this is correlative or causative, but technology has also skyrocketed in that period of time.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:20:48] <strong>Nathan Wrigley:</strong> Yes. Yeah, and also probably, again, I&#8217;m drawing conclusions which are not based in fact or research or anything like that. You and I were both born in an era where that technology wasn&#8217;t available. So I imagine patterns were set down in our infant brains, which are perhaps different to the patterns that are set down now.</p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;d be curious to see if there is a there, there. If the broad adoption, certainly in the UK, I can&#8217;t speak to Canada, but the broad adoption of technology to ever and ever younger children, to a really alarmingly early age. You know, you see children who are not even at school age who seem to have access to every technology under the sun, and who don&#8217;t seem to get that interaction from another human being. I wonder. And I&#8217;m going to sound all curmudgeonly and there&#8217;s probably going to be people shouting at me.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:21:34] <strong>Cathy Mitchell:</strong> I have seen it change with the Gen Z that they&#8217;re talking about. And my kids fall in that category. Whereas I wanted to be, okay, it&#8217;s personal responsibility, so we&#8217;re going to raise them. It was new to me, so I raised my kids thinking, okay, tablets, I&#8217;m going to teach you how to use it, not restrict it. I was all open-minded about all.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Now they&#8217;ve told me that if they have kids, they will restrict it far greater than I ever did. They were like, they won&#8217;t have nearly the freedom that I gave them in my open-mindedness.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:22:06] <strong>Nathan Wrigley:</strong> Yeah, well, but you are forgiven for your open-mindedness because I guess humanity perhaps needed more evidence to draw conclusions around that. And perhaps those conclusions are now landing.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:22:16] <strong>Cathy Mitchell:</strong> I think so.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:22:16] <strong>Nathan Wrigley:</strong> Yeah, well, certainly as an example, I know that in Australia more recently, there&#8217;s now a widespread ban, I think under the age of 16, and I&#8217;m going to use the word illegal, maybe that&#8217;s the wrong word. Maybe there&#8217;s a technical definition, but social media is not permitted for children under the age of 16. And I think that there&#8217;s legislation being talked about in the UK of a similar nature, and some other European countries.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I don&#8217;t know how much traction that will have because I feel that there&#8217;s a persuasive argument, much like you described of, it&#8217;ll all work itself out. You know, we don&#8217;t need the government to tell us what to do, and all of that, and that all makes sense.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But my, I can well understand, I think in the UK also, there is a growing, a groundswell of this alternative way of looking at it. Like a rejection of the phones and the technology.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Anyway, there we go. That was an aside. Do you want to contribute into that a little bit more before I push us back in the WordPress space?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:23:11] <strong>Cathy Mitchell:</strong> Yeah, I don&#8217;t want to be all, it&#8217;s bad, it&#8217;s bad, but I think that we&#8217;re seeing an effect. I really do believe that volunteerism, whether it&#8217;s with WordPress or anything else, in my faith background, being a person, a Christian person, I grew up seeing the service as an answer, as just part of our lifestyle. You just serve others. But now I&#8217;m seeing it come in a secular sort of way as well, where service is an antidote to loneliness.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And I think no matter where you&#8217;re serving, not the church or any, like just pick a service. Being that cameraderie with people, having a similar goal, going in the same direction, like I really do think there&#8217;s hope. There&#8217;s hope out there for all of us. And it&#8217;s a great way to do something meaningful. Like you get to do all those things. You get to practise a skill, you get to do something meaningful, you get direction, you get cameraderie all by serving.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:24:03] <strong>Nathan Wrigley:</strong> I&#8217;m going to, say something now, and I&#8217;m going to caveat it heavily before I say it because A, it relies on my prodigiously bad memory, and B, it could just be fabricated anyway because the source could be utterly wrong. But it feels like there&#8217;s a kernel of truth in it.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I was doing some research recently about happiness, that broad subject. You know, we would all like to be happy I&#8217;m sure. There&#8217;s a lot of people who spend a lot of time thinking about what this actually means, and trying to drill it down to some fairly basic maxims, if you like, for what leads to happiness.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Two of the biggest indicators of happiness are really interesting. One of the two is how often you spend with other people basically. How much time you interact with other human beings. Now I know that that&#8217;s not for everybody, but broadly speaking, that seems to be a huge indicator. If you actually get yourself out and you do things with other human beings, there is a definite benefit.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And the other one, which is very curious because I think it&#8217;s fair to say, you know, Canada and the UK, we&#8217;ve been brought up to worry about our own finances and amassing as much stuff as we can, and lining your nest for the future and everything. Well, this other one, controversially, the second one that I&#8217;m going to mention is the amount of stuff that you basically give away. And that could be time, or it could be finance, it could be any of those things. The more that you give away with no expectation of a return, that also apparently is a real indicator of happiness.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And I think we can all identify that. That moment where you give somebody a gift and you&#8217;ve really thought about it, and you hand it over and you watch the face change as they unwrap it. And you think, they&#8217;ve loved that, haven&#8217;t they? And you&#8217;re not thinking to yourself, well, I did that. I made them happy there. You&#8217;re just thinking, oh look, they&#8217;re really happy. Isn&#8217;t that wonderful? So anyway, there&#8217;s my 2 cents of utterly unproven thoughts.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:25:59] <strong>Cathy Mitchell:</strong> Okay. Learned something. Those are two, so the two things were being around people and altruism basically, with nothing expected in return.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:26:08] <strong>Nathan Wrigley:</strong> And funnily enough, they map very closely to what we&#8217;re talking about, right? We&#8217;re talking about events and socialising with other people, but also that, in this case, it&#8217;s not a financial thing that you are giving away, but you are definitely giving away an awful lot of your time for doing these kind of things. And maybe, given that little bit of information, it kind of becomes a little bit easier to justify because if you can say to yourself, this makes me happy, it might not seem it in those stressful moments.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:26:36] <strong>Cathy Mitchell:</strong> Yeah, today.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:26:37] <strong>Nathan Wrigley:</strong> Yeah, that&#8217;s right. But ultimately that might be causing your happiness.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Okay, so there we go. That was our little segue. Let&#8217;s sort of bring it back to WordCamps. You were very kind to write me a bunch of show notes, and they really drew me in as I was reading them. And I want to sort of dwell on a few of them because you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:26:53] <strong>Cathy Mitchell:</strong> Had to convince you to get me on the podcast.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:26:54] <strong>Nathan Wrigley:</strong> Yeah, no, there not a lot of convincing needed. I loved it. You&#8217;ve got some sort of bullet points if you like, not really bullet points. You&#8217;ve touched on different areas where you feel that you&#8217;ve got something to say about, I dont know, why people might contribute and why they might volunteer and what have you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So it&#8217;s things like, why might new people, newbies, as you&#8217;ve described them, volunteer and why might business folk volunteer?</p>\n\n\n\n<p class=\"wp-block-paragraph\">So the first one was, let me go back. So I&#8217;ll read into the record what you wrote because it makes a lot of sense. You said, in 2025 I helped the organisers for WordCamp Canada and this year found myself the lead organiser. And this has been consistently one of the nicest, most open groups, that I&#8217;ve ever been part of. And then you strayed into why other people, for example, new people and business people might like to contribute.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So on the business side, you said, volunteers, boundaries when not getting paid, giving back, sponsoring folks, not necessarily a financial return on investment. And then for the newbies, you said, there&#8217;s other ways to contribute, for example, contributing in code or non-coding ways, and also just being a recipient of the open, friendly community that you encounter. So that was really it. Maybe I&#8217;ve said everything that you wanted to say.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:28:07] <strong>Cathy Mitchell:</strong> Well, those are kind of questions that I had coming from a corporate, and I keep talking to different people trying to figure out, I guess I&#8217;m looking for something other than altruism when comes to the corporate people at least. Like why are they sponsoring? And I can see, the pessimistic, or maybe the pragmatic, side of me to be positive wants to know why. Why are they putting the dollars in?</p>\n\n\n\n<p class=\"wp-block-paragraph\">But then on the other side, I think, well, if WordPress doesn&#8217;t do well, then they don&#8217;t do well. Like, if their businesses are based on WordPress. But then I also saw something that, if you sponsor open source projects, it makes hiring people that much easier, and also vetting people that much easier. Because it gets you into the community and so it goes both ways. People will be more likely to apply for your jobs and you will be more likely to have a way to vet them. That&#8217;s one thing I saw.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:29:04] <strong>Nathan Wrigley:</strong> I think there&#8217;s a lot of truth in that, or at least I&#8217;d like to believe there&#8217;s a lot of truth in that. That makes me feel happy about the whole situation. But what&#8217;s curious about what you&#8217;ve just said, and I don&#8217;t know how much of an intuition you&#8217;ve got on this, but if you were to go back to, let&#8217;s say the year, oh, I don&#8217;t know, 2018 or something like that, WordPress was experiencing this really stratospheric growth. You know, in terms of market share of the internet broadly, you know, the number of websites as a percentage, WordPress was going from sort of the low twenties to the mid twenties, high twenties, and then through the thirties, and then finally landing at this sort of 40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And during that time, saying this phrase sounds ridiculous because it is ridiculous, WordPress could kind of do no wrong, I think. There was just growth upon growth upon growth and a lot of companies, I don&#8217;t think needed to explain themselves to their directors quite so much. The return on the investment didn&#8217;t need to be made. It was just, look, we&#8217;re part of this thing, and there&#8217;s this rising tide, and we are one of the boats. And look, we&#8217;re going up as it all goes up. So it just happened.</p>\n\n\n\n<p class=\"wp-block-paragraph\">However, during COVID, and then especially over the last few years, and then now especially the last couple of years, inject AI into the mix, I feel that that calculus has changed a little bit. And there&#8217;s this inkling when you speak to the same corporate people who a few years ago were willing to open their wallets to sponsor events, the wallets are much, much harder to open.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Again, in much the same way that I don&#8217;t really know why the community is so fabulous. I don&#8217;t really know why the wallets are harder to open. But I think the landscape for sponsorship, and the requirement of a return on investment, as opposed to, well let&#8217;s just join in because WordPress is growing. I think that calculation is going to be harder and harder to make. And maybe you&#8217;ve got experience of this over at WordCamp Canada trying to gather sponsors. Perhaps you found it straightforward. Perhaps it&#8217;s been difficult. I don&#8217;t really know.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:31:08] <strong>Cathy Mitchell:</strong> There&#8217;s almost like a perfect storm right now because wallets are tighter because over the last few years, at least in the States where my clients are, it&#8217;s become, economically there&#8217;s uncertainty. And so that trickles down and trickles up, right? And so more wallets are going to be a little bit more restrictive on what they&#8217;re going to buy, and they&#8217;re going to want to see more bang for their buck.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Corporately, also there&#8217;s been this huge rise in competition in the corporate world. There&#8217;s just way more competition over the last five or six years for just about anything when it comes to agencies or plugins or themes or whatever, there&#8217;s a lot more great competition, like good products out there. But then there&#8217;s also a lot more competition to get the clients, like clients have a lot more options.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And so I think it&#8217;s a perfect storm. Like, do you want to put your money into WordPress because is that the future? Is there money for sponsorship? Plus WordPress has become stricter on what they require to sponsor, as far as trademark use and different things that have been put higher on the priority list.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And I kind of see it like a levelling off. Like not as a bad thing because every industry can&#8217;t just, go, go, go, go. Like there&#8217;s going to be a levelling, right? Can&#8217;t be that easy. When I started, I didn&#8217;t even advertise. And I&#8217;ve had this business for 19 years. I&#8217;ve never advertised. That is going to go away. Like it was just, you know, I lucked out starting somewhere, but that&#8217;s not realistic.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:32:44] <strong>Nathan Wrigley:</strong> So what&#8217;s interesting in that is I think I am the same. The only period in which I&#8217;ve been in the WordPress community was during this stratospheric growth period really. Everything has been, you know, people have argued on the inside about this, that, and the other thing, and whether a feature should ship in Core, or whether or not we should do this thing at an event or what have you. So there&#8217;s been some minor disagreements.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But broadly speaking, the whole project has just swelled and swelled and swelled. There&#8217;s this overarching sense of optimism and growth, and now the brakes are on. And so for me, it feels like unfamiliar territory. And because it&#8217;s unfamiliar, it feels a little bit scary because I don&#8217;t know what that means. I don&#8217;t know whether that means that things are going to just level out as you just described, or whether it means things are going to decline, or whether it means some of my friends are going to go away because the community, it&#8217;s no longer going to be something that they wish to frequent because their profitability is under question and they need to seek revenue from other different options. Maybe AI, maybe, whatever it might be. And so I think my concern just, it&#8217;s probably self-interest really. I&#8217;m just concerned because I don&#8217;t know what&#8217;s coming and that fear is, well, it&#8217;s fear.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:33:57] <strong>Cathy Mitchell:</strong> I think this brings me perfectly into the WordCamp Canada thing that I wanted to mention. Just because I see this event, and even the community team, as a whole in WordPress. There are teams in WordPress, by the way, for people that don&#8217;t know, that help you get involved. It&#8217;s not just coders, like there&#8217;s all kinds of teams. And one of them is the community team, and all we have to know how to do is plan an event or host an event or serve coffee. It&#8217;s amazing. But anyway.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I am excited about WordCamp Canada, and the reason I&#8217;m putting so much time and effort into this conference is because I really see it as a light at the end of this tunnel. Not at the end. Maybe midway. I have no idea what&#8217;s going to happen to my own business, to WordPress, I don&#8217;t know. But I think there&#8217;s one thing that I&#8217;m fairly certain of, even now, even in the midst of AI, and that&#8217;s open source. I really still believe that open source is the way of the future. I still think it is, open source and AI are probably the way of the future. Yeah, I don&#8217;t know how else to say it.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And I think the exciting thing, and the thing that we need to do as people who got to take advantage of that uprise and that uptick, is you and I need to get young people involved. Like we need to get those young people involved in open source. I don&#8217;t even care if it&#8217;s WordPress or not, but they need to become part of a community that is exciting, that is beyond themselves. They need to see that we&#8217;re nice. We don&#8217;t bite. We&#8217;ll hire them. There&#8217;s just so much good that can come out of being together. And these are the nicest people. They&#8217;ll talk to people that are just standing around in the hallways with nobody to talk to, which is me. I&#8217;m an introvert, ironically.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:35:38] <strong>Nathan Wrigley:</strong> You definitely don&#8217;t come across like that, just so that you know.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:35:40] <strong>Cathy Mitchell:</strong> Well, we&#8217;re I&#8217;m pretending nobody else is listening.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:35:43] <strong>Nathan Wrigley:</strong> The other thing that I would add, as you were saying all of those things, it occurred to me that, I would imagine that people in more senior positions, I don&#8217;t really know how to describe it in the WordPress world, have got a similar intuition to the one that you just described. In that they can definitely see that the future needs to be thought about in terms of the youth coming in. Because there&#8217;s an awful lot of work being done at the moment and an awful lot of hours being put into educational initiatives.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And also, not just where you and I are living, but all over the world. And it was kind of interesting at WordCamp Asia recently, that was a big focus. A lot of people talking about exactly this thing and these kind of overlapping initiatives that are beginning to bear fruit. So people coming out of universities who&#8217;ve had experience of open source and WordPress in particular. And children at schools having experience of open source and WordPress.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And I think, as much as we would like open source and WordPress to win, just from a moral point of view, wouldn&#8217;t that be a great thing if everybody just noticed it and got on and used it? I think we need to do a bit of work to make sure that it&#8217;s being put under their noses so that they can make those judgements for themselves. And that is definitely a part of the future.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:36:57] <strong>Cathy Mitchell:</strong> Yeah, the Campus Connect and the Credits where they can university credits, like it is getting popular in other places we haven&#8217;t heard so much. But I really want to introduce it and bring it to the conference in Vancouver this fall. Because we can have universities in Canada and the US, on this side of the pond get involved in this and actually give kids credits that they can use to graduate.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:37:21] <strong>Nathan Wrigley:</strong> It&#8217;s so interesting as well because it&#8217;s very hard to, how to describe this, that&#8217;s a difficult one to sell, let&#8217;s put it that way. The people that are really into those initiatives really love it, but it&#8217;s hard to get people to notice that that&#8217;s going on, and hard for people perhaps to notice how important that is. But without those little foundational bricks being put in place for the future, this rising tide carries all boats metaphor, that&#8217;s not going to happen. You know, I think maybe another good metaphor there is they&#8217;re kind of building the harbour wall to make sure that the boats have got something to rise against. And I think that&#8217;s really important.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And your part of the world is definitely open to that, I&#8217;m sure. Seems to be that some European institutions, colleges, universities and South American institutions and parts in India and Southeast Asia and places like that are also beginning to bite on those ideas as well. So it&#8217;d be really interesting to see how that all goes.</p>\n\n\n\n<p class=\"wp-block-paragraph\">You&#8217;re painting a picture, Cathy, which makes me feel optimistic. Feels like there&#8217;s a lot of positivity coming out of where you are, yeah.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:38:24] <strong>Cathy Mitchell:</strong> I&#8217;m probably going to get in trouble for saying this, but for all of the faults that Matt might be accused of, somehow he put something in place that became very, very popular. And the culture that I have been a part of, I haven&#8217;t worked for Automattic, but the culture at the WordCamp level and volunteering and the community team has been unbelievably positive, and foreign to me. Like I&#8217;ve had to learn this culture. What do you mean there&#8217;s no application process? How do I say yes? What are you talking about? So somehow this has grown. And he has had a lot to do with it. People don&#8217;t like that he&#8217;s had a lot to do with it, but there&#8217;s some truth there.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:39:07] <strong>Nathan Wrigley:</strong> It&#8217;s really interesting and it doesn&#8217;t matter how many times I have conversations like this, I&#8217;m always confused by it. I can never get my hands around it and work out what the secret sauce is so that I could copy and paste it into a different locale or a different jurisdiction or different era. But there&#8217;s a there, there. There&#8217;s something very satisfying about this community. And from everything that you&#8217;ve said, it sounds like you are very positive about it. And I share your positivity, even though sometimes it seems quite hard to grasp in the more recent times.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Oh, Cathy, that&#8217;s been absolutely wonderful. I&#8217;ve enjoyed chatting to you today. We&#8217;ve hit the sort of sweet spot of the amount of time that we&#8217;ve got, so if it&#8217;s okay with you, we&#8217;ll wrap it up there. Just before we go, if anybody wants to get in touch with you, or just sort of wants to pat you on the back for your wisdom there, where would we find you?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:39:55] <strong>Cathy Mitchell:</strong> Well they can find me at WPBarista. And right now they can also find me at canada.wordcamp.org.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:40:02] <strong>Nathan Wrigley:</strong> Okay. Well I will make sure that that goes into the show notes. So if you&#8217;re listening to this, head to wptavern.com, search for the episode with Cathy Mitchell, that&#8217;s Cathy with a C, and you&#8217;ll be able to find the details in the show notes there. So Cathy Mitchell, thank you very much for chatting to me today. That was lovely. Thank you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:40:19] <strong>Cathy Mitchell:</strong> Thank you. I enjoyed it.</p>\n</div></details>\n\n\n\n<p class=\"wp-block-paragraph\">So on the podcast today we have Cathy Mitchell.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Cathy has been working with WordPress since 2007. What began as a fun personal project during her maternity leave soon evolved into a fully fledged business with the launch of WPBarista in 2008. Over the years, Cathy has garnered extensive experience in the WordPress space, and is now working towards the 2026 WordCamp Canada.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The conversation focuses on the powerful role of community within the WordPress ecosystem, something that Cathy is deeply passionate about. We discuss how open, welcoming, and international the WordPress community feels compared to more traditional corporate or volunteer environments. A theme that emerged was how involvement in WordPress has provided Cathy, and many others, with a sense of belonging and fulfillment, especially after life changes like becoming an &#8220;empty nester&#8221;.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The discussion explores the motivations for volunteering and organising within the WordPress community, both from the perspective of newcomers looking for purpose and connection, and business owners assessing the return on investment from contributing or sponsoring events. This included how easy it is to get involved, the unique lack of barriers and red tape, and the value of altruism and camaraderie.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Other topics we explored were the broader impact of technology and loneliness, the importance of service and community for well-being, challenges in sponsorship amid changing economic times, and the vital need to engage the next generation in open source.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you’re interested in the human side of WordPress, how volunteering shapes both individuals and the broader community, and what the future might hold for WordPress events and contributors, this episode is for you.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Useful links</h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://wpbarista.com\"> WPBarista</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://canada.wordcamp.org/2026/\">WordCamp Canada 2026</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://london.wordcamp.org/2019/\">WordCamp London</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://events.wordpress.org/campusconnect/\"> WordPress Campus Connect</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://wordpress.org/education/credits/\">WordPress Credits</a></p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 10 Jun 2026 14:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Nathan Wrigley\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:38;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:117:\"Open Channels FM: BackTalk on AI Burnout, Bridging Innovation and Standards, and the Risks of Single-Maintainer Tools\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555405\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:122:\"https://openchannels.fm/backtalk-on-ai-burnout-bridging-innovation-and-standards-and-the-risks-of-single-maintainer-tools/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:212:\"Conversations reveal insights on deep work, innovation standards, and the risks of underappreciated developer tools, highlighting challenges of mental fatigue, standardization, and reliance on single maintainers.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 10 Jun 2026 09:40:19 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:39;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:87:\"Open Channels FM: Rethinking Developer Life and Productivity with Rapid AI Advancements\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555214\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:94:\"https://openchannels.fm/rethinking-developer-life-and-productivity-with-rapid-ai-advancements/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:264:\"In this episode of Open Web Conversations, Zach Stepek and Carl Alexander discuss with Alex Standiford the impact of AI on developers, highlighting productivity, burnout, workflow changes, and the necessity of setting boundaries in this rapidly evolving landscape.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 09 Jun 2026 10:41:51 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:40;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:121:\"Gutenberg Times: Gutenberg Changelog #131 – Gutenberg Plugin Releases 23.1 – 23.3, Calls for Testing for 7.1 and more\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://gutenbergtimes.com/?post_type=podcast&p=45809\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:59:\"https://gutenbergtimes.com/podcast/gutenberg-changelog-131/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:60685:\"<p class=\"wp-block-paragraph\">In episode 131 of the Gutenberg Changelog, Birgit Pauli-Haack welcomes Isabel Brison to discuss the latest developments in Gutenberg plugin releases 23.1, 23.2, and 23.3, as well as progress leading up to WordPress 7.1. The hosts highlight recent calls for testing, including collaborative editing—previously delayed from 7.0 due to stability concerns—and the new media editor modal for the image block.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Isabel Brison shares insights into the new responsive global block styles, allowing users to customize styles per device breakpoint, as well as updates to the layout and dimensions controls in the block editor. She encourages feedback from users as these features iterate for the upcoming WordPress 7.1 release. The episode covers stabilizations, such as the improved, more ergonomic media editor and cropper, and strides in accessibility, particularly regarding the tabs block.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The hosts also discuss experiments in dashboard widgets, content type management, and empowering plugin developers with new admin UI components. Both stress the importance of community feedback and testing, given the ambitious new features arriving soon. The episode wraps with practical notes on documentation improvements, React 19 integration, and a reminder of the short summer break ahead.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://gutenbergtimes.com/podcast/gutenberg-changelog-131/#shownotes\">Show Notes</a> / <a href=\"https://gutenbergtimes.com/podcast/gutenberg-changelog-131/#transcript\">Transcript</a></p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Editor: <a href=\"https://www.linkedin.com/in/sandy-reed/\">Sandy Reed</a></li>\n\n\n\n<li>Logo: <a href=\"https://markuraine.com/\">Mark Uraine</a></li>\n\n\n\n<li>Production: <a href=\"https://icodeforapurpose.com\">Birgit Pauli-Haack</a></li>\n</ul>\n\n\n\n<p class=\"has-larger-font-size wp-block-paragraph\" id=\"shownotes\"><strong>Show Notes</strong></p>\n\n\n\n<h2 class=\"wp-block-heading\">Special guest: Isabel Brison</h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GitHub <a href=\"https://github.com/tellthemachines\">@tellthemachines</a></li>\n\n\n\n<li>WordPress <a href=\"https://profiles.wordpress.org/isabel_brison/\">@isabel_brison</a></li>\n\n\n\n<li>X (former Twitter) <a href=\"https://twitter.com/ijayessbe\">@ijayessbe</a></li>\n</ul>\n\n\n\n<h2 class=\"wp-block-heading\">Calls for Testing</h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https://make.wordpress.org/core/2026/06/03/announcing-a-collaborative-editing-outreach-effort-for-7-1/\">Announcing a collaborative editing outreach effort for 7.1</a></li>\n\n\n\n<li><a href=\"https://make.wordpress.org/core/2026/05/21/media-editor-modal-call-for-testing/\">Media Editor Modal: call for testing</a></li>\n\n\n\n<li><a href=\"https://make.wordpress.org/core/2026/06/04/call-for-testing-client-side-media-processing/\">Call for Testing: client-side media processing</a></li>\n</ul>\n\n\n\n<h2 class=\"wp-block-heading\">What&#8217;s released</h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https://wordpress.org/news/2026/05/wordpress-7-0-armstrong/\">WordPress 7.0 “Armstrong”</a></li>\n\n\n\n<li><a href=\"https://make.wordpress.org/core/2026/05/14/wordpress-7-0-field-guide/\">WordPress 7.0 Field Guide</a></li>\n\n\n\n<li><a href=\"https://gutenbergtimes.com/wordpress-7-0-source-of-truth/\">WordPress 7.0 Source of Truth</a></li>\n\n\n\n<li><a href=\"https://make.wordpress.org/core/2026/06/05/react-19-upgrade-temporarily-reverted-in-gutenberg/\">React 19 upgrade temporarily reverted in Gutenberg</a></li>\n</ul>\n\n\n\n<h3 class=\"wp-block-heading\">Gutenberg releases </h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https://make.wordpress.org/core/2026/05/07/whats-new-in-gutenberg-23-1-07-may/\">What’s new in Gutenberg 23.1? (07 May)</a></li>\n\n\n\n<li><a href=\"https://make.wordpress.org/core/2026/05/21/whats-new-in-gutenberg-23-2-21-may/\">What&#8217;s new in Gutenberg 23.2? (21 May)</a></li>\n\n\n\n<li><a href=\"https://make.wordpress.org/core/2026/06/03/whats-new-in-gutenberg-23-3-03-jun/\">What’s new in Gutenberg 23.3? (03 Jun)</a></li>\n</ul>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\">Stay in Touch</p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<ul class=\"wp-block-list\">\n<li>Did you like this episode? <a href=\"https://lovethepodcast.com/gutenbergchangelog\"><strong>Please write us a review </strong></a></li>\n\n\n\n<li>Ping us on X (formerly known as Twitter) or send DMs with questions. <a href=\"https://twitter.com/gutenbergtimes\">@gutenbergtimes </a>and <a href=\"https://twitter.com/bph\">@bph</a>.</li>\n\n\n\n<li><em>If you have questions or suggestions, or news you want us to include, send them to <a href=\"mailto:changelog@gutenbergtimes.com\">changelog@gutenbergtimes.com</a>. </em></li>\n\n\n\n<li><em>Please write us a review on iTunes! <a href=\"https://gutenbergtimes.com/itunes/\">(Click here to learn how)</a></em></li>\n</ul>\n</div></div>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\" id=\"transcript\"><strong>Transcript</strong></p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> So welcome to our 131st episode of the Gutenberg Changelog. We will talk about Gutenberg plugin releases 23.1, 23.2 and 23.3. There are calls for testing out for WordPress 7.1 and we have more. I&#8217;m your host, Birgit Pauli-Haack, curator at the Gutenberg Times and a full-time core contributor for the WordPress open source project sponsored by Automattic. Today, Isabel Brison joins me from Sydney again. Isabel is a longtime core contributor and JavaScript developer on the Gutenberg Project. Welcome back to the show, Isabel. Thank you for joining me. How are you?</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison</em>: I&#8217;ll be good. Thanks for having me. It&#8217;s always a pleasure to be here.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Birgit Pauli-Haack: Well, I&#8217;m so glad you&#8217;re here because you and your team have worked on some of the most exciting features that coming to Gutenberg. People have been waiting for quite a long time. So we will dive in when we get to the updates. How is Sydney?</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>It&#8217;s winter, cold, rainy, you know, the usual.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>The usual? Yeah. How is the technology? I know you&#8217;re going to meetups there. Are these WordPress meetups or are these other technology meetups?</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>I go to a variety of tech meetups. There&#8217;s not a huge amount, so I&#8217;ll go say to JavaScript meetup and there&#8217;s a good technology leaders one too. I enjoy going to the Python meetup even though I don&#8217;t work with Python. It&#8217;s just a lovely community and they have some interesting talks. So it&#8217;s sort of whatever&#8217;s on offer, I guess.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Oh, nice. Yeah, I found out in Munich to the technology community and I kind of connected with a local Claude meetup community and it was kind of interesting at the Technical university or the Design university, they switch around the places, but it was interesting. Yeah, they had some lightning talks. Yeah, like 20-minute talks and it was really cool. Yeah, I think we need to get out more.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Yeah, no, I like, I like going out after work and just, you know, even if it&#8217;s just to listen to some tech talks, you get a bit of air and meet new people.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Yeah, that&#8217;s good. Yeah. </p>\n\n\n\n<h3 class=\"wp-block-heading\">Announcements</h3>\n\n\n\n<p class=\"wp-block-paragraph\">All right, so we have a few announcements. WordPress 7.0 has been released two weeks ago and we are heading big steps towards 7.1. Beta 1 is scheduled for July 15th. That&#8217;s kind of a little bit of ahh. It&#8217;s only six weeks away.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>Yeah. So we get going not long time at all.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>And contributors have been working on the next major version already. So the official roadmap planning post is in the works. The team is in the final steps to assemble the release squad and we do well from the Gutenberg plugin releases we get a pretty good idea what might come through also from what didn&#8217;t make it into 7.0 as well. So we will. But it&#8217;s the web, right? Web is translated for me in the Japanese kind of design thing. Yeah, it&#8217;s like wabi sabi. Nothing is finished, nothing is last, and nothing is perfect. So we always get work to do and it&#8217;s always getting better. Yeah.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>Yep. It&#8217;s a work in progress.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>It&#8217;s a work in progress. </p>\n\n\n\n<h3 class=\"wp-block-heading\">Calls for Testing &#8211; WordPress 7.1</h3>\n\n\n\n<p class=\"wp-block-paragraph\">So there are two calls for testing out now. One is announcing the collaborative editing outreach effort for 7.1. Many of you dear listeners remember, okay, collaborative editing, real time collaborative editing was pulled from the 7.0 because it wasn&#8217;t stable enough for all the hosting environments that are out there. And there was this call for testing out for hosting and now there&#8217;s another one for outreach effort to make sure that everything is kind of caught for 7.1. </p>\n\n\n\n<p class=\"wp-block-paragraph\">And Anne McCarthy just published it on the Make Core blog so you can join it anytime. There&#8217;s a separate channel Collaborative Editing Outreach that you can. It&#8217;s kind of modeled after the full site editing outreach program that ran for two or three years. I hope this doesn&#8217;t run for two or three years before it&#8217;s released, but it definitely there are more people kind of discussing it and how it all supposed to work. Amy Kamala, who was the Release Coordinator for 7.0 and Justin Tadlock, who is a developer advocate at Automattic and Theme Team Rep are helping Anne to coordinate those calls for testing. And also some of the teams at Automattic who work with Enterprise level are also there. So yeah, it&#8217;s a bigger discussion on how collaborative editing works on all the levels.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>Yeah, it&#8217;s a pretty big and complex piece of work.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>Yeah, join the channel and dive right in if that&#8217;s a feature that you are excited about. I&#8217;m excited about it. But I also only have two or three people that handle my editing stuff. So I don&#8217;t have 10 or 15 editors in my post zone. </p>\n\n\n\n<p class=\"wp-block-paragraph\">Another call for testing is about the media editor Modal that has been added to the image block. Ramon Dodd published a call for testing about two weeks ago about the new modal for the image cropper. It&#8217;s kind of the bigger image cropping in the block editor, so you don&#8217;t have to. It&#8217;s a much easier way to get your images in line, but you can also rotate the images and resize them. And it has been merged with the Gutenberg plugin. It also, with 23.3, is out of experimentation. So anybody who has the Gutenberg plugin installed can be testers. And Ramon has some great details on how to test things and what to look for and how to share the feedback. It also has a little paragraph there on what&#8217;s out of scope. So for this version, we of course share all the links in the show. Notes. Isabel, you&#8217;re part of that project. What excites you about it?</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>I haven&#8217;t actually, actually worked on it. Well, not I, I, I helped a little, a little bit at the very beginning when we were discussing sort of choice of libraries and whether to build our own or use a third party. And a bit with the initial testing, but it was mostly Ramon and Andrew&#8217;s work. This latter part, the bit that&#8217;s now in Gutenberg, in fact, it was all their work. And I think it&#8217;s super exciting because replacing the old, the old Cropper, I. I never liked it. I have to be perfectly honest.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>I hate the old Cropper.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>I never could figure out how to use it. It was not ergonomic at all. And this one is such a better experience. Aside from allowing us to do all the stuff that the old Cropper, the in Editor Cropper is what I&#8217;m talking about. The one that you can access from the Image block toolbar. It&#8217;s also on the site Logo block. So you can now access it from both those blocks and the new one, in addition to what the old one did, also allows you to do free cropping and free rotating. So if you want to rotate your image 3 degrees and if you want to crop it to whatever weird aspect ratio you like, you can do that, which you couldn&#8217;t on the old one. Yeah, and it&#8217;s. It&#8217;s just a much nicer experience. I believe it&#8217;s also more accessible than the old one in terms of the keyboard accessibility of it. It&#8217;s. It&#8217;s better too, so. All advantages. Yeah, they did a great job on it.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>I used it just for a little bit and I was so amazed how smooth it was. Yeah, I kind of. It was also much more intuitive. I never knew what to do with the Cropper when I was pinging it previously and said, so how do I do this now? Every. I had to think every time. And this one is very, very intuitive and very smooth also to use it and to see it. So I&#8217;m really happy about that. I&#8217;m hoping it makes it into 7.1. Yeah, so we have that.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>Yeah, it&#8217;s, it&#8217;s on track, I don&#8217;t think. I mean, barring any major natural disaster, I don&#8217;t think that there&#8217;s any reason for that not to make 7.1. It&#8217;s a great piece of work. It&#8217;s really stable and now that it&#8217;s not behind the experiment flag anymore, real users are using it. I&#8217;m sure we&#8217;re going to get tons of feedback if there&#8217;s anything that&#8217;s not 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} perfect and we still have time to iterate on it until beta one.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>I really appreciate that Roman and Andrew went to the research portion and kind of looked at how other graphic programs actually are doing things and tried to get some of the experiences also into the blocked. So okay, yeah, so two calls for testing for those who want to dive in. It&#8217;s a very good way to contribute to WordPress because it&#8217;s so close to what you&#8217;re doing with WordPress. And not only developers but also content creators can help testers even better and those who work at agencies or work with clients at agencies to kind of see how that all works. Which brings us to what&#8217;s released. I mentioned it. </p>\n\n\n\n<h3 class=\"wp-block-heading\">What’s Released &#8211; WordPress 7.0</h3>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress 7.0 Armstrong was released. We talked about it in previous episodes on this changelog with various people from the agency view, from the designer view, from the content creators views. We will share in the show notes in case you need to catch up. The Field Guide the link to the official field guide for WordPress 7.0 as well as to the source of truth on Gutenberg Times that has all the user facing stuff in there. Those are the best information on 7.0. I have not seen in the last two weeks any major boo boos that came in. Yeah, it was such a great testing cycle with a delay of six weeks. </p>\n\n\n\n<p class=\"wp-block-paragraph\">Most of the bugs were actually caught quite early or in the loliso, I don&#8217;t think. I&#8217;m not sure when there will be a point release which normally happens within a few weeks of the major release, but I have not seen any planning for that. But it could be end of June after WorldCap Europe. </p>\n\n\n\n<p class=\"wp-block-paragraph\">So let&#8217;s dive into the Gutenberg releases. We start with Gutenberg 23.1. Oh, one question, Isabel, do you have a favorite feature that came into WordPress 7.0?</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>Oh, I don&#8217;t know. There&#8217;s a bunch of interesting features and I worked on some of them. Of course I have sort of my personal favorites of the ones that I worked on of which one that is. It was very, very subtle or sort of low profile. We didn&#8217;t talk about it much, but I worked on a little handy addition to the grid block or the grid layout type, I should say. That allows us to configure a responsive number of columns. So by setting column count and a minimum width you can say I want my block to always have at maximum three columns but on smaller screens it can go down to two and even one. So that&#8217;s something we didn&#8217;t have before and I&#8217;m quite happy with it. I think it&#8217;s a good improvement. But compared to. Oh, there was. There was loads of stuff. The pattern editing work I think is going to be really handy. And what else? There was the notes feature.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> No, I was in 6.9 already. Yeah.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Oh yeah. No, there was something about what? Oh God, I&#8217;m confusing my releases.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Yeah, yeah, they&#8217;re kind of. They melt together once it&#8217;s released. They melt all together. It&#8217;s kind of. Yeah. Was it there or there? Yeah, sometimes. </p>\n\n\n\n<h3 class=\"wp-block-heading\">Gutenberg 23.1</h3>\n\n\n\n<p class=\"wp-block-paragraph\">All right, let&#8217;s dive into Gutenberg 23.1. It was released on May 7, had 212 closed PRs by 49 contributors. So we are really wrapping up the releases or the work on Gutenberg and the block editor. It&#8217;s now not only the block editor, it&#8217;s also the site editor. It&#8217;s the data views, it&#8217;s the. The design system, those all. So the Gutenberg repo has kind of exploded in other areas for the WordPress ecosystem. So. But yeah, the first one on the list and it&#8217;s. It&#8217;s really interesting how these change logs are actually automated and coming together is the upload media and it enabling concurrent sideload uploads. That&#8217;s an interesting thing because it&#8217;s so performance issue to have multiple streams on upload on images so you don&#8217;t have to wait so long that the image shows up in your block canvas. And that&#8217;s a really good improvement for that.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>Yeah, yeah. I&#8217;d imagine when uploading, when bulk uploading particularly.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>So when you copy paste content from another source it has this also a feature that you can download and upload the images that you connect there. And that also happens in this module stream uploads thing. So it&#8217;s really cool. You only know this because it&#8217;s faster but other than that there&#8217;s no disruption of your work or any of that.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>Yeah, there&#8217;s a lot of good work. This was also the client side. This is part, I believe, of the client side media processing work that did not make 7.0 but is now being aimed at 7.1. That&#8217;s mostly Adam Silverstein&#8217;s been working on that. I haven&#8217;t kept a close eye on it, but it looks like, you know, very useful work and it&#8217;ll be good once we manage to get it in for performance.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>Yeah, Adam Silverstein has worked on these image handling features quite a bit for 6.9 as well. </p>\n\n\n\n<h3 class=\"wp-block-heading\">Enhancements</h3>\n\n\n\n<p class=\"wp-block-paragraph\">So yeah, there is an enhancement that I have flagged here, but I&#8217;m not sure how useful that is. It&#8217;s for the WordPress UI overlays and a global preview styles on the storybook. So the WordPress UI is the next level of components for WordPress.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>It&#8217;s sort of the successor of the components package.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>Yeah. And at the moment both are used, but I have seen now efforts to migrate, merge things, I don&#8217;t know how you call it, but to get it kind of in one thing. But the overlays, the preview styles is how you can show the preview in the storybook so you have a better inkling how it&#8217;s going to look later on.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>Yeah, that should be good.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>And then there are tons of changes for the components, the admin ui, the UI components, dialogues. This is mostly for developers that are working with WordPress and creating their own either building WordPress or creating plugins for WordPress to have a unified design system, unified component system that they don&#8217;t have to kind of come up with their own interfaces. Those decisions are already made and you can kind of build on top of things before any of that, even the components, every plugin had to design their own interfaces and now this is really cool.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>Yeah, it&#8217;s good to have a sort of a system that you can use when you&#8217;re extending and you need to build a new screen or something for your plugin, you can just use these components and everything looks integrated with WordPress.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>And it&#8217;s also good for the users because they don&#8217;t have to think about how do I use this tool now? Or how, how is. How do I filter now on this screen? Because it&#8217;s all a unified system and it&#8217;s all built out and stable. So the next thing is on the notes getting a few updates. So right now it&#8217;s in 23.1. It&#8217;s mostly refactors on the positions and the floating board. But we will see later in, in the other releases that there are some nice features coming in for the Blocked libraries. We have updates to the tabs block. I&#8217;m really hoping that it comes into 7.1. It&#8217;s still behind an experiment flag, but now it can handle duplicate tabs, meaning duplicate handles on the tabs. And it follows now WCAG tabs pattern for accessibility in the renaming of the blocks. So which is a. It&#8217;s a major step towards accessibility and acceptance for that. I&#8217;m really waiting for the tabs to come into Gutenberg or to.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>Mostly I think the renaming was about as I understand it, so that the blocks have names that match the accessibility standards or how these things are known as. There&#8217;s a WCAG pattern it&#8217;s linked to in the PR, and those sort of example patterns that the WCAG website has for people to know how to use ARIA attributes correctly, which is a whole science. And the idea is to have our tabs blocks match the names of that pattern so that it feels more standard and it&#8217;ll be more familiar to people who might have implemented tabs in other places.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>Yeah. And those are the standards also where screen readers kind of tap into and people are. That use screen readers kind of have a common pattern for that. Yes. So that definitely elevates the tabs block in its accessibility. Yeah.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>So it&#8217;s going to be pretty useful block once it&#8217;s stabilized. So I hope it is.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>Yeah. Yeah. I know that quite a few block collections have tabs right from the beginning in the last eight years. And they&#8217;re not going to go away because the first iteration of any of the core blocks will not be as feature rich as any of the block collections that have been developed for the last six or seven years. Yeah. The next one is tapping into the image cropper we talked about. So you can. And it was tapping into the keyboard actions with drag handles on the canvas. So you can use your mouse to do some of the actions that you want to do with the image cropper or the image tool. Yeah, if you say Image Cropper, it kind of reduces it to cropping, but yeah, it&#8217;s also the handling to rotate</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>And all that too.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>Yeah, yeah. There&#8217;s a new API for the WordPress grid package, but that&#8217;s a different grid that you are working on.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>Yeah, that&#8217;s not the layout. The block layout grid. This is something else. This is a grid that you can use for dashboard UI.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Exactly.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Sort of admin stuff.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Yeah. That&#8217;s the new API that powers the new experiments that in Gutenberg. That is the dashboard widgets. We kind of talked about it a little later. You as a plugin developer or extender of WordPress, you can use them now as well for any of your dashboards. If you are having a plugin that has some data vising kind of, you can put them into these grid package and display them on your plugin settings pages. The guidelines is also a new API and it has now a public API method and the REST API route to it. There have been iterations after 23.1, so I think that that would be really helpful to look at later. </p>\n\n\n\n<h3 class=\"wp-block-heading\">New APIs</h3>\n\n\n\n<p class=\"wp-block-paragraph\">The guidelines are actually a whole set of content types that are for AIs. Pretty much when your agents come to the WordPress site, you can tell them what to do with things. What&#8217;s the purpose of the site? The editing guidelines? Yeah, how, how you want AIs to behave on your site if you let them in. And it&#8217;s really important when you have other agents come in that you don&#8217;t control. Yeah, that sounds scary. </p>\n\n\n\n<p class=\"wp-block-paragraph\">But if you as a site owner connect your Claude to your website, you can have in the guidelines all the things that you want Claude to know about your site. So it&#8217;s. You don&#8217;t have to put it all in a prompt and it kind of finds all the things and it&#8217;s also your memory. So if you use an agent to do your SEO, to do your. Some of the content updates like headlines or tags, your policies on how to do tags and categories, that&#8217;s all things that you can solidify in your documentation in the guidelines for your AI. And it will remember that. But it&#8217;s also interesting to see the discussions about it. I had a short discussion with Grzegorz, who was a former co-host here on the Changelog, a few, I would say a few hundred episodes before, but it wasn&#8217;t that much. But he is now part of that team who thinks about AI and memory and all that. And it was really interesting to hear because if you are in an agency, you work on multiple different sites, but you have one Claude, so you don&#8217;t want things to bleed over from one site to the next. And these guidelines help you kind of keep track of everything. So it&#8217;s an interesting problem space that came out with AI.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> It&#8217;s like providing the correct context and the correct amount of context so that the AI can be maximally productive on your website, whatever you want to do with it.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Yeah, right. Yeah, yeah. Most people are really not all that into. Site owners are not so into AI, but it helps a few things quite nicely. I find it with SEO and with yeah, accessibility and all that. It&#8217;s really helpful to have a double check there. Yeah. All right, what&#8217;s next in 23.1? Do we have something? </p>\n\n\n\n<h3 class=\"wp-block-heading\">Experiments</h3>\n\n\n\n<p class=\"wp-block-paragraph\">Oh yeah, there&#8217;s these custom taxonomies experiment in 23.1 with the custom post types and taxonomy management that started out as out of. I don&#8217;t know how that came about, but it probably is one of the radical speed month project as well that people say okay, we probably need to have content management when the APIs were in WordPress in 3.1. But there is no interface there and there were always plugins there to do this, be it custom UI, custom post UI or ACF or so. But there&#8217;s no interface for. And that&#8217;s where this experiment comes in to kind of push the envelope on that a bit. Have the REST controllers in there, have the interface in there. But it definitely is not the last word spoken there yet because that is a field where there have been a lot of extensions in the universe or in the WordPress ecosystem that might not fit in where this is going. So it&#8217;s just a. It&#8217;s a prototype kind of experimental way to do that. But check it out. You just have to enable the experiment in the Gutenberg plugin and then you can kind of try it out and work with it. It uses the common APIs. </p>\n\n\n\n<p class=\"wp-block-paragraph\">The other experiment is the dashboard. We talked a little bit about it because that&#8217;s the grid package was created for that. The dashboard to have administ page routes and sidebar menus as a shell to add additional grids on the dashboard. I&#8217;m interested to see. I haven&#8217;t played with it yet but I want to see if I can. So what are the dashboards? The dashboard right now is just a. The quick edit and the site health and the news that&#8217;s on your dashboard right now and a few other things and plugin kind of tap into that as well. But I have never have not seen yet and I&#8217;m still thinking about it to. Maybe Claude can help me with that. Having a quick edit that&#8217;s a block editor actually. So when you log in into your WordPress site you don&#8217;t want to kind of just do all the other admin stuff. You just want to create a new post. So why not have it on the dashboard and create a blog post right there from the quick edit. Quick Edit only gives you text based things but not block editor.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> So a block based quick edit, do you reckon all the blocks. I reckon it would need to be A very simplified version of the block editor.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Yeah. Yeah.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Maybe images, paragraphs, but yeah, that would be cool.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack</em>: Yeah, yeah. Lists. Yeah. Like an outliner kind of. Yeah. Very fast kind of. Yeah. Maybe come back to the white space, but kind of instead of having a classic editor, just build blocks with it. Yeah. So kind of a distraction free, quick edit, full set, toolbar on top kind of thing. I don&#8217;t know. When I&#8217;m bored, I&#8217;m gonna star B. Prototype it. Prototype it. Yeah. And get it in. Yeah. That. That was one of the things that a lot of writers said. I don&#8217;t want to deal with all the stuff I&#8217;m getting so distracted. Yeah. There&#8217;s announcements and all that. So let me just start my blog post. But anyway, and then there is a list of Media editor modal call for testing. We talked about it. There&#8217;s a whole in 23.1. There&#8217;s a whole list of bigger and smaller PRs that went in. I think the call for testing gives you all the ins and outs of it that I think was. Was it. Did you find anything for 23.1 that you wanted to talk about further?</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Not. Not really. Apart from the things that you&#8217;ve already highlighted. I just thought. I already mentioned that the media editor is also on the site logo block. So you can test it on both blocks and that&#8217;s it.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Gutenberg 23.2</h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> So right into Gutenberg. 23.2 was released on May 21st and also with 204 PRs by 50 contributors and there were four first timers there. Congratulations. You got your first contribution to WordPress core. Yeah. And you got your badge. Well, you got your badge when 7.1 is released, I guess the first feature that is listed is the responsive global block styles with states. This is so cool. Yeah. What does it say? Can you walk us through it?</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Yeah. So this was the first part of the work towards enabling responsive styles for blocks. And it&#8217;s with States because it leverages a style states API that was already built. So Maggie Cabrera was who did that initial work for the States API, and her part was just leveraging it for adding the ability to style pseudo states for very few blocks have pseudo states. Well, this might be extended, but it won&#8217;t be super extended because not all blocks need to have pseudo by pseudo states, I mean hover focus and things like that. So usually only interactive blocks would need those. </p>\n\n\n\n<p class=\"wp-block-paragraph\">And so States came about to cater to that pseudo element scenario. But it was always something that could potentially be extended further. And one of the use cases that had been thought out when this initial idea of having the states API was thought it was using it to be able to create responsive styles for blocks was one of the possibilities there. And I had been eyeballing all those issues that have been sitting in the Gutenberg repo for years about creating some mechanism that allows us to define responsive styles. And I finally had the opportunity to pick them up. And having that state&#8217;s work already partially done was great because, you know, sometimes it&#8217;s starting something is the hard part. And there were endless decisions in the repo about how should we build this and let&#8217;s do this and let&#8217;s do that and let&#8217;s not do that. And it&#8217;s like we should take this into account. You know, how you can talk and talk and talk and then it never actually starts because it seems like the problem is too big and too complicated. And the more that&#8217;s added to the discussion, the bigger and the more complicated it gets. </p>\n\n\n\n<p class=\"wp-block-paragraph\">But there was this little stepping stone. This states API had already been built. And so I thought, well, it&#8217;s already in there for pseudo states, let&#8217;s try building responsive. So we call them viewport states. I&#8217;ve been working on this with my teammate Dan Richards. We&#8217;ve both started working on this and thought, okay, let&#8217;s do as sort of a baseline for global styles, but then as a stretch goal, let&#8217;s try and do it for actual block instance too. So we managed to do both in the end, but for 23.2, it was only the global block styles that was ready. And this means when you go into the site editor and into the style section, where you have global styles, then you go into blocks. This only works for blocks. It doesn&#8217;t work for top level global styles yet. We&#8217;re not quite sure. Well, we&#8217;re not quite sure if there&#8217;s a need to add this to top level stars yet. It&#8217;s still something that&#8217;s being thought about because for a lot of them, so a lot of really sort of global basic elements like typography, you know, font sizes. Okay, we already have ways of defining them responsively even without using breakpoints. So we are using the clamp function. You can define a maximum and a minimum and you can pretty much, you know, manipulate it so that you get your different font sizes on mobile and tablet and desktop. So there is to some extent you already have that responsive functionality there. So that&#8217;s something that might be looked at later on for enabling actual breakpoints for those global styles. But for now it only applies to blocks so for each block you can go into the block, into the block&#8217;s global styles and you can pick a state. There&#8217;s a new little states drop down at the top and so by default you&#8217;ll be styling the default state that&#8217;s you know, no media query. And then you have a tablet and a mobile state and the tablet state is only, so it&#8217;s, it&#8217;s only from you know, the top level. Like what&#8217;s your maximum Breakpoint to the minimum, which is the maximum for mobile. So the tablet styles will only apply to tablet to that breakpoint and then the mobile styles will only apply to their own breakpoint. And that&#8217;s. Yeah, essentially that&#8217;s it. </p>\n\n\n\n<p class=\"wp-block-paragraph\">You can do anything color typography and spacing wise. So for most blocks you know, you have the typography, you have the colors, you have dimensions like not for most blocks you don&#8217;t have dimensions, you have, you know, margin, padding, block gap if the block has layout and you can define per break point what you want those values to be. And there are certain features that exist in global styles that do not yet work with, with that responsive logic and those. So when you enter that breakpoint you know, you get, you choose the tablet viewport and you&#8217;ll see that some of the tools might be hidden. So for instance, Duotone is one. You can&#8217;t set Duotone per breakpoint yet. This is something that will be worked on in the future but it feels like a bit like I&#8217;m not sure how many people will need to change the colors per break point. That&#8217;s not usually responsive styles are more about spacing dimensions, that sort of thing. So we focused more on those that felt like these are the ones that are really going to be used by most people and the more edge Casey ones if they don&#8217;t work out of the box, we sort of. Okay that, you know, that&#8217;s a problem for later. We&#8217;ll, we&#8217;ll figure it out later. And Duotone is one of those awesome.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>Yeah. Well a lot of people have been waiting for that a long time. So glad you, you finally started taking it.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> I hope it&#8217;s useful. I just hope that folks can take this and like ok, okay, I can finally build the thing and yeah, and it works. And please, please, to anyone listening and wanting to try this out, if there&#8217;s anything that&#8217;s not working, if there&#8217;s anything you don&#8217;t like or you think, no, no, this should be different because it doesn&#8217;t work. Just please give us feedback. We need feedback because this is in the plugin now it&#8217;s aimed to go into 7.1. We still have those six weeks until beta one. Those six weeks will be iterating on the feature. The earlier we get feedback the better so that we know if there&#8217;s anything that really isn&#8217;t working for anyone then we can change it.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Birgit Pauli-Haack: Yeah. Yeah. Awesome. So that&#8217;s a 23.2. There&#8217;s also a WordPress components called WordPress Theme and that&#8217;s actually the theme for the admin section. We have definitely confusion things going on because we use the same term for multiple things that are totally different and have nothing to do with each other except they are now motion design tokens for duration and easing in the WordPress theme component. So if you want to use those for your admin pages and plugins, go have at it. I am really because it kind of gets you a little bit more into a more interactive way to build websites and I think we really like those or I do. Yeah. Although I&#8217;m not a motion or animation kind of person. But yeah, I like when it&#8217;s nice.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Yeah. Little bits of discreet smooth animation here and there can really make a web experience.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Yeah. It&#8217;s kind of a quality of life kind of thing. Yeah. Yeah. What else is in the 23? Yeah, the content types. It was an iteration on. We talked about it on the content types experiments with various improvements and post type and taxonomy management, duplicate view, quick edit actions. A ton of PRs have been added to that so it definitely is maturing and you can with 23.2 also the media editor modal had matured and there is now. I also will share in  the show notes a link to an overview issue on the Dashboard experiment so you can go back and read up about it, what it&#8217;s all about. Because there&#8217;s a whole lot of work still being done with that. </p>\n\n\n\n<h3 class=\"wp-block-heading\">Experiments</h3>\n\n\n\n<p class=\"wp-block-paragraph\">There&#8217;s also an experiment on the classic block migration notice. I&#8217;m just pointing that out because you might see it that the classic block might get deprecated or might not be available in certain situations.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Yeah. I believe the plan is to deprecate it and remove it at some point, but it&#8217;s a whole process because I guess lots of folks are using it. So it needs to be slow, give people time to adjust, choose alternatives.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Yeah, well it has been in Gutenberg for eight years and all that and actually what I found is that some of the AI tools actually create blocks that need to be. That are looking like classic blocks and need to be migrated to blocks before they can be in the block editor canvas. So, yeah, those things also need to be kind of tested in that space.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>Yeah, that&#8217;s a good point. With AI, with AI tools increasingly being used to build websites and create and. Or move content across from other places, it. You don&#8217;t want AI sort of adding the classic block to its knowledge base and suddenly deciding that the easiest way to do anything is to just dump all the content into a classic block,</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Which what they&#8217;re doing right now. Yeah.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> So this is a good time to deprecate it so that. Okay, let&#8217;s. Let&#8217;s ensure that AI works properly, that it&#8217;s easier for AI tools to work properly and do things as we expect them to.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Documentation</h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> It hasn&#8217;t been merged yet, but there is also a documentation issue. It&#8217;s a big. It was a big undertaking that Juan Margarito took on, was that it was found that an AI can&#8217;t really find documentation on the block markup for each of the core blocks. And that was a documentation gap that was kind of found that none of the block library blocks had a readme so it wouldn&#8217;t. So what Guan Ma did, he created automatically from the block JSON files a readme for each block on documentation site and then created some tokens where you can have on the readme additional manual content that&#8217;s put in there and then have a parser go through that and put it into the block editor handbook. And that is a really. So it talks about the supports, it talks about the, the, the global styles design tool supports about the block markup and also the connection with other blocks. It&#8217;s a comprehensive documentation about each block and that&#8217;s in the block handbook. It will be merged. We had a hardware hangout on it. We had a proposal on MakeBlog, a core block about that. And I think it&#8217;s finally going to be merged within I hope a week, but maybe days.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Oh, cool.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>That&#8217;ll be super useful. So it will be in the, in the block edit handbook. It has an additional 80 pages, of course. Yeah. But they&#8217;re all connected and categorized by blocks. And so now block developers and there were some comments from the community where people said, well, I wish I had that when I was starting out learning about block development and now it&#8217;s finally coming. But it was a huge undertaking because it kind of created a ton of new code and that all needs to be reviewed. And it was so. But there were a lot of people kind of working on that. Guided or spearheaded by Guan Ma but it&#8217;s now coming and it&#8217;s really cool. I&#8217;m so happy that it made it.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> I mean, you can never have too much documentation, but developers are crap at writing it. So, you know, nowadays we have tools to assist us in the creation of the documentation and we should leverage them.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>Yeah. And the hybrid version, automatic documentation plus a way to have also manual content in that is actually a good combination because for some of the blocks, Joe Dawson from the Accessibility team has said, okay, maybe we also want to have some documentation about the accessibility of blocks. And anybody who has comments on that can add it to the, the readme file of that particular block to elaborate on that. And that is outside of any automation. You can just add it to the page. And it was really cool to see that process working. I post a link to the proposal into the show notes just as a side note here. </p>\n\n\n\n<h3 class=\"wp-block-heading\">Gutenberg 23.3</h3>\n\n\n\n<p class=\"wp-block-paragraph\">And now we&#8217;re coming to 23.3. That was just released a day ago June 3rd with 270 closed PRs and 57 contributors. So we are ramping up to 7.1 kind of thing. And the first item on that is really cool that you can now that the notes section. And I think it was Adam Silverstein as well who worked on that.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Oh yeah, the multiple notes per block. Yeah. Oh, that&#8217;s cool. That&#8217;s really useful.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Yeah, so you can have multiple threads or comments per block. That&#8217;s also helpful when you work with AI that comes in and kind of reviews some of your post and posts notes in there. So yeah, it was really helpful. And it&#8217;s also. And he found it to be necessary to have that. So what&#8217;s missing in the notes in comparison to Google Docs is that you can highlight a section and then comment on that section. So yeah, like, okay, you probably can delete this half sentence or something like that. And that you couldn&#8217;t do that up until now. And with the multi threads on the notes for a block you can highlight a section because if the paragraph is, I don&#8217;t know, 10 lines or something like that, you might have multiple comments on the, on that block. And now you can have that. So it&#8217;s really cool.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Yeah. So the note is attached to a part of a block and not to the block itself.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Yeah, yeah. The next sections are a continuation on your quest for responsive styles.</p>\n\n\n\n<h3 class=\"wp-block-heading\">Enhancements</h3>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Yeah, that&#8217;s part two, part two of the work which is enabling responsive styles for block instances. So again this, this was a part. So Maggie Cabrera had worked on the sudo style states for global styles and she had an open PR to add them to block instances. And Dan and I basically hijacked her PR with her approval of course. We asked Maggie first, can we just take this work that you. She was off doing something else. She wasn&#8217;t actively working on the PR at the time. We thought ah, we could just take that over and finish it and then build the responsive styles on top of it. So we did and that obviously there was work already pre-existing so it sort of made it easier to build it step by step on top of it. And now we have in 23.3 the ability to add responsive styles to. So any block, open a post, pick a block, open the inspector controls and then at the top where you have the block name you have this little menu which has a drop down that has the states. </p>\n\n\n\n<p class=\"wp-block-paragraph\">So again just like with global styles we have tablet and mobile. The default is what you get by default what you already had. And then you have a tablet breakpoint and a mobile breakpoint. And for those again as in global styles there were a few things that didn&#8217;t really work out of the box, a few of the controls. So we decided to hide everything that doesn&#8217;t work. So for now what&#8217;s enabled is only the controls that you can actually create responsive styles with. Those are pretty much all the block supports, the standard block supports like color typography, dimensions, block gap. Now layout is also supported and we aside a sort of side effect of that was that we ended up moving the layout panel into the styles tab. And well that was sort of. I&#8217;d been wanting to do that for ages I have to say because to me it didn&#8217;t make any sense at all that layout was in at the same time. Settings tab and Dimensions, which has controls that are intimately related to layout such as block gap was in the styles tab. And so I felt the. The only thing that makes sense is to have them side by side. If it&#8217;s not the same panel, which I still think we could maybe make it the same panel. But that&#8217;s another different conversation. But at least they&#8217;re side by side. So now layout is in the styles panel. That&#8217;s the reason why it&#8217;s in the styles panel. So when we have a responsive state enabled we&#8217;re only showing the styles panel in the inspector and only the controls that work, which is most of them. There&#8217;s a couple of things that we had to hide again, you know, duotonethings like that. </p>\n\n\n\n<p class=\"wp-block-paragraph\">And for block instances there are some blocks have custom controls and some of those custom controls should probably become Block supports. Some are like aspect ratio is a block support, but there&#8217;s only one block using it and there&#8217;s a couple of blocks that have their own custom implementation of aspect ratio. This is something that should change. I have an open PR to try and enable aspect ratio to work responsively because I feel that that&#8217;s one of the important ones that people will want to change aspect ratios for different breakpoints. So that&#8217;s in progress and what our plan is basically to try to get as much as we can working until 7.1.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>Awesome. So when I want to start testing this, I&#8217;m going to add a paragraph to my block canvas and then I go to the block inspector and say, okay, this paragraph, I want a different background for a different viewport. So on the mobile I want it green and on tablet I want it yellow and on desktop I want it gray.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Yep, you can do that.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>Okay. Yeah, so that&#8217;s how I will change it.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> You go into. So you give the default. The desktop is the default. I guess we&#8217;re not mobile. We were never mobile first really. I mean Gutenberg has from the beginning being a dev stop first experience. And that&#8217;s how it&#8217;s sort of turned out to be. So you have default desktop and then you can go into the tablet state, you can select the tablet state and then whatever you add to the visible controls in the block inspector in that state is exclusive to that state. And you can go into the mobile and choose a different color for that and save everything and then you can go and do the good old resizing. Well, in the block editor we leveraging the responsive preview, the sort of device specific preview to show you a preview of what the styles are as you&#8217;re editing them. And then once you go into the front end, you can resize your window to your heart&#8217;s content and see all the changes happening.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> All right, all right. So that is really cool and I&#8217;m looking forward to kind of testing it out and trying it out and have opinions.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Yeah, yeah, no, lots of opinions, I&#8217;m sure. And one of the things that I feel like we haven&#8217;t got 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} right is the previewing because you switch like you go enable mobile state for this block and it switches you to the mobile preview. But then you can select another block while still being in the mobile preview and then you&#8217;re not in the mobile state for that blocking. So I feel like this is something that we&#8217;re working on. We need to improve that experience and feedback. Again, very welcome. What are your opinions on this and how you think it would be the most intuitive to work with.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Well, awesome. Yeah. I&#8217;m thinking maybe we should actually have a demo hallway hangout about that somewhere. Let me think about that. Well, I have a time issue because I&#8217;m going on vacation.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Okay. Yeah.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Coming back to the beginning of July, but yeah, definitely. Maybe find somebody to do a demo video or something like that. Well, the demos are all on the PR, so definitely check those out because they&#8217;re the best way to learn how to use that and how what works or what doesn&#8217;t work. Yeah. All right. What&#8217;s else in 23.3?</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> There was so much. Well, the media editor was stabilized, so now it&#8217;s no longer an experiment. You get it by default whether you want it or not. Again, I mean, we hope to get feedback on that. I think it&#8217;s a pretty good piece of work, honestly.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Yeah, it is. Yeah. Yeah, absolutely. Yeah. Just wanted to. You said it in the. You talked about it. But if you are looking for the layout panel after 23.3 Gutenberg plugin install, it&#8217;s not hidden, it&#8217;s not lost. It&#8217;s in the Styles tab now.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Yes.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Some content creators that are not interested in this, all that, they might have a little oops, where is it? Kind of thing. It&#8217;s in the other tab now. Yeah.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> And that is. It might be weird for blocks that still have a Settings panel. So, for blocks, what happened with the group block? For instance, the group block only had layout and position in Settings, so we moved position into styles. Because it makes sense. Position is a style. And now the group block doesn&#8217;t have a Settings tab. So you open the group. I think it&#8217;s much easier because you don&#8217;t have clicking, clicking, clicking. Everything&#8217;s there, everything&#8217;s visible. Layout, position, all the other controls in the same tab for other blocks. For instance, the navigation block still has a bunch of stuff in Settings. So if you put a navigation block on the page and suddenly you&#8217;re, oh, where&#8217;s the layout controls gone? Okay, they&#8217;re in the Styles tab. They&#8217;re no longer in the Settings tab.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> I just wanted to point that out. People kind of miss that part because they&#8217;re so excited about the responsiveness. </p>\n\n\n\n<p class=\"wp-block-paragraph\">And then there&#8217;s also. Oh, there was one thing that was fixed. It was a. I would say it was a bug, but it is an enhancement that the additional CSS. If there was an error in there, you wouldn&#8217;t see that when you get back into the post again, until you interact with the additional CSS field, you wouldn&#8217;t see the error message. So unless you interact with that, you wouldn&#8217;t see that it&#8217;s actually not working. That has changed. That now has a little notification that there is something in the additional CSS that&#8217;s not valid CSS for those who muck about with that. Yeah. And here it is. The PR78653 has the modal media editor, image cropper modal being the default experience for the block editor. It&#8217;s out of experiments in. Another thing for 23.3 is that Gutenberg upgraded to React 19. This is important for plugin developers and those who have a very tight handle on the dependencies for their work. React 19 is now the default and there might be dragons out there. Please, please, please, yeah. Give feedback on that. Create issues what works and what doesn&#8217;t work. Especially what doesn&#8217;t work. So those can be fixed PR 7.1 so you don&#8217;t have any surprises later on. What else? I think those were the, the big items.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Yeah, I mean I&#8217;ve, I&#8217;ve been sort of like under, under my responsive styles rock for these past few weeks just working on that. Very, very fixated on getting this thing right.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>So I have to say nothing.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> I mean it&#8217;s definitely got a huge amount of attention to. Yeah. What else is out there?</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Definitely God&#8217;s work.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> Hopefully it&#8217;s worth it.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Yeah, absolutely. Yeah, absolutely. Yeah, I think that&#8217;s it. As I said, there are 270 PRs. So. Yeah. And it just has been released for a while ago.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison:</em> There&#8217;s a lot of enhancements and bug fixes and stuff in here.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack:</em> Yeah, that&#8217;s it. I think we are good. So, dear listeners, you will see on the Weekend Edition and the Gutenberg Changelog will pause during my vacation. I&#8217;m going on vacation next week, which is June 15th and I&#8217;m coming back in beginning of July. So in time for 7.1 beta, you&#8217;ll hear us again and you will read us again. </p>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;m so happy, Isabel, you are here on the show to walk us through all the good things that come with Gutenberg to 7.1, especially the responsive parts. The responsive parts. I like that. Responsive parts. Thank you so much for taking the time out of your busy work schedule and be on the show and walk us through that.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>No worries. You always enjoy this show.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Birgit Pauli-Haack: </em>Well, thank you so much. And as always, dear listeners, the show notes will be published on GutenbergTimes.com podcast. This is episode 1311 31st. And if you have questions or suggestions or news you want us to include, send them to <a href=\"http://changelogutenbergtimecs.com\">changelogutenbergtimecs.com</a> that&#8217;s <a href=\"http://changelogutenburgtimes.com\">changelogutenburgtimes.com</a>. </p>\n\n\n\n<p class=\"wp-block-paragraph\">Thank you all for listening. And until the next time, and I see you in July. </p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Isabel Brison: </em>Bye bye.</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sun, 07 Jun 2026 10:03:25 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:19:\"Gutenberg Changelog\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:41;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:57:\"WordPress.org blog: What Happened at WordCamp Europe 2026\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=20793\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:51:\"https://wordpress.org/news/2026/06/wceu-2026-recap/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:36048:\"<figure class=\"wp-block-image size-full\"><img alt=\"\" class=\"wp-image-20801\" height=\"1440\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-04-at-01.08.10-1-scaled-edited.jpeg?resize=2560{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C1440&#038;ssl=1\" width=\"2560\" /></figure>\n\n\n\n<div class=\"wp-block-group is-horizontal is-content-justification-left is-nowrap is-layout-flex wp-container-core-group-is-layout-e8523bbf wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img alt=\"\" class=\"wp-image-20863\" height=\"501\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/Witold-wapuu-wceu-2026.jpg?resize=386{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C501&#038;ssl=1\" width=\"386\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\">WordCamp Europe, <a href=\"https://europe.wordcamp.org/2026/\">the biggest WordPress conference in Europe</a>, spent the first week of June in Kraków. The 2026 edition of this event filled the ICE Kraków Congress Centre from June 4 to 6, drawing 2,458 ticket holders from 81 countries to the south of Poland. Close to a quarter of them were attending their first WordCamp Europe.</p>\n</div>\n\n\n\n<p class=\"wp-block-paragraph\">The city made it easy to settle in. Every attendee&#8217;s badge carried a transport hologram good for unlimited trams and buses. The Main Market Square, the largest in Europe, sat a short ride away, and the local food ran the gamut from pierogi to żurek soup to obwarzanek pretzels sold off the street.</p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Kraków is beautiful, with history everywhere.<br /><em>&#8211; Sebastian Miśniakiewicz, local team lead</em></p>\n</blockquote>\n\n\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-7387b849 wp-block-group-is-layout-flex\">\n<p class=\"wp-block-paragraph\">The program kept pace with the setting. Across multiple tracks, the schedule held 49 talks and eight hands-on workshops, grouped into themes that ran from core development and AI to business and the open web. Around them sat a full Contributor Day, a sponsor area, side events, on-site childcare, and an after-party the local team stretched to eight hours.</p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img alt=\"\" class=\"wp-image-20864\" height=\"500\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/wandzia-wapuu-wceu-2026.jpg?resize=474{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C500&#038;ssl=1\" width=\"474\" /></figure>\n</div>\n\n\n\n<h2 class=\"wp-block-heading\">Contributor Day Opens the Week</h2>\n\n\n\n<p class=\"wp-block-paragraph\">As it does every year, the event began the day before the talks. Contributors filled the venue for Contributor Day, a working session where people work together to improve WordPress itself rather than watch a presentation about it. The morning started with registration and a welcome, the room split into teams, and a group photo broke up the work around midday. The afternoon ran a second working block before each team gathered to share what it had done.</p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped has-black-background-color has-background wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\" style=\"border-width: 20px; border-radius: 2px;\">\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20812\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-04-at-06.16.10.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20806\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-04-at-02.48.24.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20805\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-04-at-02.43.58.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20807\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-04-at-03.15.18.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20808\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-04-at-03.32.46.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20809\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-04-at-03.32.47.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20810\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-04-at-04.00.15.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-full wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20813\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-04-at-06.25.24-1-scaled.jpeg?ssl=1\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20811\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-04-at-04.31.29.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n</figure>\n\n\n\n<p class=\"wp-block-paragraph\">The range of tables is the clearest picture of how wide the project has become. Newcomers could sit down with Polyglots to translate WordPress into their own language, with Documentation to fix the pages people reach when they get stuck, or with Support to answer questions in the forums. More technical tables covered Core, Performance, Testing, Themes, and the Plugins team, whose reviewers screen every plugin submitted to the directory.</p>\n\n\n\n<p class=\"wp-block-paragraph\">First-timers were not left to find their own way. The day was built around onboarding tables, named table leads, and mentors, with an open invitation for experienced contributors to adopt a newcomer and walk them through their first patch, string, or ticket.</p>\n\n\n\n<p class=\"wp-block-paragraph\">People who could not travel to Kraków were welcomed to join remotely through the #contributor-day channel in the <a href=\"https://make.wordpress.org/\">Make WordPress Slack</a>, so distance was not a reason to sit the day out.</p>\n\n\n\n<h2 class=\"wp-block-heading\">The Birthplace of the Web</h2>\n\n\n\n<p class=\"wp-block-paragraph\">It was fitting that the opening keynote came from CERN. The European Laboratory for Particle Physics, on the French-Swiss border outside Geneva, is where the World Wide Web was invented more than 30 years ago, and <a href=\"https://profiles.wordpress.org/joachimv\">Joachim Valdemar Yde</a>, who has managed CERN&#8217;s web team since 2021, came to explain why the laboratory had chosen WordPress to carry its web presence forward.</p>\n\n\n\n<div class=\"wp-block-group has-black-background-color has-background is-layout-constrained wp-container-core-group-is-layout-ef2f134e wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n\n</div></figure>\n</div>\n\n\n\n<p class=\"wp-block-paragraph\">Yde and <a href=\"https://profiles.wordpress.org/franciscobbarros\">Francisco Borges Aurindo Barros</a>, who leads CERN&#8217;s WordPress infrastructure, framed the move as a chance to give a web presence built up over three decades a shared, modern foundation. After evaluating several leading content management systems against CERN&#8217;s needs, WordPress came out on top.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Barros walked through what they had built. The guiding idea is that people at CERN focus on their content while the web team looks after the platform underneath. A self-service portal lets anyone request a site in a few clicks. Behind it, a shared distribution supplies a common theme and a set of approved, security-hardened plugins, and an in-house tool provisions each new site on Kubernetes in about a minute. In its first year, the platform has already set up hundreds of sites.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Moving years of existing content onto the new platform is the other half of the work, and the team automated it: a single command lifts each site&#8217;s pages, headings, and images and rebuilds them as Gutenberg blocks, with no downtime. They plan to open source the tool.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Then Yde delivered the line that the room had been waiting for.</p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">As of today, our main flagship website, home.cern, is now served on WordPress. It&#8217;s been automatically migrated, and it&#8217;s live.<br /><br /><em>&#8211; Joachim Valdemar Yde, Web Manager, CERN</em></p>\n</blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">The rollout is on track to wrap up over the coming months, and early impressions, Yde said, have been overwhelmingly positive, with easy wins in responsiveness and accessibility. For those at the event, the keynote pointed the room toward <a href=\"https://youtu.be/f09yvh3mnME\">a later talk by CERN&#8217;s Akanksha Chatterjee</a> on building and maintaining the laboratory&#8217;s engineering websites on the same service.</p>\n\n\n\n<p class=\"wp-block-paragraph\">There is a neat symmetry to it. The institution that published the world&#8217;s first website now runs on the software that powers more than 40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} of today&#8217;s web, licensed under the GPL and maintained by the people in the room.</p>\n\n\n\n<h2 class=\"wp-block-heading\">WordPress 7.0 and AI</h2>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress 7.0 was a throughline of the conference. Several sessions placed the release at the center, framing it less as a routine update than as a change in what the software is, and in what it makes possible for the people who build with it.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The anchor for that conversation was a panel called &#8220;Inside WordPress 7.0.&#8221; It gathered contributors who worked on the release, among them <a href=\"https://profiles.wordpress.org/juanmaguitar\">Juan Manuel Garrido</a>, <a href=\"https://profiles.wordpress.org/adamsilverstein\">Adam Silverstein</a>, <a href=\"https://profiles.wordpress.org/benjamin_zekavica\">Benjamin Zekavica</a>, <a href=\"https://profiles.wordpress.org/mikachan\">Sarah Norris</a>, and <a href=\"https://profiles.wordpress.org/milana_cap\">Milana Cap</a>. It was framed around more than a feature list, setting out to cover how a release of this size actually comes together: the contribution workflows, the coordination, and the human aspects of shipping software in the open.</p>\n\n\n\n<figure class=\"wp-block-image size-full wp-lightbox-container\"><img alt=\"Photo of the stage for the panel inside WordPress 7.0\" class=\"wp-image-20878\" height=\"843\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/wordpress-news-6a2425b8ceabf.png?resize=1264{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C843&#038;ssl=1\" title=\"Panel: Inside WordPress 7.0\" width=\"1264\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<p class=\"wp-block-paragraph\">What gives this release its weight is the work moving into WordPress&#8217;s core: a native AI client, a new Abilities API that lets plugins declare what they can do in a way other tools can discover, and a Connectors screen for wiring up providers such as OpenAI, Anthropic, or Google Gemini. The argument running through the AI sessions was that this belongs to everyone who builds on WordPress, not only to developers shipping their own integrations. Speakers got specific about how to put that to work.</p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https://profiles.wordpress.org/anukasha\">Anukasha Singh</a> focused on how the Abilities API can make plugin permissions cleaner and safer than the capability checks developers have leaned on for years.</li>\n\n\n\n<li>In a workshop, <a href=\"https://profiles.wordpress.org/wpfeedback\">Vito Peleg</a> set out to take builders from one-off prompts toward a tool-using workflow that audits a live site and files structured tickets.</li>\n\n\n\n<li><a href=\"https://profiles.wordpress.org/schlessera\">Alain Schlesser</a>, a WP-CLI maintainer who has worked on structured data and the AI-native web, turned to a fast-growing opportunity. AI assistants and search now send real traffic to the open web, with more than a billion referral visits logged by the middle of 2025. His session framed WordPress as well-placed to earn that attention, with a practical checklist for getting a site ready to be found, read, and cited.</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">People stayed at the center of the conversation, too. <a href=\"https://profiles.wordpress.org/karmatosed\">Tammie Lister</a>, in a talk called &#8220;Human in the loop means something,&#8221; framed the phrase as a real commitment rather than a checkbox. Humans and AI are each good at different things, and the products worth building let each do what it does best.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Development and Craft</h2>\n\n\n\n<p class=\"wp-block-paragraph\">The development sessions were where the craft lived. <a href=\"https://profiles.wordpress.org/dmsnell\">Dennis Snell</a>, who co-wrote the HTML API and designed the block parser, devoted a deep-dive workshop to that API. <a href=\"https://profiles.wordpress.org/peterwilsoncc\">Peter Wilson</a>, a long-time Core committer on the Performance team, focused on how the WP_Query class has been made faster through better caching, and how site builders can take advantage of that at scale.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Scaling got a hands-on session of its own. One talk set out to see how far a WordPress site can run on a twelve-dollar virtual server, profiling it under load in Grafana and tuning away the bottlenecks, with a GitHub repository so attendees could follow along at home. <a href=\"https://profiles.wordpress.org/fellyph\">Fellyph Cintra</a> focused on the latest in <a href=\"https://playground.wordpress.net/\">WordPress Playground</a>, the browser-based tooling and architectural changes that the project credits with a real speed-up.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://profiles.wordpress.org/luminuu\">Jessica Lyschik</a>, a Core contributor and former default-theme co-lead, set out to make the case that accessibility-ready requirements are far easier to meet than most theme developers assume, drawing on real reviews of both block and classic themes.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Two members of the Plugins team, <a href=\"https://profiles.wordpress.org/davidperez\">David Perez</a> and <a href=\"https://profiles.wordpress.org/frantorres\">Fran Torres</a>, framed their session as a practical clinic. Between them, they have reviewed more than 25,000 plugins, and they set out to name the common, avoidable issues that keep good plugins stuck in the review queue. For a first-time author, that is the difference between an afternoon and a month of waiting.</p>\n\n\n\n<h2 class=\"wp-block-heading\">The Business of WordPress and the Open Web</h2>\n\n\n\n<p class=\"wp-block-paragraph\">The business and community sessions pulled the lens back to people, with a refreshingly unsentimental view of running a WordPress business. <a href=\"https://profiles.wordpress.org/deltacx\">Debbie Levitt</a> built her talk around a model for finding product-market fit at three levels at once, on the premise that teams celebrate one good metric and then wonder months later where their users went. <a href=\"https://profiles.wordpress.org/vasvalch\">Vassilena Valchanova</a> took on a quieter problem: being good at the work is not the same as anyone knowing you are.</p>\n\n\n\n<p class=\"wp-block-paragraph\">There was a local thread here as well. <a href=\"https://profiles.wordpress.org/irsilviana\">Irfani Silviana</a>, a full-stack developer at a Kraków-based agency, framed the Business Model Canvas as a translation layer that moves developers from shipping features to engineering business value, a fitting talk to give in her own city.</p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">The web&#8217;s standards, the argument goes, remain as open as the day Tim Berners-Lee created them at CERN.</p>\n</blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">That idea carried through the rest of the community sessions. </p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https://profiles.wordpress.org/wdavidsnead\">David Snead</a>, an attorney who works with internet infrastructure providers, set out to explain how hosts, registrars, and registries coordinate against abuse through shared, real-time intelligence, on the logic that a threat to one WordPress host is a threat to all of them.</li>\n\n\n\n<li><a href=\"https://profiles.wordpress.org/mbootsman\">Marcel Bootsman</a> shared a practical playbook for how companies and individuals can support open source sustainably and look after the people who keep it going.</li>\n\n\n\n<li><a href=\"https://profiles.wordpress.org/karinchristen\">Karin Christen</a> set out to describe how her Swiss agency turned <a href=\"https://wordpress.org/five-for-the-future/\">Five for the Future</a> from a good intention into a standing team habit through internal contributor days.</li>\n</ul>\n\n\n\n<p class=\"wp-block-paragraph\">Running alongside the talks, the hands-on workshops were a chance to build something on the spot. In one, <a href=\"https://profiles.wordpress.org/welcher\">Ryan Welcher</a> set out to build a touch-enabled gallery slider with the Interactivity API, while another centered on Full Site Editing, with a working portfolio theme attendees could reuse on their next client project. These were laptop-open, leave-with-working-code sessions.</p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-4 is-cropped has-black-background-color has-background wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\" style=\"border-width: 20px; border-radius: 2px;\">\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20849\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/55316270345_085d4eb772_k.jpg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20850\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/55317280236_97760333e1_k.jpg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n</figure>\n\n\n\n<h2 class=\"wp-block-heading\">Closing Fireside Chat</h2>\n\n\n\n<p class=\"wp-block-paragraph\">The closing session opened with a warm gesture from Kraków University of Technology. Representatives took the stage to thank the organizers and the community and to present <a href=\"https://profiles.wordpress.org/4thhubbard\">Mary Hubbard</a>, the Executive Director of WordPress, with a gift from their faculty of informatics and mathematics. They described what the university and the WordCamp community share: a love of learning and sharing knowledge, and an openness to new ideas, skills, and connections.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Hubbard used the moment to share some news. Starting in October, the university will open a WordPress-specific course, which she called a trail-blazing event for Poland and for WordPress. Earlier that day, the program&#8217;s first cohort, around 20 students, had shown what they built, part of the <a href=\"https://wordpress.org/education/campus-connect/\">WordPress Campus Connect</a> and <a href=\"https://wordpress.org/education/credits/\">WordPress Credits</a> education work.</p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-4 is-cropped has-black-background-color has-background wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\" style=\"border-width: 20px; border-radius: 2px;\">\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20888\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-06-at-10.26.32.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20887\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-06-at-10.26.32-1.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n</figure>\n\n\n\n<p class=\"wp-block-paragraph\">Hubbard then turned the stage into a conversation, inviting <a href=\"https://profiles.wordpress.org/matveb\">Matías Ventura</a>, the lead of the Gutenberg project, and <a href=\"https://profiles.wordpress.org/richtabor\">Rich Tabor</a>, a WordPress designer and developer, to talk through where WordPress is heading and how AI fits in. WordPress 7.0 had just launched with Ventura as its release lead, and he asked everyone who had contributed to it to stand for a round of applause.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Much of the chat explored the balance between building WordPress with AI, and building with AI on WordPress, without losing the human part. Ventura noted that WordPress&#8217;s long investment in its design system is paying off now that you can ask an AI to extend a menu or a control, and it reaches for the right components. He pointed to older primitives gaining new value, like <a href=\"https://wordpress.org/cli/\">WP-CLI</a>, which AI models use fluently, and to <a href=\"https://developer.wordpress.com/docs/developer-tools/studio/studio-code/\">Studio Code</a>, an open source, agent-based coding tool the team has been building for WordPress. Tabor showed how he now ships many small editor improvements by talking to an agent instead of typing code, and Ventura demoed desktop mode and open-canvas experiments that reimagine the admin.</p>\n\n\n\n<p class=\"wp-block-paragraph\">On open source and AI, Hubbard argued that open source is why WordPress has thrived, that the same values should shape AI, and that the community should be far more vocal about it. As she put it, &#8220;We should be talking about it, and we should be much louder about it.&#8221;</p>\n\n\n\n<div class=\"wp-block-group has-black-background-color has-background is-layout-constrained wp-container-core-group-is-layout-9c97b5da wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n\n</div></figure>\n</div>\n\n\n\n<p class=\"wp-block-paragraph\">Audience questions pushed on multilingual support, unsticking long-stalled tickets, and reaching a younger, more diverse community. On that last point, Hubbard came back to education, pointing to a <a href=\"https://wordpress.org/news/2026/02/ai-leaders-credential/\">US pilot of an AI literacy micro-credential</a> that uses WordPress as the playground, and made the case for it:</p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">I think that focusing in on younger generations, and bringing them into the project in a healthy way, with the dynamic of education as well as mentorship, and how we can understand and learn from them, as well as mentor them and adopt them as contributors, is very important.<br /><br /><em>&#8211; Mary Hubbard, WordPress Executive Director</em></p>\n</blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Beyond the Talks</h2>\n\n\n\n<p class=\"wp-block-paragraph\">WordCamp is also about the corridor outside the talks, and Kraków gave people reason to roam. Between sessions, attendees moved through the sponsor area for product demos and conversations that often carried on over lunch.</p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-3 is-cropped has-black-background-color has-background wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex\" style=\"border-width: 20px; border-radius: 2px;\">\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20823\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-05-at-02.39.47.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20828\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-05-at-02.49.48.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20825\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-05-at-02.46.57.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20824\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-05-at-02.39.48.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20826\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-05-at-05.23.01.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n\n\n\n<figure class=\"wp-block-image size-large wp-lightbox-container\"><img alt=\"\" class=\"wp-image-20827\" height=\"683\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/WhatsApp-Image-2026-06-05-at-04.35.58.jpeg?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C683&#038;ssl=1\" width=\"1024\" /><button class=\"lightbox-trigger\" type=\"button\">\n			<svg fill=\"none\" height=\"12\" viewBox=\"0 0 12 12\" width=\"12\" xmlns=\"http://www.w3.org/2000/svg\">\n				<path d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" fill=\"#fff\">\n			</svg>\n		</button></figure>\n</figure>\n\n\n\n<p class=\"wp-block-paragraph\">The after-party was the not-so-subtle flourish of a local team that doubled the usual length to eight hours, with Polish food and dragon-and-floral swag that nodded to the Wawel Dragon of Kraków legend. The nearby artistic Kazimierz district kept the evening going, and the trams, as one organizer had promised, were still running reliably afterward.</p>\n\n\n\n<h2 class=\"wp-block-heading\">What Comes Next</h2>\n\n\n\n<p class=\"wp-block-paragraph\">WordCamps run on people, and 2026 was no different. The organizing teams, the speakers, the sponsors who funded the venue and the meals, the local crew who sorted trams and pierogi, and the contributors who arrived a day early to work on the project all built this WCEU together. The people watching the <a href=\"https://www.youtube.com/playlist?list=PL1pJFUVKQ7ET_os7azDwYFsUDoc0Y9plA\">livestream</a> from outside Kraków were part of it as well.</p>\n\n\n\n<p class=\"wp-block-paragraph\">For anyone whose appetite was only sharpened by three days in Poland, the calendar already has the next stop. <a href=\"https://us.wordcamp.org/2026/\">WordCamp US 2026</a> (Phoenix, USA) runs August 16 to 19, with its own Contributor Day opening the week.</p>\n\n\n\n<figure class=\"wp-block-image size-large has-custom-border\"><a href=\"https://us.wordcamp.org/2026/\"><img alt=\"WordCamp US: Powered by WordPress, Driven by Community, August 16-19, 2026\" class=\"wp-image-20859\" height=\"321\" src=\"https://i0.wp.com/wordpress.org/news/files/2026/06/wcus-2026-teaser.png?resize=1024{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C321&#038;ssl=1\" width=\"1024\" /></a></figure>\n\n\n\n<p class=\"wp-block-paragraph\">WordCamp Europe will return next year (May 27-29, 2027) in Málaga, Spain.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\" />\n\n\n\n<p class=\"wp-block-paragraph\"><em>Photography by the <a href=\"https://europe.wordcamp.org/2026/community/organisers/#photography-team\">WCEU 2026 photography team</a>. See the full galleries on <a href=\"https://www.flickr.com/photos/wceu/albums/\">Flickr</a>.</em></p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 06 Jun 2026 17:44:14 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:17:\"Nicholas Garofalo\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:42;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:94:\"Gutenberg Times: Calls for Testing, Gutenberg 23.3, Block MCP and more — Weekend Edition 367\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=45754\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:90:\"https://gutenbergtimes.com/calls-for-testing-gutenberg-23-3-block-mcp-weekend-edition-367/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:23404:\"<p class=\"wp-block-paragraph\">Howdy,</p>\n\n\n\n<p class=\"wp-block-paragraph\">This is the time of the year when publishing on the Gutenberg Times becomes less frequent. I will be on vacation and back at the beginning of July with the weekend edition, just in-time for Beta 1 of WordPress 7.1. Three more Gutenberg plugin releases will happen before that. </p>\n\n\n\n<p class=\"wp-block-paragraph\">What also happened was that someone <a href=\"https://techcrunch.com/2026/06/01/hackers-hijacked-instagram-accounts-by-tricking-meta-ai-support-chatbot-into-granting-access/\">grabbed my instagram account in this AI hack</a> at Meta.  Although Meta reports this as resolved, I probably won&#8217;t get my account back. I am now actively looking for a better way to share my photos without the overlords that can&#8217;t keep things tight. <img alt=\"🤦‍♀️\" class=\"wp-smiley\" src=\"https://s.w.org/images/core/emoji/17.0.2/72x72/1f926-200d-2640-fe0f.png\" style=\"height: 1em;\" />   It&#8217;s not that I didn&#8217;t know better. &lt;sigh/&gt; <img alt=\"🤷‍♀️\" class=\"wp-smiley\" src=\"https://s.w.org/images/core/emoji/17.0.2/72x72/1f937-200d-2640-fe0f.png\" style=\"height: 1em;\" /> It&#8217;s a cautionary tale for what&#8217;s in store for all internet services handing over crucial business processes to a gulliable AI.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\" />\n\n\n\n<p class=\"wp-block-paragraph\">I had the great pleasure of going on the <strong>OpenMakers</strong> show with <strong>Abha Thakor</strong> to <a href=\"https://openchannels.fm/new-tools-and-updates-in-wordpress-7-0-for-developers-and-content-managers/\">talk through what WordPress 7.0 &#8220;Armstrong&#8221; means for you</a>. First, the safety bit: test on a staging site or Playground before updating, and check your PHP. Then the good stuff. Visual revisions show edits in context with color coding. Notes keep feedback inside the editor. Patterns gain content-only editing, blocks can hide by device, and new AI connector APIs give developers a unified foundation. Real-time editing waits for a later release.</p>\n\n\n\n<p class=\"wp-block-paragraph\"></p>\n\n\n\n<p class=\"wp-block-paragraph\">Yours, <img alt=\"💕\" class=\"wp-smiley\" src=\"https://s.w.org/images/core/emoji/17.0.2/72x72/1f495.png\" style=\"height: 1em;\" /><br /><em>Birgit</em></p>\n\n\n\n\n\n<p class=\"wp-block-paragraph\"><strong>WordCamp Europe</strong> LiveStream was up and running and Friday&#8217;s keynote can be watched online. <strong><a href=\"https://www.youtube.com/live/cLGiNR-h_34?si=7JEdopb4nHMec5Bs&amp;t=5032\">Two worlds collide: WordPress at CERN</a></strong> with Joachim Valdemar Yde and Francisco Borges Aurindo Barros. The Livestream are all routed to the <a href=\"https://www.youtube.com/@WordPress/streams\">WordPress YouTube account</a>. <a href=\"https://europe.wordcamp.org/2026/schedule/\">The schedule</a> is posted on the website. </p>\n\n\n<div class=\"wp-block-newsletterglue-showhide ng-block\" width=\"100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n\n</div></figure>\n</div>\n\n\n<p class=\"wp-block-paragraph\">Over the course of the weekend more recordings will be uploaded to <a href=\"https://wordpress.tv/event/wordcamp-europe-2026/\">WordPress TV &gt; WordCamp Europe 2026</a>. </p>\n\n\n\n<p class=\"wp-block-paragraph\">On Saturday, Matt Mullenweg, co-founder of WordPress and CEO of Automattic  will close out WordCamp Europe 2026 with his keynote. Afterward, the organizers will reveal where WordCamp Europe 2027 will take place. Tune in around 2:15 UTC / 8:15 am EDT. </p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\" />\n\n\n\n<h2 class=\"wp-block-heading\" id=\"0-word-press-release-information\">Developing Gutenberg and WordPress</h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Arthur Chu </strong>walks you through <strong><a href=\"https://make.wordpress.org/core/2026/06/03/whats-new-in-gutenberg-23-3-03-jun/\">what&#8217;s new in Gutenberg 23.3</a>.</strong> The modal media editor is now the default for cropping. It pulls cropping, flip, rotation, and metadata into one place. The experimental customizable dashboard grows too, with five new widgets you can drag and resize. Responsive styles now reach individual blocks, so designs adapt per screen. </p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\" />\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rae Morey</strong> reports that <a href=\"https://www.therepository.email/gutenberg-23-3-ships-experimental-customizable-wordpress-dashboard\">Gutenberg 23.3 brings an experimental, customizable WordPress dashboard</a>. It&#8217;s the admin&#8217;s biggest structural shakeup in years. You can drag, resize, and rearrange widgets like Welcome, Activity, and Site Health to fit how you actually work. It&#8217;s the first testable preview of a long-discussed overhaul. Enable it under Gutenberg &gt; Experiments to try it. </p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\" />\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Jarda Snajdr</strong> reports that <a href=\"https://make.wordpress.org/core/2026/06/05/react-19-upgrade-temporarily-reverted-in-gutenberg/\"><strong>the React 19 upgrade has been reverted in Gutenberg</strong></a>. Shortly after 23.3.0 shipped, many plugins built for React 18 started crashing. The APIs barely changed, but the runtimes clashed: React 19 rejects elements made by a bundled React 18 JSX helper. So 23.3.2 rolls back to React 18. The team still plans the upgrade for 7.1—this time with a feature flag and a compatibility layer.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\" />\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Isabel Brison</strong> and I chatted extensively about the latest Gutenberg plugin releases 23.1 to 23.3 and discussed the responsive controls now available in the Gutenberg plugin for desktop, tablet and mobile view ports. The episode will drop in your favorite podcast app over the weekend. </p>\n\n\n\n<div class=\"wp-block-group has-light-background-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\"><img alt=\"🎙\" class=\"wp-smiley\" src=\"https://s.w.org/images/core/emoji/17.0.2/72x72/1f399.png\" style=\"height: 1em;\" /> The latest episode is <a href=\"https://gutenbergtimes.com/podcast/gutenberg-changelog-131/\">Gutenberg Changelog #131 – Gutenberg Plugin Releases 23.1 – 23.3, Calls for Testing for 7.1 and more</a></p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img alt=\"\" class=\"wp-image-45775\" height=\"280\" src=\"https://i0.wp.com/gutenbergtimes.com/wp-content/uploads/2026/06/Screenshot-2026-06-05-at-17.56.38.png?resize=652{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C280&#038;ssl=1\" width=\"652\" /></figure>\n\n\n<div class=\"wp-block-newsletterglue-showhide ng-block\" width=\"100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<figure class=\"wp-block-embed is-type-rich is-provider-pocket-casts wp-block-embed-pocket-casts\"><div class=\"wp-block-embed__wrapper\">\n\n</div></figure>\n</div></div></div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rich Tabor</strong> shares a few <strong><a href=\"https://rich.blog/little-big-things/\">“little big things” for WordPress editing</a>. </strong>The idea is simple: complexity has piled up, and small fixes can clear it. His PRs make block locking a one-click job in List View. They keep you in place when editing synced patterns, instead of whisking you off to another view. And zooming out reuses the familiar Patterns Explorer. He&#8217;s not precious about them—contributors are warmly invited to take them over the line.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\" />\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Dave Smith</strong> walks you through <a href=\"https://www.youtube.com/watch?v=TdsQe9oi8mg\">an interactive prototype reimagining the WordPress Site Editor around user goals rather than system architecture</a>. Built during Automattic&#8217;s Radical Speed Month, it keeps the same blocks, templates, and data model intact while changing entry points, language, and defaults. Since internal research flags the Site Editor as the top driver of negative support outcomes, you&#8217;ll see how remapping it around what you want to do could ease that friction. It&#8217;s an experiment, not a roadmap.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"calls-for-testing-for-wordpress-7-1\">Calls for Testing for WordPress 7.1</h2>\n\n\n\n<p class=\"wp-block-paragraph\">With WordPress 7.0 out the door, contributors shared a series of Calls for testing  this week to prepare for WordPress 7.1. The schedule is tight with Beta 1 slated for July 15, 2026. </p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ramon Dodd</strong> puts out a <strong><a href=\"https://make.wordpress.org/core/2026/05/21/media-editor-modal-call-for-testing/\">call for testing the new Media Editor Modal</a>.</strong> Cropping in the block editor hasn&#8217;t changed much in years, and the old inline tool leans on a limited third-party library. This new standard way of Image edition inside the Block editor replaces it with a WordPress-native one. You get freeform and aspect-ratio cropping, flip, rotation, and metadata editing in one place. The quickest way to try it is a ready-made Playground link. Feedback is welcome via the comments or GitHub.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\" />\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Anne McCarthy</strong> announced a <strong><a href=\"https://make.wordpress.org/core/2026/06/03/announcing-a-collaborative-editing-outreach-effort-for-7-1/\">collaborative editing outreach effort for WordPress 7.1</a>.</strong>  After real-time collaboration was pulled from 7.0, this gathers real-world early adopters across many hosting setups to find bugs faster. It lives in one Slack channel, <a href=\"https://wordpress.slack.com/archives/C0B7W4UQFC2\">#collaborative-editing-outreach</a>. If you&#8217;d use collaborative editing regularly and run the latest Gutenberg, you&#8217;re invited—through the cycle, with a test team badge at the end. </p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rae Morey</strong> has the skinny for you in <strong><a href=\"https://www.therepository.email/contributors-launch-fse-style-outreach-program-to-get-real-time-collaboration-ready-for-wordpress-7-1\" rel=\"noopener\" target=\"_blank\">Contributors Launch FSE-Style Outreach Program to Get Real-Time Collaboration Ready for WordPress 7.1</a></strong></p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\" />\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Adam Silverstein</strong> puts out a <a href=\"https://make.wordpress.org/core/2026/06/04/call-for-testing-client-side-media-processing/\"><strong>call for testing client-side media processing</strong></a>, now targeting WordPress 7.1. Here&#8217;s the idea: when you upload an image, your browser resizes and encodes every size locally using VIPS in WebAssembly, before anything reaches the server. That eases CPU and memory load on hosts and brings modern formats like AVIF, WebP, HEIC, and JPEG XL to every site. Browsers that can&#8217;t cope fall back quietly to server-side. Try it in Chromium with the latest Gutenberg.</p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"0-p\">Plugins, Themes, and Tools for #nocode site builders and owners</h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Brian Coords</strong> invites you to a <a href=\"https://developer.woocommerce.com/2026/06/03/ai-wordpress-woo-live-event/\"><strong>live panel on practical AI workflows for WordPress and WooCommerce</strong></a> on Tuesday, June 30, 2026, at 10am PDT. Hosted with Shani Banerjee and featuring Nik McLaughlin, Kyle Runner, and Suzanne Kolpakov, the conversation covers WooCommerce MCP, the WordPress Abilities API, Pressable MCP, and making your own plugins more agent-ready. You&#8217;ll come away with practical ideas for managing stores and guiding cautious clients, plus open Q&amp;A. Can&#8217;t make it live? Register anyway for the recording.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\" />\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Nathan Wrigley</strong> talks with plugin reviewer Luke Carbis about <a href=\"https://wptavern.com/podcast/218-luke-carbis-on-the-future-of-wordpress-plugins-ai-ethics-and-new-directory-standards\">the future of WordPress plugins on the Jukebox podcast</a>. Here&#8217;s the worry: plugin submissions have quadrupled in a year, largely AI-generated, so good plugins struggle to stand out. Carbis floats ideas you can test: logging into your site with your WordPress.org account, installing from your own Git repos, or a commercial marketplace funding contributors. They also weigh AI ethics, a generational backlash, and his proposed AI-disclosure header for the directory.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\" />\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wes Theron</strong> published a new training video and you can learn <strong><a href=\"https://www.youtube.com/watch?v=MIbZSbBbF2k\">how to customize your site’s navigation menus with AI</a><a>.</a></strong> Once your site is connected, you describe the change and the agent makes it. You&#8217;ll learn to add a page to your header, remove an outdated link, and reorder items. It also covers building dropdown menus under an unclickable parent, adding a footer menu, and linking to blog categories. The point: clear menus help visitors find what matters.</p>\n\n\n<div class=\"wp-block-newsletterglue-showhide ng-block\" width=\"100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\">\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n\n</div></figure>\n</div>\n\n\n<h2 class=\"wp-block-heading\" id=\"2-word-press-6-0-1-and-6-1-scheduled\">Theme Development for Full Site Editing and Blocks</h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ajit Bohra</strong> and the LUBUS team released <a href=\"https://wordpress.org/plugins/color-palette-block/\">Color Palette Block 2.0, a free plugin for building and sharing color palettes</a> in the block editor. It grew out of their own client and internal documentation needs. It&#8217;s handy for brand kits, design systems, and style guides. You add swatches manually, pull from your theme, or generate random ones. Pick from four display styles—Square, Polaroid, Circle, or Droplet—and copy each color as HEX, RGB, HSL, or a CSS variable.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\" />\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Justin Tadlock</strong> shares a playful tutorial on registering custom icons for WordPress 7.0&#8217;s new Icon block. Since the public registration API won&#8217;t land until 7.1, you&#8217;ll learn a clever workaround using PHP Reflection to reach the protected <code>WP_Icons_Registry::register()</code> method, bundling SVGs in your theme through an Icon enum and registrar class. Built on work by Ryan Welcher and Nick Diego, it&#8217;s educational fun—not for production, where Nick&#8217;s Icon Block plugin still does the job properly.</p>\n\n\n<div class=\"ng-block-33364e14a3aa73cc wp-block-newsletterglue-container ng-block\" style=\"color: #666666;\" width=\"100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div><div><div class=\"ng-block-vs ng-block-vs-1\" colspan=\"3\" height=\"0\" style=\"height: 0px;\"></div></div><div><div class=\"ng-block-hs ng-block-hs-1\" height=\"0\" style=\"width: 0px;\"></div><div align=\"none\" class=\"ng-block-td\" style=\"font-size: 16px; font-family: Helvetica; line-height: 1.6; font-weight: normal; padding-top: 20px; padding-bottom: 20px; padding-left: 0px; padding-right: 0px; text-align: none; color: #666666; background-color: #fdfcea; border-radius: 12px;\"><div class=\"ng-block-557fc0fc2838ede6 wp-block-newsletterglue-text ng-block\" style=\"color: #666666;\" width=\"100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div><div><div align=\"none\" class=\"ng-block-td\" style=\"font-size: 16px; font-family: Helvetica; line-height: 1.6; font-weight: normal; padding-top: 8px; padding-bottom: 10px; padding-left: 20px; padding-right: 20px; text-align: none; color: #666666;\"><p><strong> <a href=\"https://make.wordpress.org/core/handbook/references/keeping-up-with-gutenberg-index/\" rel=\"noreferrer noopener\" target=\"_blank\">&#8220;Keeping up with Gutenberg &#8211; Index 2025&#8221;</a> </strong><br />A chronological list of the WordPress Make Blog posts from various teams involved in Gutenberg development: Design, Theme Review Team, Core Editor, Core JS, Core CSS, Test, and Meta team from Jan. 2024 on. Updated by yours truly. </p></div></div></div></div>\n\n<div class=\"ng-block-ace3b9a9112dc8c8 wp-block-newsletterglue-text ng-block\" style=\"color: #666666;\" width=\"100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div><div><div align=\"none\" class=\"ng-block-td\" style=\"font-size: 16px; font-family: Helvetica; line-height: 1.6; font-weight: normal; padding-top: 8px; padding-bottom: 10px; padding-left: 20px; padding-right: 20px; text-align: none; color: #666666;\"><p>The previous years are also available: <br /><strong><strong><a href=\"https://make.wordpress.org/core/handbook/references/keeping-up-with-gutenberg-index/keeping-up-with-gutenberg-index-2020/\">2020</a> | <a href=\"https://make.wordpress.org/core/handbook/references/keeping-up-with-gutenberg-index/keeping-up-with-gutenberg-index-2021/\">2021</a></strong> | <strong><a href=\"https://make.wordpress.org/core/handbook/references/keeping-up-with-gutenberg-index/keeping-up-with-gutenberg-index-2022/\">2022</a></strong></strong> | <strong><a href=\"https://make.wordpress.org/core/handbook/references/keeping-up-with-gutenberg-index/gutenberg-index-2023\">2023</a></strong> | <a href=\"https://make.wordpress.org/core/handbook/references/keeping-up-with-gutenberg-index/gutenberg-index-2024/\"><strong>2024</strong></a></p></div></div></div></div></div><div class=\"ng-block-hs ng-block-hs-2\" height=\"0\" style=\"width: 0px;\"></div></div><div><div class=\"ng-block-vs ng-block-vs-2\" colspan=\"3\" height=\"0\" style=\"height: 0px;\"></div></div></div></div>\n\n\n<h2 class=\"wp-block-heading\" id=\"3-building-themes-for-fse-and-word-press\">Building Blocks and Tools for the Block editor.</h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Casey Burridge</strong> introduced <strong><a href=\"https://www.gravitykit.com/introducing-block-mcp/\">Block MCP, GravityKit&#8217;s open-source WordPress MCP server</a>. </strong>The problem it solves is familiar: existing MCPs treat a post as one HTML blob, so AI edits strip block markers and break your layout. Block MCP exposes each block as an addressable unit with a stable ID. Your agent can make surgical edits, batch up to 50 changes atomically, and undo any of them. In their tests across Claude models, only Block MCP worked reliably. </p>\n\n\n<div class=\"ng-block-bc056bcc07bcddf9 wp-block-newsletterglue-container ng-block\" style=\"color: #666666;\" width=\"100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div><div><div class=\"ng-block-vs ng-block-vs-1\" colspan=\"3\" height=\"0\" style=\"height: 0px;\"></div></div><div><div class=\"ng-block-hs ng-block-hs-1\" height=\"0\" style=\"width: 0px;\"></div><div align=\"none\" class=\"ng-block-td\" style=\"font-size: 16px; font-family: Helvetica; line-height: 1.6; font-weight: normal; padding-top: 20px; padding-bottom: 20px; padding-left: 0px; padding-right: 0px; text-align: none; color: #666666; background-color: #f8f8f8; border-radius: 8px;\"><div class=\"ng-block-78ae189a8ef2482f wp-block-newsletterglue-text ng-block\" style=\"color: #666666;\" width=\"100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div><div><div align=\"none\" class=\"ng-block-td\" style=\"font-size: 16px; font-family: Helvetica; line-height: 1.6; font-weight: normal; padding-top: 8px; padding-bottom: 10px; padding-left: 20px; padding-right: 20px; text-align: none; color: #666666;\"><p><strong><a href=\"https://gutenbergtimes.com/need-a-zip-from-master/\">Need a plugin .zip from Gutenberg&#8217;s master branch?</a></strong><br />Gutenberg Times provides daily build for testing and review.</p></div></div></div></div>\n\n<div class=\"ng-block-0dce301a5f3ba141 wp-block-newsletterglue-image ng-block size-full is-resized\" width=\"100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div><div><div align=\"center\" class=\"ng-block-td\" style=\"padding-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px;\"><a href=\"https://playground.wordpress.net/?blueprint-url=https://gutenbergtimes.com/wp-content/uploads/2020/11/playnightly.json\"><img alt=\"\" class=\"wp-image-42874 ng-image\" height=\"45\" src=\"https://i0.wp.com/gutenbergtimes.com/wp-content/uploads/2024/02/Screenshot-2025-11-15-at-12.06.44.png?resize=196{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C45&#038;ssl=1\" style=\"border-style: none; border-color: transparent;\" width=\"196\" /></a></div></div></div></div>\n\n<div class=\"ng-block-cb9b1e3380794f4d wp-block-newsletterglue-text ng-block\" style=\"color: #666666;\" width=\"100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div><div><div align=\"none\" class=\"ng-block-td\" style=\"font-size: 16px; font-family: Helvetica; line-height: 1.6; font-weight: normal; padding-top: 8px; padding-bottom: 10px; padding-left: 20px; padding-right: 20px; text-align: none; color: #666666;\"><p>Now also available via <a href=\"https://playground.wordpress.net/?blueprint-url=https://gutenbergtimes.com/wp-content/uploads/2020/11/playnightly.json\">WordPress Playground</a>. There is no need for a test site locally or on a server. Have you been using it? <a href=\"mailto:pauli@gutenbergtimes.com\">Email me </a>with your experience.</p></div></div></div></div></div><div class=\"ng-block-hs ng-block-hs-2\" height=\"0\" style=\"width: 0px;\"></div></div><div><div class=\"ng-block-vs ng-block-vs-2\" colspan=\"3\" height=\"0\" style=\"height: 0px;\"></div></div></div></div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\" />\n\n\n\n<p class=\"has-text-align-center has-small-font-size wp-block-paragraph\"><em>Questions? Suggestions? Ideas? </em><br /><em>Don&#8217;t hesitate to send <a href=\"mailto:pauli@gutenbergtimes.com\">them via email</a> or</em><br /><em> send me a message on WordPress Slack or Twitter @bph</em>.</p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<p class=\"has-text-align-center has-small-font-size wp-block-paragraph\">For questions to be answered on the <a href=\"http://gutenbergtimes.com/podcast\">Gutenberg Changelog</a>, <br />send them to <a href=\"mailto:changelog@gutenbergtimes.com\">changelog@gutenbergtimes.com</a></p>\n\n\n<div class=\"ng-block-e9b2d2d012996d2a wp-block-newsletterglue-separator ng-block\" style=\"color: #666666;\" width=\"100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div><div><div align=\"center\" class=\"ng-block-td\" style=\"padding-top: 20px; padding-bottom: 20px; padding-left: 20px; padding-right: 20px; color: #666666;\"><hr style=\"background-color: transparent; color: transparent; margin: 0; border: 0; border-top: 1px solid #666666; width: 560px; height: 0;\" /></div></div></div></div>\n\n<div class=\"wp-block-newsletterglue-showhide ng-block\" width=\"100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div class=\"ng-block-79032441feb05ed0 wp-block-newsletterglue-text ng-block\" style=\"color: #666666;\" width=\"100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"><div><div><div align=\"none\" class=\"ng-block-td\" style=\"font-size: 14px; font-family: Helvetica; line-height: 0.2; font-weight: normal; padding-top: 8px; padding-bottom: 10px; padding-left: 20px; padding-right: 20px; text-align: none; color: #666666;\"><p><strong>Featured Image: </strong></p></div></div></div></div></div>\n\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\" />\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 05 Jun 2026 23:14:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:43;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:10:\"Matt: WCEU\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"https://ma.tt/?p=152996\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:27:\"https://ma.tt/2026/06/wceu/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:1597:\"<p class=\"wp-block-paragraph\">Cześć wszystkim, Kraków&#8230; I made the call not to fly to Poland for <a href=\"https://europe.wordcamp.org/2026/\">WordCamp Europe</a>. I&#8217;m very sorry for the last-minute notice; I was really hoping to make it. I’m okay, but I <a href=\"https://waitbutwhy.com/2015/12/the-tail-end.html\">want to stay close</a> to loved ones going through difficult times.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Seeing the pictures from <a href=\"https://europe.wordcamp.org/2026/community/contributor-day/\">Contributor Day</a> warms my heart.</p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img alt=\"\" class=\"wp-image-152999\" height=\"378\" src=\"https://i0.wp.com/ma.tt/files/2026/06/wceu-2026-contrib-day-1024x640.jpg?resize=604{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2C378&#038;quality=89&#038;ssl=1\" width=\"604\" /></figure>\n\n\n\n<p class=\"wp-block-paragraph\"><br />Bardzo za Wami tęsknię. I miss you dearly.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The <a href=\"https://wordpress.org/news/2026/06/pts/\">Protect The Shire post on W.org</a> contains what I planned to talk about, and <a href=\"https://profiles.wordpress.org/4thhubbard/\">Mary Hubbard</a> and <a href=\"https://profiles.wordpress.org/matveb/\">Matías Ventura</a> will lead the Q&amp;A keynote at the end.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;ll watch all the sessions so if any WordCamp speakers would like feedback on their talk, <a href=\"https://docs.google.com/forms/d/e/1FAIpQLSdIeEJ8L2tGDVeJVZQrD5LMGMdtJLXP9RYKOB4DhbXIOADMyQ/viewform\">just fill out this form</a>, and I’ll write something up and message it to you on the .org Slack. </p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 05 Jun 2026 19:07:24 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:44;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:37:\"WordPress.org blog: Protect The Shire\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=20783\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:39:\"https://wordpress.org/news/2026/06/pts/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7893:\"<p class=\"wp-block-paragraph\"><strong>tl;dr:</strong> <em>Temporary 24-hour cooldown period for plugin/theme releases before auto-updates. AI can give defenders an edge. We want to secure all 78K plugins and themes on WordPress.org. </em></p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" />\n\n\n\n<p class=\"wp-block-paragraph\">One of the things we’ve always striven to do as the developers of WordPress is to work harder so you don’t have to; we take technology that’s complex or inaccessible and make it available to everyone, running in as many environments as possible. It’s the Open Source way.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Just last December there was a <a href=\"https://x.com/karpathy/status/2026731645169185220\">step-change in coding ability</a> that rocked many developers, and since April’s <a href=\"https://red.anthropic.com/2026/mythos-preview/\">reveal of Mythos</a>, security activity has kicked into high gear. A few days ago, <a href=\"https://chromereleases.googleblog.com/2026/06/stable-channel-update-for-desktop.html\">Chrome shipped a release with 429 security fixes</a>! The threats and opportunities of these new capabilities inspired us to kick off an initiative we call <strong>Protect The Shire</strong> (hat tip <a href=\"https://www.tolkiensociety.org/discover/biography/\">J. R. R. Tolkien</a>) with the aim of using our best minds and the infrastructure of WordPress.org to make all code in our directories and repositories as secure as possible.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Much of this work was and will remain behind the scenes, and we hope its success is defined mostly by what <em>doesn’t</em> happen. However, while we reckon with our newfound powers, we need to make space for review.</p>\n\n\n\n<h2 class=\"wp-block-heading\">To Update or Not</h2>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress core updates go through multiple people and layers of review before they go out, a process we’ve polished to a high art in the 18 years since we <a href=\"https://wordpress.org/news/2008/12/coltrane/\">introduced one-click upgrades in 2.7 “Coltrane.”</a></p>\n\n\n\n<p class=\"wp-block-paragraph\">Core is solid, and I’m so proud that <a href=\"https://wordpress.org/about/stats/\">over 50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} of all WordPress sites have upgraded to 7.0 within two weeks</a>! That’s the result of an unimaginable amount of work across thousands of hosts, developers, and teams across WordPress.org. We’ve pushed hard to make upgrades happen automagically, and as fast as possible.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We’re in a liminal period now, and I believe 2026 will be a year of tension between two approaches: updating as quickly as possible to stay secure, and holding back on updating to stay secure.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We’ve seen clever and dangerous supply chain attacks across the npm, PyPI, GitHub, and RubyGems ecosystems, and we even had our own mini-version with the <a href=\"https://anchor.host/someone-bought-30-wordpress-plugins-and-planted-a-backdoor-in-all-of-them/\">Essential Plugins debacle</a>, where good plugins were unknowingly sold to a new author who had malicious intent.</p>\n\n\n\n<p class=\"wp-block-paragraph\">How to balance security updates and <em>securing</em> updates?</p>\n\n\n\n<h2 class=\"wp-block-heading\">Mirkwood or the Wild West?</h2>\n\n\n\n<p class=\"wp-block-paragraph\">Everyone knows the fun of WordPress is in its 78k+ plugins and themes. We have a rigorous, human-powered review process for <a href=\"https://make.wordpress.org/themes/handbook/review/\">theme</a> and <a href=\"https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/\">plugin</a> submissions, but once you’re published in the directory, you’re on your own. Our update system currently distributes every plugin and theme release as soon as a developer presses the button. That’s what keeps the directory as robust as WordPress itself. There were over 3,000 commits to the plugin repository yesterday! </p>\n\n\n\n<p class=\"wp-block-paragraph\">For now, each new plugin release will wait up to 24 hours before being distributed through auto-updates. This will give everyone, including a <a href=\"https://wapuu.studio/wapuu/a-gandalf-wapuu-that-is-a-coding-wizard-302912b8/\">new Wapuu</a> we call Gandalf, a chance to review changes.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I expect 24 hours could be reduced to minutes as the process evolves, but we’ll err on the side of caution while AI models are advancing so rapidly.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Our <a href=\"https://make.wordpress.org/plugins/\">plugin review team</a> seems superhuman, but still needs to sleep. But bots don’t, and a depth of review that seemed unimaginable before is now a matter of time and tokens.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The security capabilities of AI are going to make the world weird and take a lot of our focus in the next few months, but there’s a light at the end of the tunnel.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Our Shire Is Special</h2>\n\n\n\n<p class=\"wp-block-paragraph\">There’s no shortage of ways to find, install, and update plugins and themes for WordPress. For those who choose WordPress.org, though, we want to make sure that it feels safe and secure. That means staying strict about some things—like guidelines and Open Source licenses—while also remaining flexible enough to allow solo hackers, community projects, and for-profit commercial plugins and themes to thrive in our ecosystem.</p>\n\n\n\n<p class=\"wp-block-paragraph\">GitHub stars may get the hype, but if you add up all the numbers <a href=\"https://wordpress.org/plugins/\">in our plugin directory</a>, it’s over 400M installs. There are 78k+ extensions, many from solo devs, installed on over a million sites each! Now we need to learn from the best parts of GitHub and make that available to every developer on WordPress.org.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Just because WordPress plugins have a reputation for vulnerabilities is no reason not to aim for the same security and stability we’ve achieved in core. We’ve done the impossible a few times already in <a href=\"https://wordpress.org/book/table-of-contents/\">our journey from a b2/cafelog fork</a> to <a href=\"https://wordpress.org/showcase/\">where we are today</a>. </p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Freedom and security are not zero-sum.</strong> With Open Source, we can show how security comes from transparency, not obscurity. Collaboration over competition. What we accomplish when we come together is nothing short of incredible. Success always attracts bad actors, but we grow stronger through every adversity.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The scale of WordPress can make some challenges seem too big to tackle, but given time, there is no problem that’s insurmountable. I’m reminded of the story behind the title of <a href=\"https://www.amazon.com/Bird-Some-Instructions-Writing-Life/dp/0385480016\">Anne Lamott’s book <em>Bird by Bird</em></a>:</p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Thirty years ago my older brother, who was ten years old at the time, was trying to get a report written on birds that he&#8217;d had three months to write, which was due the next day. We were out at our family cabin in Bolinas, and he was at the kitchen table close to tears, surrounded by binder paper and pencils and unopened books about birds, immobilized by the hugeness of the task ahead. Then my father sat down beside him, put his arm around my brother&#8217;s shoulder, and said, &#8220;Bird by bird, buddy. Just take it bird by bird.”</p>\n</blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">More to come, stay tuned. I wish everyone <a href=\"https://europe.wordcamp.org/2026/\">in Kraków at WordCamp Europe</a> the best and hope to see you soon!</p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 05 Jun 2026 18:51:15 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Matt Mullenweg\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:45;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:80:\"Open Channels FM: Artificial Intelligence” Just a Fancy Way to Say “Fake”?\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2554616\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:77:\"https://openchannels.fm/artificial-intelligence-just-a-fancy-way-to-say-fake/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:128:\"The light side of whether artificial intelligence is genuinely intelligent or merely advanced technology misrepresented as such.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 04 Jun 2026 13:19:13 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:46;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:95:\"Open Channels FM: Open Tabs: Lists Over Grids, AI-Assisted Content &amp;amp; A Global Tech Read\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555279\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:90:\"https://openchannels.fm/open-tabs-lists-over-grids-ai-assisted-content-a-global-tech-read/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:219:\"Bob Dunn launches \"Open Tabs,\" sharing business insights while discussing his new design preferences, the importance of human touch in podcasting, efficient content repurposing with AI, and recommending restofworld.org.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 03 Jun 2026 14:30:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:47;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:97:\"WPTavern: #219 – Austin Ginder on How AI Is Exposing Hidden Threats in WordPress Plugin Updates\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"https://wptavern.com/?post_type=podcast&p=204491\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:111:\"https://wptavern.com/podcast/219-austin-ginder-on-how-ai-is-exposing-hidden-threats-in-wordpress-plugin-updates\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:47921:\"<details>Transcript<div>\n<p class=\"wp-block-paragraph\">[00:00:19] <strong>Nathan Wrigley:</strong> Welcome to the Jukebox podcast from WP Tavern. My name is Nathan Wrigley.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Jukebox is a podcast which is dedicated to all things WordPress, the people, the events, the plugins, the blocks, the themes, and in this case, how AI is exposing hidden threats is WordPress plugin updates.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;d like to subscribe to the podcast, you can do that by searching for WP Tavern in your podcast player of choice, or by going to wptavern.com/feed/podcast, and you can copy that URL into most podcast players.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you have a topic that you&#8217;d like us to feature on the podcast, I&#8217;m keen to hear from you and hopefully get you, or your idea, featured on the show. Head to wptavern.com/contact forward slash jukebox and use the form there.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So on the podcast today we have Austin Ginder. Austin has been involved in the WordPress ecosystem since 2010, and since 2014 has run Anchor Hosting, a business that manages thousands of WordPress websites. While he&#8217;s a developer and automation enthusiast at heart, in recent months Austin has found himself at the forefront of a burgeoning crisis in WordPress, security supply chain attacks targeting plugins.</p>\n\n\n\n<p class=\"wp-block-paragraph\">A chance discovery during a malware cleanup on a client&#8217;s site, propelled Austin into what would become a wider investigation of plugin vulnerabilities. What he uncovered is both alarming and timely. Bad actors aren&#8217;t just hacking sites directly, but are instead infiltrating the supply chain, either by purchasing plugin companies and weaponising them, or by hijacking plugins and pushing out malicious updates. These attacks are subtle, often shifting plugin update servers away from wordpress.org to rogue channels where malware can be distributed, leaving end users in the dark, and their sites at risk.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We trace Austin&#8217;s journey from accidental security investigator to creator of the WP Beacon Project, a resource aimed at tracking, documenting, and alerting the WordPress community to known supply chain attacks.</p>\n\n\n\n<p class=\"wp-block-paragraph\">He shares how AI tools have radically changed what&#8217;s possible in threat detection and forensics, enabling individuals, and hopefully someday, the larger hosting providers to identify patterns and root causes behind widespread infections.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We get into case studies of specific plugins compromised in recent months, the challenges of auditing over 60,000 plugins in the wordpress.org repo, and the complexities of stopping these attacks once malicious code is in the wild. Austin also discusses his hopes for greater collaboration with hosts and security researchers aiming for better automated monitoring and response.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you manage WordPress websites, create plugins, or just care about the future of open source security, this episode is for you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re interested in finding out more, you can find all of the links in the show notes by heading to wptavern.com/podcast, where you&#8217;ll find all the other episodes as well.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And so without further delay, I bring you Austin Ginder.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I am joined on the podcast by Austin Ginder. Hello, Austin.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:40] <strong>Austin Ginder:</strong> Hey, good to meet you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:03:41] <strong>Nathan Wrigley:</strong> Very nice to meet you too. I was put in Austin&#8217;s way by I think Courtney Robertson.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Thank you Courtney for that because, on a different podcast, which I do, we were talking about an item, which is very much in the news at the moment. It&#8217;s all to do with plugins and security. And whenever I say security, any of the people that I have on the podcast, I feel it&#8217;s pretty important that person gets a chance to stamp their credentials into the podcast about themselves. Because it&#8217;s one of those areas where a little bit of knowledge can go a long way. Tell us about your background, WordPress hosting, security, those kind of things.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:04:16] <strong>Austin Ginder:</strong> Sure. So I&#8217;m a developer, first off. I&#8217;ve been running a WordPress hosting service since 2014, and I&#8217;ve been working in the WordPress space since 2010. A long timer. I love automation. WPCLI commands, bash scripts. I&#8217;m in the weeds on a technical basis.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But in terms of security, I wouldn&#8217;t call myself a security expert, which is ironic for this conversation because of some of the things I&#8217;ve been finding over the last month or so. And it&#8217;s all thanks to AI. AI has been my friend. It&#8217;s just right place, right time, getting lucky and also just a mix of everything is changing right now in the world.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:04:56] <strong>Nathan Wrigley:</strong> Yeah. Thank you for that. So as you&#8217;re about to hear, we&#8217;re not gonna be talking at from the perspective of Austin demonstrates how to fix a particular challenge in WordPress. It&#8217;s much more of a general thing, and an alert really. It&#8217;s a bit of a call to action about a problem which has been systemic in the WordPress ecosystem, well, forever really, since I guess, plugins came along.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And this is all about really change of ownership of plugins, and I could do a job of trying to describe the scenario here, but do you want to just run through what you&#8217;ve discovered in the last few weeks, and the three or four incidents that you&#8217;ve uncovered and what they mean and how they&#8217;ve come about?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:05:37] <strong>Austin Ginder:</strong> Yeah. So in particular, we&#8217;re talking about supply chain attacks, and a supply chain attack is a different kind of attack. It&#8217;s not a direct, my site got infected with malware or something like that. It runs a little bit more deeper. It&#8217;s a scenario where either it can happen a couple different ways.</p>\n\n\n\n<p class=\"wp-block-paragraph\">A hacker might get control over the plugin repo itself, maybe a credential breach, where they sign in and they are acting as the author, and they push out bad code. As a user, you just update your plugin and you don&#8217;t realise you&#8217;re updating to something that&#8217;s harmful for your website.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So that&#8217;s one scenario. The other scenario which is crazy to me, but like hackers literally buying companies and then weaponizing the plugins themselves and distributing them through the official channels. So that&#8217;s the big story that I was covering this last month. That is just what possesses someone to spend six figures to buy a suite of plugins and then weaponize them and try to get away with it? No, that can&#8217;t happen.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:06:42] <strong>Nathan Wrigley:</strong> Except, it does. So let me just reiterate what&#8217;s going on there. So if you&#8217;ve been to the wordpress.org repository, or indeed you&#8217;ve downloaded plugins from third party vendors, maybe a pro version of a plugin or what have you. Usually there is some aspect of the WordPress admin UI, which enables that plugin to be updated by clicking a link or perhaps automated, the update will happen.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Increasingly, I think people are being, have been encouraged to click enable automatic updates. So it just ticks over in the background. Perhaps while you&#8217;re asleep, it gets updated to the latest version. This in a universe occupied only by honest people would be absolutely fine. We&#8217;d have no problem that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">However, the scenario that you are describing is that kind of invisibly it&#8217;s entirely possible for somebody to sell their plugin or indeed maybe even have their plugin repo hijacked in some way. But let&#8217;s go with the sell their plugin scenario, because that&#8217;s the easiest one to get a hold of. Sell it to somebody.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Obviously, I would imagine in most cases, assuming that person is a good actor, is just going to carry on doing the nice things that the plugin does, updating the code, and doing security updates and what have you. However, there is zero guardrail to stop them putting whatever they want into the plugin.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And so overnight, a plugin which has been working for a decade or more, doing its job, now suddenly is masquerading. And it may be that the functionality of the plugin is also still there. It&#8217;s not like suddenly the plugin just stops working, or it&#8217;s really obvious what&#8217;s going on. It may be that just a few lines of code have been adapted, modified, there&#8217;s some backdoor smuggled in to the plugin. An end user would never know that this was going on. Have I summed that up? Is that about where we&#8217;re at?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:08:35] <strong>Austin Ginder:</strong> Yeah, these are bad actors trying to hide themselves. They&#8217;re sneaky. They don&#8217;t do things that are obvious. Like they&#8217;re not just uploading malware to WordPress plugin repo. What they&#8217;ll do instead is they might slip a third party updater, which is against the guidelines, clearly. But they can do it a little bit more sneaky.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So if they can get a third party uploader put into their plugin, then they can actually hijack the plugin. Meaning you download a plugin from wordpress.org, and you run auto updates, and it updates not from the wordpress.org version to the newest wordpress.org version. It offloads to their own compromised update channel.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And then once it&#8217;s on the update channel, wordpress.org has zero visibility, and you&#8217;re just running a hijacked plugin and you don&#8217;t even know it. Unless you go in and you run a verify command, from the command line or, you&#8217;re scanning for things like this. And then after they get the plugin hijacked, that&#8217;s when they compromise your site.</p>\n\n\n\n<p class=\"wp-block-paragraph\">They could do SEO spam attacks, or display ads, or poison the search results from Google&#8217;s perspective. Many different things that they do to try to recoup their money in the investment.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:09:50] <strong>Nathan Wrigley:</strong> So let me just run that by you again. So just to make sure I&#8217;ve understood. So in this scenario, the plugin, it is like a one time thing in a way, but we&#8217;ll explore that as well in a moment. The plugin is acquired by somebody else and potentially some of the behaviour that you&#8217;ve seen is that the only part of the plugin that they modify is the location of the update server.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Now, typically that would&#8217;ve been over at wordpress.org, and every time you click the update button, you are receiving the repo version of it. However, this updated version will then offload to a third party server somewhere. And at that moment, wordpress.org loses all visibility of what&#8217;s going on. As far as they&#8217;re aware nothing has happened.</p>\n\n\n\n<p class=\"wp-block-paragraph\">You are now just getting updates from elsewhere. You would never see anything. But obviously whatever payload they wish to put into that plugin is completely invisible to wordpress.org.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Now, I suppose the wordpress.org version, there&#8217;d be a telltale sign that this was happening because there would be new and modified code to indicate, oh, look, there&#8217;s a third party server in play here. But WordPress org has no visibility into what the malicious code being updated onto your website is. Again, is that about where we&#8217;re at?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:11:07] <strong>Austin Ginder:</strong> Yeah. Everything on wordpress.org is open source. Even the platform itself is open source, so you can see the full code, how everything operates there. And in addition to that, all of the plugin activity happens on SVN, which is like the raw pipeline.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So all of the data is there and available to anyone to go in and audit the data, but it&#8217;s, it&#8217;s an after the fact situation. Like after a situation happens, you can go back to the raw data and run a full audit to try to piece together all these missing pieces. And all these missing pieces would&#8217;ve been impossible to correlate together if it wouldn&#8217;t be for AI. Like now we have a superpower where we could just run AI through it all. If we feed it the right points, we can start to make the correlation after the fact as to what happened.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:11:59] <strong>Nathan Wrigley:</strong> Okay, so essentially what you are saying, I think, is that the work of checking this, prior to AI, let&#8217;s go with that, it was just too humanly intensive. There were 60 plus thousand plugins on the wordpress.org repo, going back and having a human inspect every single update, every single file, every line of code is, as you can imagine, a completely unrealistic process.</p>\n\n\n\n<p class=\"wp-block-paragraph\">However, now AI really its superpower is its capacity to take a giant corpus of data, and then do things with that data. It&#8217;s almost like it can capture the entirety of the internet in one hit. And so that&#8217;s what&#8217;s enabled you to weed out this sort of stuff.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I have to ask from a personal point of view, why are you doing this? And I don&#8217;t mean that the way it sounds, because obviously it&#8217;s philanthropic. I&#8217;m extremely grateful that you are doing this. But how did you end up taking this on as a, I don&#8217;t know, a hobby, a pet project, a sideline?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:12:59] <strong>Austin Ginder:</strong> This is completely accidental, right? The backstory is in February, I saw a huge shift at my own customers websites, where sites that have been secure for years and years, all of a sudden was getting malware. The short version of it is while I was doing some malware cleanup for a customer, I uncovered one of these big back doors, and it was just like going through the process.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So malware cleanup before AI was always a little bit of a dicey thing. You can check all the boxes, make sure everything looks good, but you never had the certainty that it was all a hundred percent clean. Did I miss something? But with AI it&#8217;s very easy to do a thorough, in depth, investigation.</p>\n\n\n\n<p class=\"wp-block-paragraph\">How did this happen? Where did it come from? Is my site actually clean now? It just crawls over all the files with Claude Code and other tools, and it gives you a nice report. When I had some recent, my own customers that got malware, and I ran through the forensics level style that AI can give, it uncovered some things that made me question, maybe I should look upstream, maybe I should look at wordpress.org. And I started to feed that into the AI and sure enough, there was something there and it was story worthy.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:14:13] <strong>Nathan Wrigley:</strong> So presumably that was then bound to a particular plugin. So your customer, something went wrong, you pointed the AI at it, it gave you a report, pointed you to the wordpress.org repo. And that in theory could have been the end of that. You clean up your client website and move on.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But it sounds like this became much more than that, because over the intervening days and weeks, you found that this was alarmingly, not just a one-off. This was a pattern. And I think the last time I was reading about this, I think you&#8217;d found four. I don&#8217;t know if four plugins is now up into some other figure or not, but certainly at the time I was reading you&#8217;d found four plugins with exactly the same strategy. I don&#8217;t know if they were from the same vendor or what have you. Just tell us where you&#8217;re at in the middle of May 2026.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:15:07] <strong>Austin Ginder:</strong> Yeah, so I&#8217;ve now published four more or less in depth research. Now, I wasn&#8217;t the sole finder of all these, but I was the one who actually pointed the AI at it, and got to the root of it. And it uncovered some other things that previous folks hadn&#8217;t found. So the crazy thing is all four situations are completely different, and that&#8217;s the wild thing.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So the one was, the source was the WordPress Plugin Team. So they saw there was some bad activity happening, with a set of the Essential Plugins package. So that&#8217;s like a 30 plus plugins. So they closed down all the plugins. They issued an alert, Hey, your site might be compromised. And they actually put code in the patch of the plugins that would check the wp-config file, was it tampered with by the plugin authors themselves?</p>\n\n\n\n<p class=\"wp-block-paragraph\">So one of my customers saw the notice flagged me. I scanned it, saw it was compromised, and then that&#8217;s when I uncovered how big of a deal it was, the Essential Plugins. It was actually a purchase of a company. That was just one of them.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The other three situations, again it&#8217;s all kind of part, it stems back to me overhauling my security system for my clients. The other one was flagged by a new security feature I was implementing where I check all of my customers JavaScript embeds.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;m basically scanning changes over time, hoping to catch like a credit card skimmer, or something else like that for my own customers. Well one of them came back. Something&#8217;s weird. It was a widget logic plugin that was embedding some weird sports JavaScript code for one of my sites. And I kept digging and digging into it, and sure enough, it was another supply chain attack on that particular plugin.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So, in all these instances, the WordPress Plugin Team has been fantastic. Very responsive and closing down the plugin, and applying patches, and getting the out there. Yeah, it&#8217;s weird. I had no plans to building something like this. I just stumbled upon it and every situation was a different story.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The last one I&#8217;ll share is, I was messing around with this idea that, I wonder if I could use AI to hunt through my own customer&#8217;s plugins to detect plugins that are running different versions of the code base. You might have Jetpack installed with the latest version, but maybe there&#8217;s a variant version Jetpack&#8217;s running. That&#8217;s the core idea, or the core concept.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So I built this tool with AI to scan my own customers, and it found a variant version of the Quick Redirection Plugin installed. I&#8217;m like, what&#8217;s going on here? So I dig into it and I had 12 sites running a version of the plugin that wasn&#8217;t on wordpress.org. So then I threw it through AI. It told me the difference. And sure enough, like you had to keep digging to get actually get to the answer what happened.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But that was a situation where many, the plugin author themselves offloaded most of their customers to a hijacked version. And my own customers years later were running a hijacked version. So I wasn&#8217;t directly searching for this stuff, it just came up, and then I&#8217;m like, after you get three of them, it&#8217;s alright, now I just wanna see if I can find one.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So I built the scanner and while I was scanning the top 2000 WordPress sites, I found one, and it was active. It was active, meaning the plugin, it&#8217;s called Scroll To Top. It was wired in to 20,000 sites, but it wasn&#8217;t active. So a lot of these bad actors, they will take their time, get a plugin that&#8217;s compromised in a lot of people&#8217;s sites, and then when the moment&#8217;s right, pull a trigger. And then at that point they can start to flow in bad content or SEO and actually do the compromise.</p>\n\n\n\n<p class=\"wp-block-paragraph\">The one that I actually found was a compromise scenario, from what I can tell, the bad actor hadn&#8217;t actually pulled the trigger yet. So it was a success story.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:19:13] <strong>Nathan Wrigley:</strong> Yeah, that is really, kind of makes it more alarming in a sense, doesn&#8217;t it? Because once I suppose there&#8217;s an active exploit, and people are beginning to report what&#8217;s going on here? There&#8217;s some strange behaviour on a website, I presume at that point eyeballs will fall on what&#8217;s going on and work will be done.</p>\n\n\n\n<p class=\"wp-block-paragraph\">However, as you&#8217;ve just described maybe months, weeks, possibly years, a plugin can have incredible functionality. It might gain widespread adoption, because it&#8217;s doing this one thing particularly well. Just with this dormant code sitting there waiting for the moment that&#8217;s opportune. Maybe there&#8217;s some scenario in the real world in which it will become a timely thing to be able to deploy that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s really alarming, isn&#8217;t it? Because who knows how many websites are currently sitting there with as yet undiscovered, back doors, or problems that we simply don&#8217;t know about because they haven&#8217;t been triggered? Yeah, that one is really alarming.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Austin, I&#8217;m going to give you a little opportunity because you keep saying my clients, and I don&#8217;t think we painted the context of that. Just tell us a little bit about what you do and how that aligns you to have, have an eyeball on so many websites. I think currently, when you say my clients, I think it&#8217;s true to say that you&#8217;ve got something in the order of 3000 websites that you manage. Now, if you were building those as client websites, that&#8217;s a lot of clients. Just tell us what it is that you do, and that might widen the debate a little bit.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:20:39] <strong>Austin Ginder:</strong> No, I don&#8217;t do consulting work anymore. So back in 2014, I transitioned into web hosting full-time. I run Anchor Hosting, and my business is, it&#8217;s a pretty simple business model. I resell other managed WordPress hosting services, and provide all of the support and maintenance on top of it.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So I primarily use web hosts like Kinsta and Rocket.net. They are larger companies. They have a lot more eyeballs on it. I like to layer as many layers between me and the web host infrastructure as I can, so that I can actually solve what I want to solve. And that&#8217;s the WordPress maintenance part.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So I have a little bit more visibility than some. So that is more unique position than most. And I actually would say if there&#8217;s any takeaway from this conversation, the takeaway is any hosting company out there that has more data than me, they are sitting on a gold mine and they don&#8217;t know it.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Because any site that gets malware, that is the gold. If you can point AI at every malware situation or attack, you can sometimes back channel it to figure out where it actually happened, and start to paint a bigger picture. I would love to get my hands on like a web host that has millions of sites and run some scans, because that&#8217;s how you&#8217;re going to discover it, weed it out.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:21:59] <strong>Nathan Wrigley:</strong> And there&#8217;s maybe patterns going on. I don&#8217;t suppose every hacker of WordPress plugins is some kind of evil genius. They might just be, I think what&#8217;s often called script kiddies. The idea being that they are taking templates and copying and pasting these ideas far and wide.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And therefore I suppose patterns would emerge and maybe as you said, some of these larger hosts would be able to spot that pattern, and get out in front of these different problems which have, as yet, been undetected.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Okay, so you&#8217;ve then taken an additional step. You&#8217;ve got yourself a URL, wpbeacon.io. Dear listener, as is always the case, anything that we mention today, so the links to the articles which Austin has written, I will put those in the show notes, but also I&#8217;ll link to wpbeacon.io. Just tell us a little bit about that and that, how that&#8217;s helping the community.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:22:52] <strong>Austin Ginder:</strong> So WP Beacon was again, an idea I threw together last month. Not a whole lot of planning. But it was just like, okay, I&#8217;ve got three of these now. These are basically in depth investigations. Where do you put it? Because this is different than a typical vulnerability database. Like a vulnerability database is really good about endeavour to find bad code.</p>\n\n\n\n<p class=\"wp-block-paragraph\">This is not bad code, this is bad actors. They&#8217;re two completely different problems. So I built WP Beacon as like my place to put all these findings. And the idea is actually have it be a legitimate feed for other folks, like another metric or another vulnerability database, but for supply chain attacks in particular.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:23:39] <strong>Nathan Wrigley:</strong> And so I suppose the idea being that people who are, I mean obviously if you&#8217;ve got one WordPress website, it&#8217;s fairly unlikely that you&#8217;ll come across WP Beacon, because you&#8217;re not in the business of being in the community or what have you. But if you are somebody that&#8217;s, I don&#8217;t know, managing multiple clients, half a dozen or what have you&#8217;re in the WordPress space, this is the kind of thing you might want to know about.</p>\n\n\n\n<p class=\"wp-block-paragraph\">I suppose you are then hoping to be some sort of gatekeeper of knowledge around whether a supply chain attack has occurred. So let&#8217;s say for example, I&#8217;m considering putting a new plugin in. I find something on the wordpress.org repo, and it looks fine. Everything about it is screaming, yes, install me. I would go over to WP Beacon. I see that you&#8217;ve got a search on the homepage. There&#8217;s a list of the number of installations that have been covered, authors, tracked plugins that are being watched and what have you. I would be able to, in some way, interact with that website and gain an understanding of, yep, we&#8217;ve got nothing on them. Everything looks fine, or no, hold on, have a second thought. This thing happened last month. Is that again? Is that kind of what&#8217;s going on there?</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:24:45] <strong>Austin Ginder:</strong> I think end users might find value in it, but I think the better target audience is, this is missing security research that security people don&#8217;t have. I see it as that. It&#8217;s like when I do a report and I put it up on WP Beacon, those identifiers of these bad actors can then be, action can be taken on that by real legitimate security people.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So I have a friend, his name&#8217;s Sal. He used to work at Kinsta. So when I was dealing with one of these cleanups, I was messaging him privately. I&#8217;m like, hey, Sal, look what I found. And he is oh, gimme a second. I&#8217;m going take their compromise server offline. I&#8217;m like, what do you mean? So he whips it out and he gets their domain suspended, website taken offline. And this is like the crucial gap, right?</p>\n\n\n\n<p class=\"wp-block-paragraph\">The research person wants to make people&#8217;s site safe. So if you&#8217;re out there and you&#8217;ve got a hijacked plugin installed and you don&#8217;t know about it, you need a research person, and a security person, to take care of the issue for you. And that is like taking down their infrastructure, taking down the bad actors infrastructure.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:25:51] <strong>Nathan Wrigley:</strong> Oh, that is interesting, yeah.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:25:53] <strong>Austin Ginder:</strong> My goal of WP Beacon is just like, this stuff needs to be more visible. We need to be drafting and documenting this is how the supply chain attack happened in this case. And here is all of the identifiers for the security firms to go for, and take down their infrastructure. To give some sort of incentive that like this kind of behaviour isn&#8217;t going to be tolerated or a signal to the bad actors like, we&#8217;re coming for you. We&#8217;re going to find you, we&#8217;re going to weed you out.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:26:21] <strong>Nathan Wrigley:</strong> Yeah, so that&#8217;s interesting. So connections with hosting companies would certainly be beneficial, wouldn&#8217;t it? Because let&#8217;s say a bunch of hosting companies are pointing their staff at the WP Beacon data, then you could probably satisfy, I don&#8217;t know, 60, 70, 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} of WordPress instal by communicating with the bigger hosts. Because I imagine that&#8217;s where the majority of WordPress websites occur. I presume another angle would be the .org repo itself. The team over there, the Plugin Review Team and the Security Team and what have you.</p>\n\n\n\n<p class=\"wp-block-paragraph\">One ray of light, I suppose is that if you fix this, then you have fixed it. Whereas a lot of security problems keep coming back. Well, no, that&#8217;s not entirely true, is it? Having said all of that, I was fairly confidently thinking if you can, if you can get the plugin turned off so that it can&#8217;t be installed anymore, that&#8217;s one thing. If you can switch off the supply chain server, that&#8217;s another thing. But there&#8217;s going to be loads of different scenarios. It might be that they don&#8217;t have a supply chain server. It might be that they&#8217;re just defacing your website. And how do we disable that that particular functionality and the plugin?</p>\n\n\n\n<p class=\"wp-block-paragraph\">I believe that wordpress.org has in rare situations deployed the, we will overwrite your plugin. I don&#8217;t know how to describe that, but I have a memory that in the past, something so catastrophic had happened inside of a wordpress.org repo, that there is the capacity for WordPress to say, okay, we&#8217;re taking command here, and we&#8217;re going to rewrite your plugins. I don&#8217;t think that&#8217;s very common, but I think that is something that can be done.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:27:59] <strong>Austin Ginder:</strong> In these situations, that&#8217;s exactly what they did. They reverted a patch, closed down the repos, and their patch is what stands.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:28:08] <strong>Nathan Wrigley:</strong> Right.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:28:09] <strong>Austin Ginder:</strong> So I think a lot of what my, what I&#8217;m trying to do is complimentary to what everyone else is doing. And I think it&#8217;s a little bit more, it&#8217;s an unexplored area, what WP Beacon is exploring. We have all this data, let&#8217;s see what we can get out of it.</p>\n\n\n\n<p class=\"wp-block-paragraph\">But I do share your optimism, and also I would love this to just be a solved problem, and six months later we shut down WP Beacon, like it&#8217;s not even needed. But that&#8217;s just not how the world works, right? What I do hope will come from this is the bad actors that have been operating for years, 10 plus years, we make it harder for them to operate. I think that would be a more realistic success story of this project.</p>\n\n\n\n<p class=\"wp-block-paragraph\">One of the bigger findings I found this past week, in the last few days, is this bad operator he&#8217;s been operating for the last 13 years. And what happens is his accounts get shut down, his plugins get shut down, and he just tries again. He opens up new accounts, new plugins, and he just keeps trying. We&#8217;ve got to make it a little bit harder for them.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:29:09] <strong>Nathan Wrigley:</strong> And also what&#8217;s really interesting there is that this is not, for you at least anyway, this doesn&#8217;t feel like a finished story. This kind of feels like, for you, now that you&#8217;ve put yourself in this seat, if you like, it feels each week possibly something new will be coming along, something that you&#8217;ve explored? Is that the case? I would like for you to say no at this point, no, there&#8217;s nothing new happening, but I the feeling that there&#8217;s quite a lot that you are uncovering on a daily, weekly, monthly basis.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:29:37] <strong>Austin Ginder:</strong> I do think it&#8217;s going to be harder and harder to find interesting things based on the raw data, using my technique of just going through and auditing things? That&#8217;s a good thing, right? If it&#8217;s harder to uncover these problems, that&#8217;s a positive indication that something&#8217;s happening.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So I think I&#8217;ve been extremely lucky by reverse engineering a problem. Like, how does the malware get here? Oh, okay. So then figuring out that there&#8217;s a bigger issue at hand. And I also think it&#8217;s one of those scenarios that we all think people are searching through the data, but they aren&#8217;t. I&#8217;ve got a $200 month Claude Code subscription, and I can search through the data with that. It&#8217;s actually feasible for individuals to start auditing the data and to get more eyeballs on this in a way that would never been possible before.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Yeah, I would encourage people to think bigger. If you&#8217;re an individual, you can take your site, download a backup and run it through Claude Code and do a file by file audit. It might take a few, Claude doesn&#8217;t like to do this, but it might take a few wranglings. No, look every line of code and tell me what you see. Do you see vulnerabilities? Do you see malware? Do you see any harmful things there? And an individual can do this, and they can get a very high level detailed report unique for their site.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:30:55] <strong>Nathan Wrigley:</strong> That&#8217;s interesting advice. Maybe in the future, some of the pain that you&#8217;ve been through with Claude trying to get it to behave in the way that you expect, maybe that be interesting data to put out? What are the prompts which you&#8217;ve seen that work and so on?</p>\n\n\n\n<p class=\"wp-block-paragraph\">One thing which dawns on me, and I don&#8217;t really have the answer to this, because the wordpress.org repo, for good reason, has been wide open. What I mean by that is, lots of people can submit code. You don&#8217;t necessarily have to have a certain type of credential, or be a certain type of business and so on.</p>\n\n\n\n<p class=\"wp-block-paragraph\">However, if you look out there in the broader tech landscape, things like, I don&#8217;t know, the Mac App Store or the iOS App Store or Google&#8217;s Play Store. I wonder what their approach is to firstly the onboarding of new plugin developers. But then what the inspection is for updates. When code comes through and it&#8217;s purporting to make a minor change to a particular app on your phone, what is being done there?</p>\n\n\n\n<p class=\"wp-block-paragraph\">And I&#8217;m guessing that in the WordPress space, the fact that it&#8217;s run often by volunteers means that those kind of things are just going to be different. And perhaps those things need to be looked at. There needs to be potentially some more friction that&#8217;s added, or some more steps. And I know that a lot of work has been done by the Plugin Review Team to automate as much of that as possible, and to put some steps in place to make it so that those submissions get inspected in a more timely way. But I don&#8217;t have an answer. I&#8217;m certainly no expert. But it would be curious to see if there&#8217;s any lessons to be learned from the broader tech community.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:32:30] <strong>Austin Ginder:</strong> Obviously the openness of WordPress is its power. App Store versus Android, right, kind of comparison? We&#8217;re more open source. You could just do what you want. There&#8217;s pros and cons, right? So how do we make what we have more safe? And I think the answer to that is everything needs a hundred percent code audited.</p>\n\n\n\n<p class=\"wp-block-paragraph\">How do we get there as quick as possible? That&#8217;s a token question. Like, how many tokens can we spend to audit everything? I have fairly good coverage now for my own customer base. What I do is whatever leftover usage I have, I&#8217;m auditing all of my plugins. And I do it in a way that&#8217;s efficient, meaning I only audit this one plugin version once. That gets assigned to a hash, a unique hash. Then I know, oh, okay, so all of my sites using that same variant are covered.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So a hundred percent code coverage is what we need to do now. And then long term, also in concurrently, we need to start auditing any changes that come over the wire. It&#8217;s a lot, right? Like wordpress.org is very popular. There&#8217;s a lot of code, but I do think it&#8217;s in a realm of realistic. If you are able to shave out a lot of the noise, we don&#8217;t have to audit everything. We don&#8217;t have to see every CSS file you&#8217;re changing, or image you&#8217;re changing. But we do have to look over every PHP line, every JavaScript line, that there&#8217;s nothing harmful in there. And then eventually we&#8217;ll start to catch things.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And I don&#8217;t think it&#8217;s necessarily a one off thing. We don&#8217;t have to wait around for Automattic to come up with a solution. The data is out there. Anyone with a laptop and a subscription could just create a mirror and see, what changed over the last, day, and then start auditing that. I think people think it&#8217;s too impossible.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:34:18] <strong>Nathan Wrigley:</strong> It feels like a large cliff that you&#8217;re staring at, at the beginning of this. And certainly in the past before AI, that cliff was, I imagine, more or less impenetrable But now the way that you&#8217;ve described, perhaps AI can be co-opted to do a lot of this work for us?</p>\n\n\n\n<p class=\"wp-block-paragraph\">I wonder what you&#8217;ve got, if you&#8217;ve got any thoughts on the sort of permissions system. So I know that other, let&#8217;s say CMSs and certainly devices like Android devices and iOS devices, they come with permissions based systems. So for example, this code, it&#8217;s allowed access to the root file structure. Or it&#8217;s allowed access to the camera, or whatever it may be.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And I know that there&#8217;s been debate in the WordPress ecosystem recently about whether something like that would be a good idea. At the moment, plugins, all bets are off. If you put a plugin in, it&#8217;s more or less got access to anything on your WordPress website.</p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s an absolute strength of WordPress because it enables anybody to do anything. But I suppose given that it can enable any anybody to do anything, it also prevents a very large threat surface as well. I don&#8217;t really have the answer to that. I just think that&#8217;s a curious thing to raise and see if you&#8217;ve got any thoughts.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:35:29] <strong>Austin Ginder:</strong> I guess my initial thought is I don&#8217;t necessarily want my WordPress site to feel like my laptop, where I&#8217;m constantly clicking things.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:35:35] <strong>Nathan Wrigley:</strong> Yeah. Grant permission for this.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:35:38] <strong>Austin Ginder:</strong> I don&#8217;t know what the solution is either. I think some of those ideas are great when you&#8217;re thinking about making something from scratch, but they are not as relevant when you&#8217;ve already have an existing ecosystem. Like you can&#8217;t, I would think it&#8217;d be very hard to bring some of those concepts into WordPress at this point. We&#8217;re already past that.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:35:59] <strong>Nathan Wrigley:</strong> That ship has definitely sailed.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:36:00] <strong>Austin Ginder:</strong> I want to be in the Wild West. I want to be able to code and do what I want to do. And especially with AI. If I got an idea, I just want AI to go to town, write me up the plugin to my spec, and not have to deal with some of those extra safeguards.</p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;d be great if we could find some way to make things more secure from an architectural standpoint, but that&#8217;s an architecture problem probably best suited for a new project.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:36:22] <strong>Nathan Wrigley:</strong> The truth is that this will never, ever be solved. I mean security problems online. There will be a no point in the future at which everything is always safe, because humans are ingenious, and there are really credible, credible is the wrong word. There are ways to make money, or to make it worthwhile for the bad actors to be doing the bad things. And so long as those incentives exist, there will be people trying to hijack websites, undermine the security of your computer or phone or whatever it may be. But this is certainly an interesting one.</p>\n\n\n\n<p class=\"wp-block-paragraph\">And it&#8217;s such a shame because with the benefit of hindsight, this was so obvious, and yet it hasn&#8217;t been a news story. Maybe it has in the past, I&#8217;ve certainly not come across it. But this whole supply chain thing is fairly new to me, and fairly alarming in the simplicity of deployment.</p>\n\n\n\n<p class=\"wp-block-paragraph\">You literally purchase, or somehow get hold of, a popular plugin, not necessarily even a popular plugin, a plugin. And then instantaneously every one of those websites is up for grabs in whichever way you would like to grab it. Definitely something that the WordPress community&#8217;s going to have to wrangle with.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Okay. I think we&#8217;ve hit the sweet spot in terms of time Austin. If it&#8217;s all right with you, we will wrap it up there. However, before we go, do you just want to drop a few little bits about where people could contact you? I am more or less certain that somebody listening to this podcast will have thoughts for you about getting in touch, helping out, or what have you. So tell us where you can be found.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:37:55] <strong>Austin Ginder:</strong> You can find me just by searching for my name, Austin Ginder. There&#8217;s not many Ginders. I&#8217;m on X, that&#8217;s my main feed. And you can also read along on anchor.host. I do blog posts there pretty regularly.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:38:09] <strong>Nathan Wrigley:</strong> Okay. In which case I will just point everybody to the wptavern.com website. If you go and use the search feature, search for Austin Ginder. Austin, spelled in the usual way. Ginder, G-I-N-D-E-R. You&#8217;ll find the episode and anything that has been mentioned, any links or what have you, we will link to there.</p>\n\n\n\n<p class=\"wp-block-paragraph\">So thank you for chatting to me today about what I wish didn&#8217;t exist, but it does exist. Austin, thank you so much.</p>\n\n\n\n<p class=\"wp-block-paragraph\">[00:38:34] <strong>Austin Ginder:</strong> Thank you. This was a pleasure.</p>\n</div></details>\n\n\n\n<p class=\"wp-block-paragraph\">On the podcast today we have <a href=\"https://x.com/austinginder\">Austin Ginder</a>.</p>\n\n\n\n<p class=\"wp-block-paragraph\">Austin has been involved in the WordPress ecosystem since 2010, and since 2014 has run Anchor Hosting, a business that manages thousands of WordPress websites. While he’s a developer and automation enthusiast at heart, in recent months Austin has found himself at the forefront of a burgeoning crisis in WordPress security, supply chain attacks targeting plugins.</p>\n\n\n\n<p class=\"wp-block-paragraph\">A chance discovery during a malware cleanup on a client’s site propelled Austin into what would become a wider investigation of plugin vulnerabilities. What he uncovered is both alarming and timely, bad actors aren’t just hacking sites directly, but are instead infiltrating the supply chain, either by purchasing plugin companies and weaponising them, or by hijacking plugins and pushing out malicious updates. These attacks are subtle, often shifting plugin update servers away from WordPress.org to rogue channels where malware can be quietly distributed, leaving end users in the dark and their sites at risk.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We trace Austin’s journey from accidental security investigator to creator of the WP Beacon project, a resource aimed at tracking, documenting, and alerting the WordPress community to known supply chain attacks. He shares how AI tools have radically changed what’s possible in threat detection and forensics, enabling individuals, and hopefully, someday, the larger hosting providers, to identify patterns and root causes behind widespread infections.</p>\n\n\n\n<p class=\"wp-block-paragraph\">We get into case studies of specific plugins compromised in recent months, the challenges of auditing over 60,000 plugins on the WordPress.org repo, and the complexities of stopping these attacks once malicious code is in the wild. Austin also discusses his hopes for greater collaboration with hosts and security researchers, aiming for better automated monitoring and response.</p>\n\n\n\n<p class=\"wp-block-paragraph\">If you manage WordPress websites, create plugins, or just care about the future of open source security, this episode is for you.</p>\n\n\n\n<h2 class=\"wp-block-heading\">Useful links</h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://wordpress.org/plugins/\"> wordpress.org plugin repository</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://claude.com/product/claude-code\">Claude Code</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://make.wordpress.org/plugins/handbook/the-team/\">WordPress Plugin Review Team Handbook</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://anchor.host\">Anchor Hosting</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://wpbeacon.io\">WP Beacon website</a></p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https://x.com/austinginder\">Austin on X</a></p>\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 03 Jun 2026 14:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Nathan Wrigley\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:48;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:112:\"Open Channels FM: BackTalk on Decentralized Interoperability, Data Sovereignty, and the Power of Local Community\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2555258\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:117:\"https://openchannels.fm/backtalk-on-decentralized-interoperability-data-sovereignty-and-the-power-of-local-community/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:185:\"The challenges of decentralized networks, data sovereignty complexities in hosting, and the importance of local connections within the tech community to foster collaboration and growth.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 03 Jun 2026 10:13:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:49;a:6:{s:4:\"data\";s:21:\"\n	\n	\n	\n	\n	\n	\n	\n	\n	\n	\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:84:\"Open Channels FM: How to Make Your Case Studies Stand Out: The Power of Storytelling\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:34:\"https://openchannels.fm/?p=2554372\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:90:\"https://openchannels.fm/how-to-make-your-case-studies-stand-out-the-power-of-storytelling/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:204:\"Effective case studies focus on storytelling, positioning the customer as the hero. They highlight challenges, solutions, and outcomes, blending engaging narratives with measurable results to build trust.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 02 Jun 2026 12:42:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Bob Dunn\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}}}}}}}}}}s:4:\"type\";i:128;s:7:\"headers\";a:9:{s:6:\"server\";s:5:\"nginx\";s:4:\"date\";s:29:\"Tue, 07 Jul 2026 00:06:35 GMT\";s:12:\"content-type\";s:8:\"text/xml\";s:13:\"last-modified\";s:29:\"Mon, 06 Jul 2026 23:45:30 GMT\";s:4:\"vary\";s:15:\"Accept-Encoding\";s:15:\"x-frame-options\";s:10:\"SAMEORIGIN\";s:16:\"content-encoding\";s:4:\"gzip\";s:7:\"alt-svc\";s:5:\"clear\";s:4:\"x-nc\";s:9:\"HIT dca 2\";}s:5:\"build\";i:1760654736;s:21:\"cache_expiration_time\";i:1783425996;s:23:\"__cache_expiration_time\";i:1783425996;}', 'off');
INSERT INTO `wp_options` VALUES ('999', '_transient_timeout_dash_v2_01e18dead815ce736e3b9cccfbd773a5', '1783425996', 'off');
INSERT INTO `wp_options` VALUES ('1000', '_transient_dash_v2_01e18dead815ce736e3b9cccfbd773a5', '<div class=\"rss-widget\"><ul><li><a class=\'rsswidget\' href=\'https://br.wordpress.org/2026/07/03/o-que-vem-por-ai-para-o-ai-client-no-wp-7-1/\'>O que vem por aí para o AI Client no WP 7.1</a></li><li><a class=\'rsswidget\' href=\'https://br.wordpress.org/2026/06/26/a-comunidade-brasileira-de-wordpress-migrou-para-o-slack-global-make-wordpress/\'>A comunidade brasileira de WordPress migrou para o Slack global (Make WordPress)</a></li></ul></div><div class=\"rss-widget\"><ul><li><a class=\'rsswidget\' href=\'https://ma.tt/2026/07/usa-250/\'>Matt: USA 250</a></li><li><a class=\'rsswidget\' href=\'https://openchannels.fm/open-source-as-foundation-not-final-answer/\'>Open Channels FM: Open Source as Foundation, Not Final Answer</a></li><li><a class=\'rsswidget\' href=\'https://wptavern.com/podcast/223-ivana-cirkovic-on-how-wordpress-credits-bridges-education-and-industry-in-the-wordpress-ecosystem\'>WPTavern: #223 – Ivana Ćirković on How WordPress Credits Bridges Education and Industry in the WordPress Ecosystem</a></li></ul></div>', 'off');
INSERT INTO `wp_options` VALUES ('1099', '_transient_timeout__elementor_10th_bday_lottie_data', '1783393004', 'off');
INSERT INTO `wp_options` VALUES ('1100', '_transient__elementor_10th_bday_lottie_data', 'a:9:{s:6:\"assets\";a:98:{i:0;a:2:{s:2:\"id\";s:1:\"5\";s:6:\"layers\";a:2:{i:0;a:7:{s:3:\"ind\";i:4;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:382;i:1;i:106;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:764;i:1;i:212;}}}i:1;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:0;i:1;i:0;i:2;i:0;i:3;i:0;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}}}}i:1;a:7:{s:3:\"ind\";i:0;s:2:\"ty\";i:4;s:2:\"ks\";a:1:{s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:133.33;i:1;d:133.33;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:1:{i:0;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:13:{i:0;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:4:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:13.32;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-13.05;}i:3;a:2:{i:0;d:-13.32;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;d:13.05;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;d:-13.05;}i:1;a:2:{i:0;d:-13.32;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:13.05;}i:3;a:2:{i:0;d:13.32;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:509.52;i:1;d:85.5;}i:1;a:2:{i:0;d:485.93;i:1;d:62.1;}i:2;a:2:{i:0;d:462.36;i:1;d:85.5;}i:3;a:2:{i:0;d:485.93;i:1;d:108.9;}i:4;a:2:{i:0;d:509.52;i:1;d:85.5;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:-8.01;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-8.01;}i:3;a:2:{i:0;d:7.92;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;d:8.01;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;d:-8.01;}i:1;a:2:{i:0;d:7.92;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:8.01;}i:3;a:2:{i:0;d:-8.01;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:472.34;i:1;d:85.5;}i:1;a:2:{i:0;d:485.93;i:1;d:71.28;}i:2;a:2:{i:0;d:499.43;i:1;d:85.5;}i:3;a:2:{i:0;d:485.93;i:1;d:99.72;}i:4;a:2:{i:0;d:472.34;i:1;d:85.5;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:1;i:1;i:1;i:2;i:1;i:3;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}i:3;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:1;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:4:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:10:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:-13.68;i:1;i:0;}i:2;a:2:{i:0;d:-4.05;i:1;d:6.39;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;d:6.3;i:1;i:0;}i:5;a:2:{i:0;d:0.45;i:1;d:7.38;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;d:0.99;}i:8;a:2:{i:0;d:11.79;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;d:-13.23;}}s:1:\"o\";a:10:{i:0;a:2:{i:0;i:0;i:1;d:13.68;}i:1;a:2:{i:0;d:9.45;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-2.34;i:1;d:3.96;}i:4;a:2:{i:0;d:-7.47;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;d:0.09;i:1;d:-1.44;}i:7;a:2:{i:0;i:0;i:1;d:-14.49;}i:8;a:2:{i:0;d:-13.68;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:10:{i:0;a:2:{i:0;d:410.24;i:1;d:85.5;}i:1;a:2:{i:0;d:433.73;i:1;d:108.9;}i:2;a:2:{i:0;d:454.25;i:1;d:98.46;}i:3;a:2:{i:0;d:446.69;i:1;d:93.06;}i:4;a:2:{i:0;d:433.82;i:1;d:99.9;}i:5;a:2:{i:0;d:419.96;i:1;d:87.66;}i:6;a:2:{i:0;d:455.33;i:1;d:87.66;}i:7;a:2:{i:0;d:455.42;i:1;d:84.42;}i:8;a:2:{i:0;d:433.73;i:1;d:62.1;}i:9;a:2:{i:0;d:410.24;i:1;d:85.5;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:4:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:-1.08;i:1;d:-6.48;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-5.76;i:1;i:0;}}s:1:\"o\";a:4:{i:0;a:2:{i:0;d:5.76;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;d:1.35;i:1;d:-6.66;}i:3;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:4:{i:0;a:2:{i:0;d:433.37;i:1;d:70.47;}i:1;a:2:{i:0;d:445.43;i:1;d:80.46;}i:2;a:2:{i:0;d:420.41;i:1;d:80.46;}i:3;a:2:{i:0;d:433.37;i:1;d:70.47;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:1;i:1;i:1;i:2;i:1;i:3;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}i:3;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:2;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:4:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:10:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:-12.33;i:1;i:0;}i:2;a:2:{i:0;d:-2.52;i:1;d:3.6;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:6.48;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;d:-12.87;}}s:1:\"o\";a:10:{i:0;a:2:{i:0;i:0;i:1;d:12.87;}i:1;a:2:{i:0;d:6.48;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:-2.52;i:1;d:-3.6;}i:8;a:2:{i:0;d:-12.33;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:10:{i:0;a:2:{i:0;d:353.99;i:1;d:85.5;}i:1;a:2:{i:0;d:375.68;i:1;d:108.9;}i:2;a:2:{i:0;d:390.08;i:1;d:101.97;}i:3;a:2:{i:0;d:390.08;i:1;i:108;}i:4;a:2:{i:0;d:399.98;i:1;i:108;}i:5;a:2:{i:0;d:399.98;i:1;d:40.5;}i:6;a:2:{i:0;d:390.08;i:1;d:40.5;}i:7;a:2:{i:0;d:390.08;i:1;d:69.03;}i:8;a:2:{i:0;d:375.68;i:1;d:62.1;}i:9;a:2:{i:0;d:353.99;i:1;d:85.5;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:8.01;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:8.1;}i:3;a:2:{i:0;d:-8.01;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;d:-8.1;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;d:8.1;}i:1;a:2:{i:0;d:-8.01;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-8.1;}i:3;a:2:{i:0;d:8.01;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:390.89;i:1;d:85.5;}i:1;a:2:{i:0;d:377.48;i:1;d:99.9;}i:2;a:2:{i:0;d:364.07;i:1;d:85.5;}i:3;a:2:{i:0;d:377.48;i:1;d:71.1;}i:4;a:2:{i:0;d:390.89;i:1;d:85.5;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:1;i:1;i:1;i:2;i:1;i:3;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}i:3;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:3;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:4:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:3.69;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-3.6;}i:3;a:2:{i:0;d:-3.6;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;d:3.69;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;d:-3.6;}i:1;a:2:{i:0;d:-3.6;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:3.69;}i:3;a:2:{i:0;d:3.69;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:345.54;i:1;d:46.53;}i:1;a:2:{i:0;d:338.97;i:1;d:39.96;}i:2;a:2:{i:0;d:332.31;i:1;d:46.53;}i:3;a:2:{i:0;d:338.97;i:1;d:53.19;}i:4;a:2:{i:0;d:345.54;i:1;d:46.53;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:4:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"o\";a:4:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:4:{i:0;a:2:{i:0;d:334.02;i:1;i:108;}i:1;a:2:{i:0;d:343.92;i:1;i:108;}i:2;a:2:{i:0;d:343.92;i:1;i:63;}i:3;a:2:{i:0;d:334.02;i:1;i:63;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:1;i:1;i:1;i:2;i:1;i:3;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}i:3;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:4;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:7:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"o\";a:7:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:7:{i:0;a:2:{i:0;d:297.96;i:1;i:108;}i:1;a:2:{i:0;d:306.7;i:1;i:108;}i:2;a:2:{i:0;d:327.13;i:1;i:63;}i:3;a:2:{i:0;d:316.05;i:1;i:63;}i:4;a:2:{i:0;d:302.29;i:1;d:94.5;}i:5;a:2:{i:0;d:288.61;i:1;i:63;}i:6;a:2:{i:0;d:277.63;i:1;i:63;}}}}}i:1;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:1;i:1;i:1;i:2;i:1;i:3;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}i:2;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:5;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:4.32;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-4.23;}i:3;a:2:{i:0;d:-4.23;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;d:4.32;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;d:-4.23;}i:1;a:2:{i:0;d:-4.23;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:4.32;}i:3;a:2:{i:0;d:4.32;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:277.38;i:1;d:100.89;}i:1;a:2:{i:0;d:269.55;i:1;d:93.06;}i:2;a:2:{i:0;d:261.8;i:1;d:100.89;}i:3;a:2:{i:0;d:269.55;i:1;d:108.72;}i:4;a:2:{i:0;d:277.38;i:1;d:100.89;}}}}}i:1;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:1;i:1;i:1;i:2;i:1;i:3;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}i:2;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:6;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:10:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-5.67;i:1;i:0;}i:4;a:2:{i:0;d:-1.71;i:1;d:-0.54;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;d:1.26;i:1;i:0;}i:7;a:2:{i:0;d:1.71;i:1;d:-5.13;}i:8;a:2:{i:0;i:0;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"o\";a:10:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:-9;}i:3;a:2:{i:0;d:1.8;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;d:-1.35;i:1;d:-0.27;}i:6;a:2:{i:0;d:-5.13;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;i:0;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:10:{i:0;a:2:{i:0;d:235.14;i:1;i:108;}i:1;a:2:{i:0;d:245.05;i:1;i:108;}i:2;a:2:{i:0;d:245.05;i:1;d:86.04;}i:3;a:2:{i:0;d:255.85;i:1;d:72.27;}i:4;a:2:{i:0;d:260.8;i:1;d:73.08;}i:5;a:2:{i:0;d:260.8;i:1;d:62.91;}i:6;a:2:{i:0;d:256.93;i:1;d:62.55;}i:7;a:2:{i:0;d:245.05;i:1;d:71.01;}i:8;a:2:{i:0;d:245.05;i:1;i:63;}i:9;a:2:{i:0;d:235.14;i:1;i:63;}}}}}i:1;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:1;i:1;i:1;i:2;i:1;i:3;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}i:2;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:7;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:4:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:10:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:-13.68;i:1;i:0;}i:2;a:2:{i:0;d:-4.05;i:1;d:6.39;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;d:6.3;i:1;i:0;}i:5;a:2:{i:0;d:0.45;i:1;d:7.38;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;d:0.99;}i:8;a:2:{i:0;d:11.79;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;d:-13.23;}}s:1:\"o\";a:10:{i:0;a:2:{i:0;i:0;i:1;d:13.68;}i:1;a:2:{i:0;d:9.45;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-2.34;i:1;d:3.96;}i:4;a:2:{i:0;d:-7.47;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;d:0.09;i:1;d:-1.44;}i:7;a:2:{i:0;i:0;i:1;d:-14.49;}i:8;a:2:{i:0;d:-13.68;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:10:{i:0;a:2:{i:0;d:179.79;i:1;d:85.5;}i:1;a:2:{i:0;d:203.28;i:1;d:108.9;}i:2;a:2:{i:0;d:223.8;i:1;d:98.46;}i:3;a:2:{i:0;d:216.24;i:1;d:93.06;}i:4;a:2:{i:0;d:203.37;i:1;d:99.9;}i:5;a:2:{i:0;d:189.51;i:1;d:87.66;}i:6;a:2:{i:0;d:224.88;i:1;d:87.66;}i:7;a:2:{i:0;d:224.97;i:1;d:84.42;}i:8;a:2:{i:0;d:203.28;i:1;d:62.1;}i:9;a:2:{i:0;d:179.79;i:1;d:85.5;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:4:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:-1.08;i:1;d:-6.48;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-5.76;i:1;i:0;}}s:1:\"o\";a:4:{i:0;a:2:{i:0;d:5.76;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;d:1.35;i:1;d:-6.66;}i:3;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:4:{i:0;a:2:{i:0;d:202.92;i:1;d:70.47;}i:1;a:2:{i:0;d:214.98;i:1;d:80.46;}i:2;a:2:{i:0;d:189.96;i:1;d:80.46;}i:3;a:2:{i:0;d:202.92;i:1;d:70.47;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:1;i:1;i:1;i:2;i:1;i:3;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}i:3;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:8;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:4:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:17:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;d:1.89;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;d:5.58;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;i:0;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;i:0;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;d:-8.64;i:1;i:0;}i:16;a:2:{i:0;d:-1.98;i:1;d:0.63;}}s:1:\"o\";a:17:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:-1.44;i:1;d:0.54;}i:2;a:2:{i:0;d:-5.13;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;i:0;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;i:0;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;d:10.17;}i:15;a:2:{i:0;d:3.06;i:1;i:0;}i:16;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:17:{i:0;a:2:{i:0;d:174.16;i:1;d:107.46;}i:1;a:2:{i:0;d:174.16;i:1;d:98.64;}i:2;a:2:{i:0;d:168.85;i:1;d:99.45;}i:3;a:2:{i:0;d:161.29;i:1;d:91.89;}i:4;a:2:{i:0;d:161.29;i:1;d:71.82;}i:5;a:2:{i:0;d:174.16;i:1;d:71.82;}i:6;a:2:{i:0;d:174.16;i:1;i:63;}i:7;a:2:{i:0;d:161.29;i:1;i:63;}i:8;a:2:{i:0;d:161.29;i:1;d:50.49;}i:9;a:2:{i:0;d:151.39;i:1;d:50.49;}i:10;a:2:{i:0;d:151.39;i:1;i:63;}i:11;a:2:{i:0;d:143.47;i:1;i:63;}i:12;a:2:{i:0;d:143.47;i:1;d:71.82;}i:13;a:2:{i:0;d:151.39;i:1;d:71.82;}i:14;a:2:{i:0;d:151.39;i:1;d:93.51;}i:15;a:2:{i:0;d:166.78;i:1;d:108.45;}i:16;a:2:{i:0;d:174.16;i:1;d:107.46;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:17:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;d:1.89;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;d:5.58;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;i:0;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;i:0;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;d:-8.64;i:1;i:0;}i:16;a:2:{i:0;d:-1.98;i:1;d:0.63;}}s:1:\"o\";a:17:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:-1.44;i:1;d:0.54;}i:2;a:2:{i:0;d:-5.13;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;i:0;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;i:0;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;d:10.17;}i:15;a:2:{i:0;d:3.06;i:1;i:0;}i:16;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:17:{i:0;a:2:{i:0;d:140.68;i:1;d:107.46;}i:1;a:2:{i:0;d:140.68;i:1;d:98.64;}i:2;a:2:{i:0;d:135.37;i:1;d:99.45;}i:3;a:2:{i:0;d:127.81;i:1;d:91.89;}i:4;a:2:{i:0;d:127.81;i:1;d:71.82;}i:5;a:2:{i:0;d:138.7;i:1;d:71.82;}i:6;a:2:{i:0;d:138.7;i:1;i:63;}i:7;a:2:{i:0;d:127.81;i:1;i:63;}i:8;a:2:{i:0;d:127.81;i:1;d:50.49;}i:9;a:2:{i:0;d:117.91;i:1;d:50.49;}i:10;a:2:{i:0;d:117.91;i:1;i:63;}i:11;a:2:{i:0;d:108.55;i:1;i:63;}i:12;a:2:{i:0;d:108.55;i:1;d:71.82;}i:13;a:2:{i:0;d:117.91;i:1;d:71.82;}i:14;a:2:{i:0;d:117.91;i:1;d:93.51;}i:15;a:2:{i:0;d:133.3;i:1;d:108.45;}i:16;a:2:{i:0;d:140.68;i:1;d:107.46;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:1;i:1;i:1;i:2;i:1;i:3;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}i:3;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:9;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:4:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:3.69;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-3.6;}i:3;a:2:{i:0;d:-3.6;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;d:3.69;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;d:-3.6;}i:1;a:2:{i:0;d:-3.6;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:3.69;}i:3;a:2:{i:0;d:3.69;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:102.09;i:1;d:46.53;}i:1;a:2:{i:0;d:95.52;i:1;d:39.96;}i:2;a:2:{i:0;d:88.86;i:1;d:46.53;}i:3;a:2:{i:0;d:95.52;i:1;d:53.19;}i:4;a:2:{i:0;d:102.09;i:1;d:46.53;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:4:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"o\";a:4:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:4:{i:0;a:2:{i:0;d:90.57;i:1;i:108;}i:1;a:2:{i:0;d:100.46;i:1;i:108;}i:2;a:2:{i:0;d:100.46;i:1;i:63;}i:3;a:2:{i:0;d:90.57;i:1;i:63;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:1;i:1;i:1;i:2;i:1;i:3;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}i:3;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:10;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:4:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:3.69;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-3.6;}i:3;a:2:{i:0;d:-3.6;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;d:3.69;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;d:-3.6;}i:1;a:2:{i:0;d:-3.6;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:3.69;}i:3;a:2:{i:0;d:3.69;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:78.9;i:1;d:46.53;}i:1;a:2:{i:0;d:72.33;i:1;d:39.96;}i:2;a:2:{i:0;d:65.67;i:1;d:46.53;}i:3;a:2:{i:0;d:72.33;i:1;d:53.19;}i:4;a:2:{i:0;d:78.9;i:1;d:46.53;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:8:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:4.41;i:1;i:0;}i:4;a:2:{i:0;d:0.63;i:1;d:0.09;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;d:-1.53;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;d:10.08;}}s:1:\"o\";a:8:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:5.58;}i:3;a:2:{i:0;d:-0.9;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;d:1.17;i:1;d:0.18;}i:6;a:2:{i:0;d:8.28;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:8:{i:0;a:2:{i:0;d:77.28;i:1;i:63;}i:1;a:2:{i:0;d:67.38;i:1;i:63;}i:2;a:2:{i:0;d:67.38;i:1;d:111.33;}i:3;a:2:{i:0;d:60.36;i:1;d:118.98;}i:4;a:2:{i:0;d:57.93;i:1;d:118.8;}i:5;a:2:{i:0;d:57.93;i:1;d:127.44;}i:6;a:2:{i:0;d:62.16;i:1;d:127.71;}i:7;a:2:{i:0;d:77.28;i:1;d:112.77;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:1;i:1;i:1;i:2;i:1;i:3;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}i:3;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:11;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:3:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:286.5;i:1;d:79.5;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:573;i:1;i:159;}}}i:1;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;d:0.1;i:1;d:0.09;i:2;d:0.11;i:3;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}i:2;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:12;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}}}}}i:1;a:2:{s:2:\"id\";s:1:\"8\";s:6:\"layers\";a:2:{i:0;a:10:{s:3:\"ind\";i:7;s:2:\"ty\";i:0;s:6:\"parent\";i:3;s:2:\"ks\";a:0:{}s:1:\"w\";i:764;s:1:\"h\";i:212;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:1:\"5\";}i:1;a:6:{s:3:\"ind\";i:3;s:2:\"ty\";i:3;s:2:\"ks\";a:2:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:-0.075;i:1;i:0;}}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:18.87;i:1;d:18.87;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}}}i:2;a:2:{s:2:\"id\";s:2:\"64\";s:6:\"layers\";a:52:{i:0;a:8:{s:3:\"ind\";i:16;s:2:\"ty\";i:4;s:6:\"parent\";i:15;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:21:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;d:0.6;i:1;d:-1.2;}i:6;a:2:{i:0;i:1;i:1;d:-1.1;}i:7;a:2:{i:0;d:1.6;i:1;d:-0.7;}i:8;a:2:{i:0;d:2.4;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;i:0;}i:10;a:2:{i:0;d:0.6;i:1;d:0.1;}i:11;a:2:{i:0;d:1.2;i:1;d:0.3;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;d:-0.2;i:1;i:0;}i:15;a:2:{i:0;d:-0.3;i:1;i:0;}i:16;a:2:{i:0;i:0;i:1;i:0;}i:17;a:2:{i:0;d:-0.8;i:1;d:0.3;}i:18;a:2:{i:0;d:-0.5;i:1;d:0.5;}i:19;a:2:{i:0;d:-0.3;i:1;d:0.8;}i:20;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:21:{i:0;a:2:{i:0;d:13.3;i:1;d:76.5;}i:1;a:2:{i:0;d:16.5;i:1;d:68.4;}i:2;a:2:{i:0;d:27.3;i:1;d:31.6;}i:3;a:2:{i:0;d:41.2;i:1;d:31.6;}i:4;a:2:{i:0;d:24.5;i:1;d:79.5;}i:5;a:2:{i:0;i:23;i:1;d:82.9;}i:6;a:2:{i:0;d:20.6;i:1;d:86.4;}i:7;a:2:{i:0;d:16.6;i:1;d:89.1;}i:8;a:2:{i:0;d:10.7;i:1;d:90.1;}i:9;a:2:{i:0;d:10.7;i:1;d:90.1;}i:10;a:2:{i:0;d:7.9;i:1;i:90;}i:11;a:2:{i:0;d:5.3;i:1;d:89.4;}i:12;a:2:{i:0;d:5.3;i:1;d:89.4;}i:13;a:2:{i:0;d:5.3;i:1;d:80.1;}i:14;a:2:{i:0;d:6.2;i:1;d:80.1;}i:15;a:2:{i:0;i:7;i:1;d:80.1;}i:16;a:2:{i:0;i:7;i:1;d:80.1;}i:17;a:2:{i:0;d:10.3;i:1;d:79.7;}i:18;a:2:{i:0;d:12.2;i:1;d:78.4;}i:19;a:2:{i:0;d:13.3;i:1;d:76.5;}i:20;a:2:{i:0;d:13.3;i:1;d:76.5;}}s:1:\"o\";a:21:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;d:-0.4;i:1;d:1.1;}i:5;a:2:{i:0;d:-0.6;i:1;d:1.2;}i:6;a:2:{i:0;i:-1;i:1;d:1.1;}i:7;a:2:{i:0;d:-1.6;i:1;d:0.7;}i:8;a:2:{i:0;i:0;i:1;i:0;}i:9;a:2:{i:0;d:-1.3;i:1;i:0;}i:10;a:2:{i:0;d:-0.6;i:1;d:-0.1;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;d:0.3;i:1;i:0;}i:14;a:2:{i:0;d:0.2;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;d:1.4;i:1;i:0;}i:17;a:2:{i:0;d:0.8;i:1;d:-0.3;}i:18;a:2:{i:0;d:0.5;i:1;d:-0.5;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:6:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:6:{i:0;a:2:{i:0;d:-0.2;i:1;d:31.6;}i:1;a:2:{i:0;d:13.7;i:1;d:31.6;}i:2;a:2:{i:0;d:21.9;i:1;d:60.8;}i:3;a:2:{i:0;d:23.4;i:1;d:74.5;}i:4;a:2:{i:0;d:14.7;i:1;d:74.5;}i:5;a:2:{i:0;d:-0.2;i:1;d:31.6;}}s:1:\"o\";a:6:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:1;a:7:{s:3:\"ind\";i:15;s:2:\"ty\";i:3;s:6:\"parent\";i:14;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:262.15;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:2;a:8:{s:3:\"ind\";i:18;s:2:\"ty\";i:4;s:6:\"parent\";i:17;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:29:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:0.3;i:1;d:0.8;}i:4;a:2:{i:0;d:0.7;i:1;d:0.5;}i:5;a:2:{i:0;d:1.2;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:0.7;i:1;d:-0.3;}i:8;a:2:{i:0;d:0.4;i:1;d:-0.7;}i:9;a:2:{i:0;i:0;i:1;i:-1;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;d:-0.9;i:1;d:1.7;}i:13;a:2:{i:0;d:-1.6;i:1;d:1.2;}i:14;a:2:{i:0;d:-2.3;i:1;d:0.7;}i:15;a:2:{i:0;d:-2.8;i:1;i:0;}i:16;a:2:{i:0;i:0;i:1;i:0;}i:17;a:2:{i:0;d:-2.6;i:1;d:-1.1;}i:18;a:2:{i:0;d:-1.5;i:1;d:-2.2;}i:19;a:2:{i:0;i:0;i:1;d:-3.3;}i:20;a:2:{i:0;i:0;i:1;i:0;}i:21;a:2:{i:0;i:0;i:1;i:0;}i:22;a:2:{i:0;d:-0.3;i:1;d:-1.4;}i:23;a:2:{i:0;d:-0.6;i:1;d:-1.1;}i:24;a:2:{i:0;i:0;i:1;i:0;}i:25;a:2:{i:0;i:0;i:1;i:0;}i:26;a:2:{i:0;i:0;i:1;i:0;}i:27;a:2:{i:0;d:0.3;i:1;d:1.9;}i:28;a:2:{i:0;i:0;i:1;i:2;}}s:1:\"v\";a:29:{i:0;a:2:{i:0;d:25.3;i:1;d:62.8;}i:1;a:2:{i:0;d:25.3;i:1;d:62.8;}i:2;a:2:{i:0;d:25.3;i:1;d:45.6;}i:3;a:2:{i:0;d:24.8;i:1;d:42.5;}i:4;a:2:{i:0;d:23.3;i:1;d:40.6;}i:5;a:2:{i:0;d:20.4;i:1;d:39.8;}i:6;a:2:{i:0;d:20.4;i:1;d:39.8;}i:7;a:2:{i:0;d:17.9;i:1;d:40.3;}i:8;a:2:{i:0;d:16.3;i:1;d:41.9;}i:9;a:2:{i:0;d:15.7;i:1;d:44.4;}i:10;a:2:{i:0;d:15.7;i:1;d:44.4;}i:11;a:2:{i:0;d:2.7;i:1;d:44.4;}i:12;a:2:{i:0;i:4;i:1;i:39;}i:13;a:2:{i:0;d:7.7;i:1;d:34.7;}i:14;a:2:{i:0;d:13.5;i:1;d:31.8;}i:15;a:2:{i:0;d:21.1;i:1;d:30.8;}i:16;a:2:{i:0;d:21.1;i:1;d:30.8;}i:17;a:2:{i:0;i:30;i:1;d:32.4;}i:18;a:2:{i:0;d:36.1;i:1;d:37.4;}i:19;a:2:{i:0;d:38.4;i:1;d:45.7;}i:20;a:2:{i:0;d:38.4;i:1;d:45.7;}i:21;a:2:{i:0;d:38.4;i:1;d:62.8;}i:22;a:2:{i:0;d:38.9;i:1;i:69;}i:23;a:2:{i:0;d:40.2;i:1;d:72.6;}i:24;a:2:{i:0;d:40.2;i:1;d:72.6;}i:25;a:2:{i:0;d:40.2;i:1;d:73.3;}i:26;a:2:{i:0;d:27.2;i:1;d:73.3;}i:27;a:2:{i:0;d:25.8;i:1;d:68.6;}i:28;a:2:{i:0;d:25.3;i:1;d:62.8;}}s:1:\"o\";a:29:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-1.2;}i:3;a:2:{i:0;d:-0.3;i:1;d:-0.8;}i:4;a:2:{i:0;d:-0.7;i:1;d:-0.5;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:-1;i:1;i:0;}i:7;a:2:{i:0;d:-0.7;i:1;d:0.3;}i:8;a:2:{i:0;d:-0.4;i:1;d:0.7;}i:9;a:2:{i:0;i:0;i:1;i:0;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;i:0;i:1;d:-1.9;}i:12;a:2:{i:0;d:0.9;i:1;d:-1.7;}i:13;a:2:{i:0;d:1.6;i:1;d:-1.2;}i:14;a:2:{i:0;d:2.3;i:1;d:-0.7;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;d:3.3;i:1;i:0;}i:17;a:2:{i:0;d:2.6;i:1;d:1.1;}i:18;a:2:{i:0;d:1.5;i:1;d:2.2;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;i:0;i:1;i:0;}i:21;a:2:{i:0;i:0;i:1;d:2.7;}i:22;a:2:{i:0;d:0.3;i:1;d:1.4;}i:23;a:2:{i:0;i:0;i:1;i:0;}i:24;a:2:{i:0;i:0;i:1;i:0;}i:25;a:2:{i:0;i:0;i:1;i:0;}i:26;a:2:{i:0;d:-0.6;i:1;d:-1.3;}i:27;a:2:{i:0;d:-0.3;i:1;d:-1.9;}i:28;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:32:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;d:0.8;i:1;d:-0.3;}i:5;a:2:{i:0;d:0.5;i:1;d:-0.6;}i:6;a:2:{i:0;d:0.2;i:1;d:-0.7;}i:7;a:2:{i:0;i:0;i:1;d:-0.8;}i:8;a:2:{i:0;i:0;i:1;i:0;}i:9;a:2:{i:0;d:-0.4;i:1;d:-0.6;}i:10;a:2:{i:0;d:-0.6;i:1;d:-0.3;}i:11;a:2:{i:0;d:-0.8;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:-1;i:1;d:0.6;}i:14;a:2:{i:0;d:-0.5;i:1;d:0.8;}i:15;a:2:{i:0;i:0;i:1;d:0.7;}i:16;a:2:{i:0;i:0;i:1;i:0;}i:17;a:2:{i:0;i:0;i:1;i:0;}i:18;a:2:{i:0;d:0.7;i:1;d:-1.1;}i:19;a:2:{i:0;i:1;i:1;d:-0.9;}i:20;a:2:{i:0;d:1.4;i:1;d:-0.6;}i:21;a:2:{i:0;i:2;i:1;i:0;}i:22;a:2:{i:0;i:0;i:1;i:0;}i:23;a:2:{i:0;d:2.1;i:1;d:1.1;}i:24;a:2:{i:0;d:1.3;i:1;d:1.9;}i:25;a:2:{i:0;i:0;i:1;d:2.5;}i:26;a:2:{i:0;i:0;i:1;i:0;}i:27;a:2:{i:0;d:-0.8;i:1;d:1.7;}i:28;a:2:{i:0;d:-1.6;i:1;d:1.2;}i:29;a:2:{i:0;d:-2.5;i:1;d:0.6;}i:30;a:2:{i:0;d:-3.3;i:1;i:0;}i:31;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:32:{i:0;a:2:{i:0;d:21.3;i:1;d:47.8;}i:1;a:2:{i:0;d:26.9;i:1;d:47.8;}i:2;a:2:{i:0;i:27;i:1;d:54.7;}i:3;a:2:{i:0;d:21.3;i:1;d:54.7;}i:4;a:2:{i:0;d:18.2;i:1;d:55.2;}i:5;a:2:{i:0;d:16.2;i:1;d:56.6;}i:6;a:2:{i:0;d:15.1;i:1;d:58.6;}i:7;a:2:{i:0;d:14.8;i:1;d:60.8;}i:8;a:2:{i:0;d:14.8;i:1;d:60.8;}i:9;a:2:{i:0;d:15.3;i:1;d:62.9;}i:10;a:2:{i:0;d:16.9;i:1;d:64.3;}i:11;a:2:{i:0;i:19;i:1;d:64.8;}i:12;a:2:{i:0;i:19;i:1;d:64.8;}i:13;a:2:{i:0;d:22.7;i:1;i:64;}i:14;a:2:{i:0;i:25;i:1;i:62;}i:15;a:2:{i:0;d:25.8;i:1;d:59.7;}i:16;a:2:{i:0;d:25.8;i:1;d:59.7;}i:17;a:2:{i:0;d:28.7;i:1;i:65;}i:18;a:2:{i:0;d:26.9;i:1;d:68.2;}i:19;a:2:{i:0;d:24.5;i:1;d:71.1;}i:20;a:2:{i:0;i:21;i:1;d:73.2;}i:21;a:2:{i:0;d:15.9;i:1;d:74.1;}i:22;a:2:{i:0;d:15.9;i:1;d:74.1;}i:23;a:2:{i:0;d:8.9;i:1;d:72.5;}i:24;a:2:{i:0;d:3.7;i:1;d:68.1;}i:25;a:2:{i:0;d:1.8;i:1;d:61.5;}i:26;a:2:{i:0;d:1.8;i:1;d:61.5;}i:27;a:2:{i:0;i:3;i:1;d:55.7;}i:28;a:2:{i:0;d:6.5;i:1;d:51.4;}i:29;a:2:{i:0;d:12.6;i:1;d:48.7;}i:30;a:2:{i:0;d:21.3;i:1;d:47.8;}i:31;a:2:{i:0;d:21.3;i:1;d:47.8;}}s:1:\"o\";a:32:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-1.2;i:1;i:0;}i:4;a:2:{i:0;d:-0.8;i:1;d:0.3;}i:5;a:2:{i:0;d:-0.5;i:1;d:0.6;}i:6;a:2:{i:0;d:-0.2;i:1;d:0.7;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;i:0;i:1;d:0.8;}i:9;a:2:{i:0;d:0.4;i:1;d:0.6;}i:10;a:2:{i:0;d:0.6;i:1;d:0.3;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;d:1.4;i:1;i:0;}i:13;a:2:{i:0;i:1;i:1;d:-0.6;}i:14;a:2:{i:0;d:0.5;i:1;d:-0.8;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;i:0;i:1;i:0;}i:17;a:2:{i:0;d:-0.5;i:1;i:1;}i:18;a:2:{i:0;d:-0.7;i:1;d:1.1;}i:19;a:2:{i:0;i:-1;i:1;d:0.9;}i:20;a:2:{i:0;d:-1.4;i:1;d:0.6;}i:21;a:2:{i:0;i:0;i:1;i:0;}i:22;a:2:{i:0;d:-2.6;i:1;i:0;}i:23;a:2:{i:0;d:-2.1;i:1;d:-1.1;}i:24;a:2:{i:0;d:-1.3;i:1;d:-1.9;}i:25;a:2:{i:0;i:0;i:1;i:0;}i:26;a:2:{i:0;i:0;i:1;d:-2.2;}i:27;a:2:{i:0;d:0.8;i:1;d:-1.7;}i:28;a:2:{i:0;d:1.6;i:1;d:-1.2;}i:29;a:2:{i:0;d:2.5;i:1;d:-0.6;}i:30;a:2:{i:0;i:0;i:1;i:0;}i:31;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:3;a:7:{s:3:\"ind\";i:17;s:2:\"ty\";i:3;s:6:\"parent\";i:14;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:220.76;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:4;a:8:{s:3:\"ind\";i:20;s:2:\"ty\";i:4;s:6:\"parent\";i:19;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:4:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:6:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:6:{i:0;a:2:{i:0;i:29;i:1;d:73.3;}i:1;a:2:{i:0;d:27.7;i:1;d:63.7;}i:2;a:2:{i:0;d:27.7;i:1;i:14;}i:3;a:2:{i:0;d:40.7;i:1;i:14;}i:4;a:2:{i:0;d:40.7;i:1;d:73.3;}i:5;a:2:{i:0;i:29;i:1;d:73.3;}}s:1:\"o\";a:6:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:23:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-0.7;i:1;d:2.6;}i:4;a:2:{i:0;d:-1.4;i:1;d:1.9;}i:5;a:2:{i:0;i:-2;i:1;i:1;}i:6;a:2:{i:0;d:-2.6;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:-1.8;i:1;d:-1.1;}i:9;a:2:{i:0;d:-1.3;i:1;i:-2;}i:10;a:2:{i:0;d:-0.8;i:1;d:-2.6;}i:11;a:2:{i:0;d:-0.4;i:1;i:-3;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;d:0.8;i:1;d:-2.5;}i:15;a:2:{i:0;d:1.3;i:1;d:-1.9;}i:16;a:2:{i:0;d:1.8;i:1;d:-1.1;}i:17;a:2:{i:0;d:2.4;i:1;i:0;}i:18;a:2:{i:0;i:0;i:1;i:0;}i:19;a:2:{i:0;i:2;i:1;d:1.1;}i:20;a:2:{i:0;d:1.4;i:1;d:1.9;}i:21;a:2:{i:0;d:0.7;i:1;d:2.6;}i:22;a:2:{i:0;i:0;i:1;i:3;}}s:1:\"v\";a:23:{i:0;a:2:{i:0;i:2;i:1;d:52.9;}i:1;a:2:{i:0;i:2;i:1;d:52.9;}i:2;a:2:{i:0;i:2;i:1;d:52.1;}i:3;a:2:{i:0;d:3.1;i:1;d:43.5;}i:4;a:2:{i:0;d:6.2;i:1;d:36.7;}i:5;a:2:{i:0;d:11.3;i:1;d:32.3;}i:6;a:2:{i:0;d:18.3;i:1;d:30.8;}i:7;a:2:{i:0;d:18.3;i:1;d:30.8;}i:8;a:2:{i:0;d:24.5;i:1;d:32.4;}i:9;a:2:{i:0;i:29;i:1;i:37;}i:10;a:2:{i:0;d:32.1;i:1;d:43.8;}i:11;a:2:{i:0;d:33.9;i:1;d:52.3;}i:12;a:2:{i:0;d:33.9;i:1;d:52.3;}i:13;a:2:{i:0;d:33.9;i:1;d:53.2;}i:14;a:2:{i:0;d:32.1;i:1;d:61.2;}i:15;a:2:{i:0;i:29;i:1;d:67.9;}i:16;a:2:{i:0;d:24.5;i:1;d:72.4;}i:17;a:2:{i:0;d:18.2;i:1;d:74.1;}i:18;a:2:{i:0;d:18.2;i:1;d:74.1;}i:19;a:2:{i:0;d:11.2;i:1;d:72.5;}i:20;a:2:{i:0;d:6.2;i:1;i:68;}i:21;a:2:{i:0;d:3.1;i:1;d:61.3;}i:22;a:2:{i:0;i:2;i:1;d:52.9;}}s:1:\"o\";a:23:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-3.2;}i:3;a:2:{i:0;d:0.7;i:1;d:-2.6;}i:4;a:2:{i:0;d:1.4;i:1;d:-1.9;}i:5;a:2:{i:0;i:2;i:1;i:-1;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:2.4;i:1;i:0;}i:8;a:2:{i:0;d:1.8;i:1;d:1.1;}i:9;a:2:{i:0;d:1.3;i:1;i:2;}i:10;a:2:{i:0;d:0.8;i:1;d:2.6;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;d:-0.4;i:1;d:2.8;}i:14;a:2:{i:0;d:-0.8;i:1;d:2.5;}i:15;a:2:{i:0;d:-1.3;i:1;d:1.9;}i:16;a:2:{i:0;d:-1.8;i:1;d:1.1;}i:17;a:2:{i:0;i:0;i:1;i:0;}i:18;a:2:{i:0;d:-2.6;i:1;i:0;}i:19;a:2:{i:0;i:-2;i:1;d:-1.1;}i:20;a:2:{i:0;d:-1.4;i:1;d:-1.9;}i:21;a:2:{i:0;d:-0.7;i:1;d:-2.6;}i:22;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:22:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-0.2;i:1;d:-1.3;}i:4;a:2:{i:0;d:-0.5;i:1;i:-1;}i:5;a:2:{i:0;d:-0.8;i:1;d:-0.6;}i:6;a:2:{i:0;d:-1.2;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:-1.1;i:1;d:0.8;}i:9;a:2:{i:0;d:-0.5;i:1;d:1.5;}i:10;a:2:{i:0;d:0.1;i:1;i:2;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;d:0.3;i:1;d:1.3;}i:14;a:2:{i:0;d:0.6;i:1;d:0.9;}i:15;a:2:{i:0;d:0.9;i:1;d:0.5;}i:16;a:2:{i:0;d:1.2;i:1;i:0;}i:17;a:2:{i:0;i:0;i:1;i:0;}i:18;a:2:{i:0;d:0.8;i:1;d:-0.6;}i:19;a:2:{i:0;d:0.5;i:1;i:-1;}i:20;a:2:{i:0;d:0.2;i:1;d:-1.4;}i:21;a:2:{i:0;i:0;i:1;d:-1.6;}}s:1:\"v\";a:22:{i:0;a:2:{i:0;i:15;i:1;d:52.1;}i:1;a:2:{i:0;i:15;i:1;d:52.1;}i:2;a:2:{i:0;i:15;i:1;d:52.9;}i:3;a:2:{i:0;d:15.4;i:1;d:57.3;}i:4;a:2:{i:0;d:16.4;i:1;d:60.8;}i:5;a:2:{i:0;d:18.4;i:1;d:63.2;}i:6;a:2:{i:0;d:21.5;i:1;i:64;}i:7;a:2:{i:0;d:21.5;i:1;i:64;}i:8;a:2:{i:0;d:25.7;i:1;d:62.8;}i:9;a:2:{i:0;d:28.1;i:1;d:59.4;}i:10;a:2:{i:0;d:28.8;i:1;d:54.3;}i:11;a:2:{i:0;d:28.8;i:1;d:54.3;}i:12;a:2:{i:0;d:28.8;i:1;d:51.2;}i:13;a:2:{i:0;d:28.4;i:1;d:46.7;}i:14;a:2:{i:0;d:27.1;i:1;d:43.5;}i:15;a:2:{i:0;d:24.8;i:1;d:41.5;}i:16;a:2:{i:0;d:21.6;i:1;d:40.8;}i:17;a:2:{i:0;d:21.6;i:1;d:40.8;}i:18;a:2:{i:0;d:18.5;i:1;d:41.7;}i:19;a:2:{i:0;d:16.5;i:1;i:44;}i:20;a:2:{i:0;d:15.4;i:1;d:47.6;}i:21;a:2:{i:0;i:15;i:1;d:52.1;}}s:1:\"o\";a:22:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:1.6;}i:3;a:2:{i:0;d:0.2;i:1;d:1.3;}i:4;a:2:{i:0;d:0.5;i:1;i:1;}i:5;a:2:{i:0;d:0.8;i:1;d:0.6;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:1.7;i:1;i:0;}i:8;a:2:{i:0;d:1.1;i:1;d:-0.8;}i:9;a:2:{i:0;d:0.5;i:1;d:-1.5;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;d:0.1;i:1;d:-1.7;}i:13;a:2:{i:0;d:-0.3;i:1;d:-1.3;}i:14;a:2:{i:0;d:-0.6;i:1;d:-0.9;}i:15;a:2:{i:0;d:-0.9;i:1;d:-0.5;}i:16;a:2:{i:0;i:0;i:1;i:0;}i:17;a:2:{i:0;d:-1.2;i:1;i:0;}i:18;a:2:{i:0;d:-0.8;i:1;d:0.6;}i:19;a:2:{i:0;d:-0.5;i:1;i:1;}i:20;a:2:{i:0;d:-0.2;i:1;d:1.4;}i:21;a:2:{i:0;i:0;i:1;i:0;}}}}}i:3;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:5;a:7:{s:3:\"ind\";i:19;s:2:\"ty\";i:3;s:6:\"parent\";i:14;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:176.323;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:6;a:8:{s:3:\"ind\";i:22;s:2:\"ty\";i:4;s:6:\"parent\";i:21;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:3.4;i:1;i:14;}i:1;a:2:{i:0;d:16.4;i:1;i:14;}i:2;a:2:{i:0;d:16.4;i:1;d:73.3;}i:3;a:2:{i:0;d:3.4;i:1;d:73.3;}i:4;a:2:{i:0;d:3.4;i:1;i:14;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:24:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-0.7;i:1;d:2.5;}i:4;a:2:{i:0;d:-1.3;i:1;d:1.8;}i:5;a:2:{i:0;d:-1.9;i:1;i:1;}i:6;a:2:{i:0;d:-2.3;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:-1.7;i:1;d:-0.6;}i:9;a:2:{i:0;d:-1.2;i:1;d:-1.3;}i:10;a:2:{i:0;d:-0.7;i:1;d:-2.1;}i:11;a:2:{i:0;i:0;i:1;i:-3;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;d:0.5;i:1;d:0.9;}i:17;a:2:{i:0;d:0.9;i:1;d:0.4;}i:18;a:2:{i:0;d:1.3;i:1;i:0;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;i:1;i:1;d:-0.5;}i:21;a:2:{i:0;d:0.5;i:1;d:-0.9;}i:22;a:2:{i:0;d:0.2;i:1;d:-1.2;}i:23;a:2:{i:0;i:0;i:1;d:-1.5;}}s:1:\"v\";a:24:{i:0;a:2:{i:0;d:14.9;i:1;i:51;}i:1;a:2:{i:0;d:14.9;i:1;i:51;}i:2;a:2:{i:0;d:11.8;i:1;d:51.1;}i:3;a:2:{i:0;d:12.9;i:1;i:43;}i:4;a:2:{i:0;i:16;i:1;d:36.5;}i:5;a:2:{i:0;d:20.8;i:1;d:32.3;}i:6;a:2:{i:0;i:27;i:1;d:30.8;}i:7;a:2:{i:0;i:27;i:1;d:30.8;}i:8;a:2:{i:0;d:32.7;i:1;d:31.7;}i:9;a:2:{i:0;d:37.1;i:1;d:34.5;}i:10;a:2:{i:0;i:40;i:1;d:39.7;}i:11;a:2:{i:0;i:41;i:1;d:47.4;}i:12;a:2:{i:0;i:41;i:1;d:47.4;}i:13;a:2:{i:0;i:41;i:1;d:73.3;}i:14;a:2:{i:0;i:28;i:1;d:73.3;}i:15;a:2:{i:0;i:28;i:1;d:47.3;}i:16;a:2:{i:0;d:27.3;i:1;d:43.3;}i:17;a:2:{i:0;d:25.2;i:1;d:41.4;}i:18;a:2:{i:0;i:22;i:1;d:40.8;}i:19;a:2:{i:0;i:22;i:1;d:40.8;}i:20;a:2:{i:0;d:18.3;i:1;d:41.6;}i:21;a:2:{i:0;d:16.1;i:1;d:43.7;}i:22;a:2:{i:0;d:15.1;i:1;d:46.9;}i:23;a:2:{i:0;d:14.9;i:1;i:51;}}s:1:\"o\";a:24:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-2.9;}i:3;a:2:{i:0;d:0.7;i:1;d:-2.5;}i:4;a:2:{i:0;d:1.3;i:1;d:-1.8;}i:5;a:2:{i:0;d:1.9;i:1;i:-1;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:2.1;i:1;i:0;}i:8;a:2:{i:0;d:1.7;i:1;d:0.6;}i:9;a:2:{i:0;d:1.2;i:1;d:1.3;}i:10;a:2:{i:0;d:0.7;i:1;d:2.1;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;d:-1.7;}i:16;a:2:{i:0;d:-0.5;i:1;d:-0.9;}i:17;a:2:{i:0;d:-0.9;i:1;d:-0.4;}i:18;a:2:{i:0;i:0;i:1;i:0;}i:19;a:2:{i:0;d:-1.5;i:1;i:0;}i:20;a:2:{i:0;i:-1;i:1;d:0.5;}i:21;a:2:{i:0;d:-0.5;i:1;d:0.9;}i:22;a:2:{i:0;d:-0.2;i:1;d:1.2;}i:23;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:7;a:7:{s:3:\"ind\";i:21;s:2:\"ty\";i:3;s:6:\"parent\";i:14;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:131.731;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:8;a:8:{s:3:\"ind\";i:24;s:2:\"ty\";i:4;s:6:\"parent\";i:23;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:0.5;i:1;d:31.6;}i:1;a:2:{i:0;d:25.7;i:1;d:31.6;}i:2;a:2:{i:0;d:25.7;i:1;d:40.6;}i:3;a:2:{i:0;d:0.5;i:1;d:40.6;}i:4;a:2:{i:0;d:0.5;i:1;d:31.6;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:19:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;d:-0.3;i:1;d:-0.6;}i:5;a:2:{i:0;d:-0.6;i:1;d:-0.2;}i:6;a:2:{i:0;d:-1.1;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:-0.5;i:1;i:0;}i:9;a:2:{i:0;d:-0.4;i:1;d:0.1;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;d:1.2;i:1;d:-0.2;}i:13;a:2:{i:0;d:1.4;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:2;i:1;d:0.9;}i:16;a:2:{i:0;i:1;i:1;d:1.9;}i:17;a:2:{i:0;i:0;i:1;i:3;}i:18;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:19:{i:0;a:2:{i:0;d:5.8;i:1;d:61.3;}i:1;a:2:{i:0;d:5.8;i:1;d:21.2;}i:2;a:2:{i:0;d:18.8;i:1;d:21.2;}i:3;a:2:{i:0;d:18.8;i:1;d:59.7;}i:4;a:2:{i:0;d:19.2;i:1;d:62.2;}i:5;a:2:{i:0;d:20.5;i:1;d:63.5;}i:6;a:2:{i:0;i:23;i:1;d:63.9;}i:7;a:2:{i:0;i:23;i:1;d:63.9;}i:8;a:2:{i:0;d:24.9;i:1;d:63.8;}i:9;a:2:{i:0;d:26.3;i:1;d:63.6;}i:10;a:2:{i:0;d:26.3;i:1;d:63.6;}i:11;a:2:{i:0;d:26.3;i:1;d:72.9;}i:12;a:2:{i:0;d:22.8;i:1;d:73.8;}i:13;a:2:{i:0;d:18.9;i:1;d:74.1;}i:14;a:2:{i:0;d:18.9;i:1;d:74.1;}i:15;a:2:{i:0;d:11.8;i:1;d:72.8;}i:16;a:2:{i:0;d:7.3;i:1;d:68.6;}i:17;a:2:{i:0;d:5.8;i:1;d:61.3;}i:18;a:2:{i:0;d:5.8;i:1;d:61.3;}}s:1:\"o\";a:19:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;d:1.1;}i:4;a:2:{i:0;d:0.3;i:1;d:0.6;}i:5;a:2:{i:0;d:0.6;i:1;d:0.2;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:0.7;i:1;i:0;}i:8;a:2:{i:0;d:0.5;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;i:0;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;d:-1.1;i:1;d:0.4;}i:12;a:2:{i:0;d:-1.2;i:1;d:0.2;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;d:-2.8;i:1;i:0;}i:15;a:2:{i:0;i:-2;i:1;d:-0.9;}i:16;a:2:{i:0;i:-1;i:1;d:-1.9;}i:17;a:2:{i:0;i:0;i:1;i:0;}i:18;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:9;a:7:{s:3:\"ind\";i:23;s:2:\"ty\";i:3;s:6:\"parent\";i:14;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:104.575;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:10;a:8:{s:3:\"ind\";i:26;s:2:\"ty\";i:4;s:6:\"parent\";i:25;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:6:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:6:{i:0;a:2:{i:0;d:15.9;i:1;d:31.6;}i:1;a:2:{i:0;d:16.8;i:1;d:41.9;}i:2;a:2:{i:0;d:16.8;i:1;d:73.3;}i:3;a:2:{i:0;d:3.8;i:1;d:73.3;}i:4;a:2:{i:0;d:3.8;i:1;d:31.6;}i:5;a:2:{i:0;d:15.9;i:1;d:31.6;}}s:1:\"o\";a:6:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:19:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:0.9;i:1;d:0.1;}i:4;a:2:{i:0;d:0.6;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;d:1.1;i:1;d:-0.3;}i:7;a:2:{i:0;d:0.7;i:1;d:-0.7;}i:8;a:2:{i:0;d:0.3;i:1;i:-1;}i:9;a:2:{i:0;i:0;i:1;d:-1.4;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;d:-0.6;i:1;d:2.3;}i:13;a:2:{i:0;i:-1;i:1;d:1.7;}i:14;a:2:{i:0;d:-1.5;i:1;d:0.9;}i:15;a:2:{i:0;d:-1.8;i:1;i:0;}i:16;a:2:{i:0;i:0;i:1;i:0;}i:17;a:2:{i:0;d:-0.6;i:1;d:-0.1;}i:18;a:2:{i:0;d:-0.5;i:1;d:-0.2;}}s:1:\"v\";a:19:{i:0;a:2:{i:0;d:29.1;i:1;d:31.2;}i:1;a:2:{i:0;d:29.1;i:1;d:31.2;}i:2;a:2:{i:0;d:28.9;i:1;d:43.3;}i:3;a:2:{i:0;d:26.8;i:1;d:43.1;}i:4;a:2:{i:0;d:24.6;i:1;i:43;}i:5;a:2:{i:0;d:24.6;i:1;i:43;}i:6;a:2:{i:0;d:20.7;i:1;d:43.5;}i:7;a:2:{i:0;i:18;i:1;d:45.1;}i:8;a:2:{i:0;d:16.5;i:1;d:47.6;}i:9;a:2:{i:0;i:16;i:1;d:51.2;}i:10;a:2:{i:0;i:16;i:1;d:51.2;}i:11;a:2:{i:0;d:13.7;i:1;d:49.7;}i:12;a:2:{i:0;d:14.5;i:1;i:42;}i:13;a:2:{i:0;d:16.9;i:1;i:36;}i:14;a:2:{i:0;d:20.6;i:1;d:32.2;}i:15;a:2:{i:0;d:25.5;i:1;d:30.8;}i:16;a:2:{i:0;d:25.5;i:1;d:30.8;}i:17;a:2:{i:0;d:27.4;i:1;d:30.9;}i:18;a:2:{i:0;d:29.1;i:1;d:31.2;}}s:1:\"o\";a:19:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;d:-0.5;i:1;d:-0.1;}i:3;a:2:{i:0;d:-0.9;i:1;d:-0.1;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;d:-1.5;i:1;i:0;}i:6;a:2:{i:0;d:-1.1;i:1;d:0.3;}i:7;a:2:{i:0;d:-0.7;i:1;d:0.7;}i:8;a:2:{i:0;d:-0.3;i:1;i:1;}i:9;a:2:{i:0;i:0;i:1;i:0;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;i:0;i:1;d:-2.8;}i:12;a:2:{i:0;d:0.6;i:1;d:-2.3;}i:13;a:2:{i:0;i:1;i:1;d:-1.7;}i:14;a:2:{i:0;d:1.5;i:1;d:-0.9;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;d:0.6;i:1;i:0;}i:17;a:2:{i:0;d:0.6;i:1;d:0.1;}i:18;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:11;a:7:{s:3:\"ind\";i:25;s:2:\"ty\";i:3;s:6:\"parent\";i:14;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:72.712;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:12;a:8:{s:3:\"ind\";i:28;s:2:\"ty\";i:4;s:6:\"parent\";i:27;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:4.4;i:1;d:31.6;}i:1;a:2:{i:0;d:17.4;i:1;d:31.6;}i:2;a:2:{i:0;d:17.4;i:1;d:73.3;}i:3;a:2:{i:0;d:4.4;i:1;d:73.3;}i:4;a:2:{i:0;d:4.4;i:1;d:31.6;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:13:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;d:-1.3;i:1;d:1.2;}i:3;a:2:{i:0;d:-2.1;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;d:-1.3;i:1;d:-1.2;}i:6;a:2:{i:0;i:0;i:1;d:-1.9;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:1.3;i:1;d:-1.2;}i:9;a:2:{i:0;d:2.1;i:1;i:0;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;d:1.3;i:1;d:1.2;}i:12;a:2:{i:0;i:0;i:1;d:1.9;}}s:1:\"v\";a:13:{i:0;a:2:{i:0;d:3.6;i:1;d:20.8;}i:1;a:2:{i:0;d:3.6;i:1;d:20.8;}i:2;a:2:{i:0;d:5.6;i:1;d:16.2;}i:3;a:2:{i:0;d:10.8;i:1;d:14.5;}i:4;a:2:{i:0;d:10.8;i:1;d:14.5;}i:5;a:2:{i:0;i:16;i:1;d:16.2;}i:6;a:2:{i:0;i:18;i:1;d:20.8;}i:7;a:2:{i:0;i:18;i:1;d:20.8;}i:8;a:2:{i:0;i:16;i:1;d:25.3;}i:9;a:2:{i:0;d:10.8;i:1;d:27.1;}i:10;a:2:{i:0;d:10.8;i:1;d:27.1;}i:11;a:2:{i:0;d:5.6;i:1;d:25.3;}i:12;a:2:{i:0;d:3.6;i:1;d:20.8;}}s:1:\"o\";a:13:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;d:-1.9;}i:2;a:2:{i:0;d:1.3;i:1;d:-1.2;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;d:2.1;i:1;i:0;}i:5;a:2:{i:0;d:1.3;i:1;d:1.2;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;d:1.9;}i:8;a:2:{i:0;d:-1.3;i:1;d:1.2;}i:9;a:2:{i:0;i:0;i:1;i:0;}i:10;a:2:{i:0;d:-2.1;i:1;i:0;}i:11;a:2:{i:0;d:-1.3;i:1;d:-1.2;}i:12;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:13;a:7:{s:3:\"ind\";i:27;s:2:\"ty\";i:3;s:6:\"parent\";i:14;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:50.995;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:14;a:8:{s:3:\"ind\";i:30;s:2:\"ty\";i:4;s:6:\"parent\";i:29;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:27:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;d:-1.3;i:1;d:0.5;}i:6;a:2:{i:0;d:-0.6;i:1;d:0.9;}i:7;a:2:{i:0;i:0;i:1;d:1.4;}i:8;a:2:{i:0;i:0;i:1;i:0;}i:9;a:2:{i:0;d:0.6;i:1;i:1;}i:10;a:2:{i:0;d:1.3;i:1;d:0.5;}i:11;a:2:{i:0;i:2;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;i:0;i:1;i:0;}i:17;a:2:{i:0;i:0;i:1;i:0;}i:18;a:2:{i:0;d:-2.7;i:1;d:-0.6;}i:19;a:2:{i:0;d:-1.9;i:1;d:-1.3;}i:20;a:2:{i:0;i:-1;i:1;d:-1.9;}i:21;a:2:{i:0;i:0;i:1;d:-2.6;}i:22;a:2:{i:0;i:0;i:1;i:0;}i:23;a:2:{i:0;i:1;i:1;i:-2;}i:24;a:2:{i:0;d:2.3;i:1;d:-1.2;}i:25;a:2:{i:0;d:3.9;i:1;d:-0.1;}i:26;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:27:{i:0;a:2:{i:0;d:30.9;i:1;d:45.9;}i:1;a:2:{i:0;d:27.2;i:1;d:49.4;}i:2;a:2:{i:0;d:12.7;i:1;d:49.4;}i:3;a:2:{i:0;d:12.7;i:1;d:40.5;}i:4;a:2:{i:0;d:24.4;i:1;d:40.5;}i:5;a:2:{i:0;d:29.4;i:1;d:39.8;}i:6;a:2:{i:0;d:32.2;i:1;d:37.7;}i:7;a:2:{i:0;d:33.1;i:1;d:34.3;}i:8;a:2:{i:0;d:33.1;i:1;d:34.3;}i:9;a:2:{i:0;d:32.2;i:1;d:30.4;}i:10;a:2:{i:0;d:29.4;i:1;d:28.3;}i:11;a:2:{i:0;d:24.5;i:1;d:27.6;}i:12;a:2:{i:0;d:24.5;i:1;d:27.6;}i:13;a:2:{i:0;d:17.8;i:1;d:27.6;}i:14;a:2:{i:0;d:17.8;i:1;d:73.3;}i:15;a:2:{i:0;d:4.3;i:1;d:73.3;}i:16;a:2:{i:0;d:4.3;i:1;d:17.1;}i:17;a:2:{i:0;d:24.5;i:1;d:17.1;}i:18;a:2:{i:0;d:33.8;i:1;d:18.1;}i:19;a:2:{i:0;d:40.7;i:1;d:20.9;}i:20;a:2:{i:0;d:45.1;i:1;d:25.8;}i:21;a:2:{i:0;d:46.6;i:1;d:32.6;}i:22;a:2:{i:0;d:46.6;i:1;d:32.6;}i:23;a:2:{i:0;d:45.1;i:1;d:39.1;}i:24;a:2:{i:0;d:40.3;i:1;i:44;}i:25;a:2:{i:0;d:30.9;i:1;d:45.9;}i:26;a:2:{i:0;d:30.9;i:1;d:45.9;}}s:1:\"o\";a:27:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;d:2.1;i:1;i:0;}i:5;a:2:{i:0;d:1.3;i:1;d:-0.5;}i:6;a:2:{i:0;d:0.6;i:1;d:-0.9;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;i:0;i:1;d:-1.6;}i:9;a:2:{i:0;d:-0.6;i:1;i:-1;}i:10;a:2:{i:0;d:-1.3;i:1;d:-0.5;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;i:0;i:1;i:0;}i:17;a:2:{i:0;d:3.5;i:1;i:0;}i:18;a:2:{i:0;d:2.7;i:1;d:0.6;}i:19;a:2:{i:0;d:1.9;i:1;d:1.3;}i:20;a:2:{i:0;i:1;i:1;d:1.9;}i:21;a:2:{i:0;i:0;i:1;i:0;}i:22;a:2:{i:0;i:0;i:1;d:2.3;}i:23;a:2:{i:0;i:-1;i:1;i:2;}i:24;a:2:{i:0;d:-2.3;i:1;d:1.2;}i:25;a:2:{i:0;i:0;i:1;i:0;}i:26;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:24:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;d:-1.1;i:1;d:0.6;}i:6;a:2:{i:0;d:-0.5;i:1;i:1;}i:7;a:2:{i:0;i:0;i:1;d:1.2;}i:8;a:2:{i:0;i:0;i:1;i:0;}i:9;a:2:{i:0;d:0.5;i:1;d:1.1;}i:10;a:2:{i:0;i:1;i:1;d:0.6;}i:11;a:2:{i:0;d:1.7;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;i:0;i:1;i:0;}i:17;a:2:{i:0;d:-2.2;i:1;d:-1.2;}i:18;a:2:{i:0;i:-1;i:1;i:-2;}i:19;a:2:{i:0;i:0;i:1;d:-2.2;}i:20;a:2:{i:0;i:0;i:1;i:0;}i:21;a:2:{i:0;d:1.6;i:1;d:-2.5;}i:22;a:2:{i:0;d:3.1;i:1;d:-1.2;}i:23;a:2:{i:0;d:4.6;i:1;i:0;}}s:1:\"v\";a:24:{i:0;a:2:{i:0;d:26.7;i:1;d:73.3;}i:1;a:2:{i:0;d:26.7;i:1;d:73.3;}i:2;a:2:{i:0;d:9.5;i:1;d:73.3;}i:3;a:2:{i:0;d:14.1;i:1;d:62.9;}i:4;a:2:{i:0;d:26.7;i:1;d:62.9;}i:5;a:2:{i:0;d:31.1;i:1;i:62;}i:6;a:2:{i:0;d:33.5;i:1;d:59.7;}i:7;a:2:{i:0;d:34.3;i:1;d:56.5;}i:8;a:2:{i:0;d:34.3;i:1;d:56.5;}i:9;a:2:{i:0;d:33.6;i:1;d:52.7;}i:10;a:2:{i:0;d:31.3;i:1;d:50.3;}i:11;a:2:{i:0;d:27.2;i:1;d:49.4;}i:12;a:2:{i:0;d:27.2;i:1;d:49.4;}i:13;a:2:{i:0;d:15.8;i:1;d:49.4;}i:14;a:2:{i:0;d:15.9;i:1;d:40.5;}i:15;a:2:{i:0;d:29.5;i:1;d:40.5;}i:16;a:2:{i:0;d:32.7;i:1;d:44.1;}i:17;a:2:{i:0;d:41.6;i:1;d:45.7;}i:18;a:2:{i:0;d:46.3;i:1;d:50.5;}i:19;a:2:{i:0;d:47.8;i:1;d:56.7;}i:20;a:2:{i:0;d:47.8;i:1;d:56.7;}i:21;a:2:{i:0;d:45.4;i:1;d:65.9;}i:22;a:2:{i:0;d:38.3;i:1;d:71.4;}i:23;a:2:{i:0;d:26.7;i:1;d:73.3;}}s:1:\"o\";a:24:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;d:1.9;i:1;i:0;}i:5;a:2:{i:0;d:1.1;i:1;d:-0.6;}i:6;a:2:{i:0;d:0.5;i:1;i:-1;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;i:0;i:1;d:-1.4;}i:9;a:2:{i:0;d:-0.5;i:1;d:-1.1;}i:10;a:2:{i:0;i:-1;i:1;d:-0.6;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;d:3.8;i:1;d:-0.2;}i:17;a:2:{i:0;d:2.2;i:1;d:1.2;}i:18;a:2:{i:0;i:1;i:1;i:2;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;i:0;i:1;d:3.7;}i:21;a:2:{i:0;d:-1.6;i:1;d:2.5;}i:22;a:2:{i:0;d:-3.1;i:1;d:1.2;}i:23;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:15;a:7:{s:3:\"ind\";i:29;s:2:\"ty\";i:3;s:6:\"parent\";i:14;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:16;a:7:{s:3:\"ind\";i:14;s:2:\"ty\";i:3;s:6:\"parent\";i:13;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:158.475;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:17;a:8:{s:3:\"ind\";i:33;s:2:\"ty\";i:4;s:6:\"parent\";i:32;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:2.2;i:1;d:34.3;}i:1;a:2:{i:0;d:10.8;i:1;d:34.3;}i:2;a:2:{i:0;d:10.8;i:1;d:73.3;}i:3;a:2:{i:0;d:2.2;i:1;d:73.3;}i:4;a:2:{i:0;d:2.2;i:1;d:34.3;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:24:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-0.5;i:1;d:1.6;}i:4;a:2:{i:0;d:-0.9;i:1;d:1.2;}i:5;a:2:{i:0;d:-1.2;i:1;d:0.7;}i:6;a:2:{i:0;d:-1.5;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:-1.1;i:1;d:-0.4;}i:9;a:2:{i:0;d:-0.8;i:1;d:-0.9;}i:10;a:2:{i:0;d:-0.4;i:1;d:-1.4;}i:11;a:2:{i:0;i:0;i:1;i:-2;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;d:0.3;i:1;d:0.6;}i:17;a:2:{i:0;d:0.6;i:1;d:0.2;}i:18;a:2:{i:0;d:0.8;i:1;i:0;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;d:0.6;i:1;d:-0.3;}i:21;a:2:{i:0;d:0.3;i:1;d:-0.6;}i:22;a:2:{i:0;d:0.1;i:1;d:-0.8;}i:23;a:2:{i:0;i:0;i:1;i:-1;}}s:1:\"v\";a:24:{i:0;a:2:{i:0;d:9.8;i:1;d:58.6;}i:1;a:2:{i:0;d:9.8;i:1;d:58.6;}i:2;a:2:{i:0;d:7.8;i:1;d:58.7;}i:3;a:2:{i:0;d:8.5;i:1;d:53.3;}i:4;a:2:{i:0;d:10.5;i:1;d:49.1;}i:5;a:2:{i:0;d:13.7;i:1;d:46.3;}i:6;a:2:{i:0;d:17.8;i:1;d:45.3;}i:7;a:2:{i:0;d:17.8;i:1;d:45.3;}i:8;a:2:{i:0;d:21.5;i:1;d:45.9;}i:9;a:2:{i:0;d:24.4;i:1;d:47.8;}i:10;a:2:{i:0;d:26.3;i:1;d:51.2;}i:11;a:2:{i:0;i:27;i:1;d:56.2;}i:12;a:2:{i:0;i:27;i:1;d:56.2;}i:13;a:2:{i:0;i:27;i:1;d:73.3;}i:14;a:2:{i:0;d:18.4;i:1;d:73.3;}i:15;a:2:{i:0;d:18.4;i:1;d:56.2;}i:16;a:2:{i:0;d:17.9;i:1;d:53.6;}i:17;a:2:{i:0;d:16.6;i:1;d:52.3;}i:18;a:2:{i:0;d:14.5;i:1;d:51.9;}i:19;a:2:{i:0;d:14.5;i:1;d:51.9;}i:20;a:2:{i:0;d:12.1;i:1;d:52.4;}i:21;a:2:{i:0;d:10.6;i:1;d:53.8;}i:22;a:2:{i:0;i:10;i:1;d:55.9;}i:23;a:2:{i:0;d:9.8;i:1;d:58.6;}}s:1:\"o\";a:24:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-1.9;}i:3;a:2:{i:0;d:0.5;i:1;d:-1.6;}i:4;a:2:{i:0;d:0.9;i:1;d:-1.2;}i:5;a:2:{i:0;d:1.2;i:1;d:-0.7;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:1.4;i:1;i:0;}i:8;a:2:{i:0;d:1.1;i:1;d:0.4;}i:9;a:2:{i:0;d:0.8;i:1;d:0.9;}i:10;a:2:{i:0;d:0.4;i:1;d:1.4;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;d:-1.1;}i:16;a:2:{i:0;d:-0.3;i:1;d:-0.6;}i:17;a:2:{i:0;d:-0.6;i:1;d:-0.2;}i:18;a:2:{i:0;i:0;i:1;i:0;}i:19;a:2:{i:0;i:-1;i:1;i:0;}i:20;a:2:{i:0;d:-0.6;i:1;d:0.3;}i:21;a:2:{i:0;d:-0.3;i:1;d:0.6;}i:22;a:2:{i:0;d:-0.1;i:1;d:0.8;}i:23;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:18;a:7:{s:3:\"ind\";i:32;s:2:\"ty\";i:3;s:6:\"parent\";i:31;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:109.45;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:19;a:8:{s:3:\"ind\";i:35;s:2:\"ty\";i:4;s:6:\"parent\";i:34;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:0.3;i:1;d:45.8;}i:1;a:2:{i:0;d:16.9;i:1;d:45.8;}i:2;a:2:{i:0;d:16.9;i:1;d:51.8;}i:3;a:2:{i:0;d:0.3;i:1;d:51.8;}i:4;a:2:{i:0;d:0.3;i:1;d:45.8;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:19:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;d:-0.2;i:1;d:-0.4;}i:5;a:2:{i:0;d:-0.4;i:1;d:-0.2;}i:6;a:2:{i:0;d:-0.7;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:-0.3;i:1;i:0;}i:9;a:2:{i:0;d:-0.3;i:1;d:0.1;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;d:0.8;i:1;d:-0.1;}i:13;a:2:{i:0;d:0.9;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;d:1.3;i:1;d:0.6;}i:16;a:2:{i:0;d:0.7;i:1;d:1.2;}i:17;a:2:{i:0;i:0;i:1;i:2;}i:18;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:19:{i:0;a:2:{i:0;d:3.8;i:1;d:65.4;}i:1;a:2:{i:0;d:3.8;i:1;i:39;}i:2;a:2:{i:0;d:12.4;i:1;i:39;}i:3;a:2:{i:0;d:12.4;i:1;d:64.3;}i:4;a:2:{i:0;d:12.6;i:1;i:66;}i:5;a:2:{i:0;d:13.5;i:1;d:66.9;}i:6;a:2:{i:0;d:15.2;i:1;d:67.1;}i:7;a:2:{i:0;d:15.2;i:1;d:67.1;}i:8;a:2:{i:0;d:16.4;i:1;d:67.1;}i:9;a:2:{i:0;d:17.3;i:1;d:66.9;}i:10;a:2:{i:0;d:17.3;i:1;d:66.9;}i:11;a:2:{i:0;d:17.3;i:1;d:73.1;}i:12;a:2:{i:0;i:15;i:1;d:73.6;}i:13;a:2:{i:0;d:12.5;i:1;d:73.8;}i:14;a:2:{i:0;d:12.5;i:1;d:73.8;}i:15;a:2:{i:0;d:7.8;i:1;d:72.9;}i:16;a:2:{i:0;d:4.8;i:1;d:70.2;}i:17;a:2:{i:0;d:3.8;i:1;d:65.4;}i:18;a:2:{i:0;d:3.8;i:1;d:65.4;}}s:1:\"o\";a:19:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;d:0.7;}i:4;a:2:{i:0;d:0.2;i:1;d:0.4;}i:5;a:2:{i:0;d:0.4;i:1;d:0.2;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:0.5;i:1;i:0;}i:8;a:2:{i:0;d:0.3;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;i:0;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;d:-0.7;i:1;d:0.2;}i:12;a:2:{i:0;d:-0.8;i:1;d:0.1;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;d:-1.8;i:1;i:0;}i:15;a:2:{i:0;d:-1.3;i:1;d:-0.6;}i:16;a:2:{i:0;d:-0.7;i:1;d:-1.2;}i:17;a:2:{i:0;i:0;i:1;i:0;}i:18;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:20;a:7:{s:3:\"ind\";i:34;s:2:\"ty\";i:3;s:6:\"parent\";i:31;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.575;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:21;a:8:{s:3:\"ind\";i:37;s:2:\"ty\";i:4;s:6:\"parent\";i:36;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:25:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:0.9;i:1;i:-3;}i:4;a:2:{i:0;d:1.7;i:1;i:-2;}i:5;a:2:{i:0;d:2.4;i:1;i:-1;}i:6;a:2:{i:0;d:2.9;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;i:2;i:1;d:0.6;}i:9;a:2:{i:0;d:1.6;i:1;d:1.2;}i:10;a:2:{i:0;d:1.2;i:1;d:1.9;}i:11;a:2:{i:0;d:0.6;i:1;d:2.6;}i:12;a:2:{i:0;i:0;i:1;d:3.2;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;d:-0.9;i:1;i:3;}i:16;a:2:{i:0;d:-1.7;i:1;i:2;}i:17;a:2:{i:0;d:-2.4;i:1;i:1;}i:18;a:2:{i:0;d:-2.9;i:1;i:0;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;i:-2;i:1;d:-0.6;}i:21;a:2:{i:0;d:-1.6;i:1;d:-1.2;}i:22;a:2:{i:0;d:-1.1;i:1;d:-1.9;}i:23;a:2:{i:0;d:-0.6;i:1;d:-2.6;}i:24;a:2:{i:0;i:0;i:1;d:-3.2;}}s:1:\"v\";a:25:{i:0;a:2:{i:0;d:42.5;i:1;d:40.1;}i:1;a:2:{i:0;d:42.5;i:1;d:40.1;}i:2;a:2:{i:0;d:42.5;i:1;d:50.3;}i:3;a:2:{i:0;d:41.1;i:1;d:60.9;}i:4;a:2:{i:0;d:37.1;i:1;d:68.3;}i:5;a:2:{i:0;d:30.9;i:1;d:72.6;}i:6;a:2:{i:0;i:23;i:1;d:74.1;}i:7;a:2:{i:0;i:23;i:1;d:74.1;}i:8;a:2:{i:0;d:16.5;i:1;d:73.2;}i:9;a:2:{i:0;d:11.1;i:1;d:70.4;}i:10;a:2:{i:0;d:6.9;i:1;d:65.7;}i:11;a:2:{i:0;d:4.2;i:1;i:59;}i:12;a:2:{i:0;d:3.3;i:1;d:50.3;}i:13;a:2:{i:0;d:3.3;i:1;d:50.3;}i:14;a:2:{i:0;d:3.3;i:1;d:40.1;}i:15;a:2:{i:0;d:4.7;i:1;d:29.5;}i:16;a:2:{i:0;d:8.8;i:1;d:22.1;}i:17;a:2:{i:0;i:15;i:1;d:17.8;}i:18;a:2:{i:0;d:22.9;i:1;d:16.4;}i:19;a:2:{i:0;d:22.9;i:1;d:16.4;}i:20;a:2:{i:0;d:29.3;i:1;d:17.3;}i:21;a:2:{i:0;d:34.8;i:1;i:20;}i:22;a:2:{i:0;d:38.9;i:1;d:24.7;}i:23;a:2:{i:0;d:41.5;i:1;d:31.4;}i:24;a:2:{i:0;d:42.5;i:1;d:40.1;}}s:1:\"o\";a:25:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:4;}i:3;a:2:{i:0;d:-0.9;i:1;i:3;}i:4;a:2:{i:0;d:-1.7;i:1;i:2;}i:5;a:2:{i:0;d:-2.4;i:1;i:1;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:-2.3;i:1;i:0;}i:8;a:2:{i:0;i:-2;i:1;d:-0.6;}i:9;a:2:{i:0;d:-1.6;i:1;d:-1.2;}i:10;a:2:{i:0;d:-1.2;i:1;d:-1.9;}i:11;a:2:{i:0;d:-0.6;i:1;d:-2.6;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;d:-4.1;}i:15;a:2:{i:0;d:0.9;i:1;i:-3;}i:16;a:2:{i:0;d:1.7;i:1;i:-2;}i:17;a:2:{i:0;d:2.4;i:1;i:-1;}i:18;a:2:{i:0;i:0;i:1;i:0;}i:19;a:2:{i:0;d:2.3;i:1;i:0;}i:20;a:2:{i:0;i:2;i:1;d:0.6;}i:21;a:2:{i:0;d:1.6;i:1;d:1.2;}i:22;a:2:{i:0;d:1.1;i:1;d:1.9;}i:23;a:2:{i:0;d:0.6;i:1;d:2.6;}i:24;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:25:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:0.2;i:1;d:1.3;}i:4;a:2:{i:0;d:0.4;i:1;d:0.9;}i:5;a:2:{i:0;d:0.5;i:1;d:0.6;}i:6;a:2:{i:0;d:0.7;i:1;d:0.3;}i:7;a:2:{i:0;d:0.8;i:1;i:0;}i:8;a:2:{i:0;i:0;i:1;i:0;}i:9;a:2:{i:0;d:0.8;i:1;d:-0.4;}i:10;a:2:{i:0;d:0.6;i:1;d:-0.9;}i:11;a:2:{i:0;d:0.3;i:1;d:-1.5;}i:12;a:2:{i:0;i:0;i:1;d:-2.2;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;d:-0.2;i:1;d:-1.4;}i:16;a:2:{i:0;d:-0.4;i:1;d:-0.9;}i:17;a:2:{i:0;d:-0.5;i:1;d:-0.6;}i:18;a:2:{i:0;d:-0.7;i:1;d:-0.3;}i:19;a:2:{i:0;d:-0.8;i:1;i:0;}i:20;a:2:{i:0;i:0;i:1;i:0;}i:21;a:2:{i:0;d:-0.8;i:1;d:0.4;}i:22;a:2:{i:0;d:-0.6;i:1;d:0.9;}i:23;a:2:{i:0;d:-0.3;i:1;d:1.6;}i:24;a:2:{i:0;i:0;i:1;d:2.3;}}s:1:\"v\";a:25:{i:0;a:2:{i:0;d:29.5;i:1;d:51.9;}i:1;a:2:{i:0;d:29.5;i:1;d:51.9;}i:2;a:2:{i:0;d:29.5;i:1;d:38.4;}i:3;a:2:{i:0;d:29.2;i:1;d:33.7;}i:4;a:2:{i:0;d:28.3;i:1;d:30.3;}i:5;a:2:{i:0;i:27;i:1;d:28.1;}i:6;a:2:{i:0;d:25.1;i:1;d:26.8;}i:7;a:2:{i:0;d:22.9;i:1;d:26.4;}i:8;a:2:{i:0;d:22.9;i:1;d:26.4;}i:9;a:2:{i:0;d:20.1;i:1;i:27;}i:10;a:2:{i:0;d:18.1;i:1;i:29;}i:11;a:2:{i:0;d:16.8;i:1;d:32.7;}i:12;a:2:{i:0;d:16.3;i:1;d:38.4;}i:13;a:2:{i:0;d:16.3;i:1;d:38.4;}i:14;a:2:{i:0;d:16.3;i:1;d:51.9;}i:15;a:2:{i:0;d:16.6;i:1;d:56.7;}i:16;a:2:{i:0;d:17.5;i:1;d:60.1;}i:17;a:2:{i:0;d:18.8;i:1;d:62.4;}i:18;a:2:{i:0;d:20.7;i:1;d:63.6;}i:19;a:2:{i:0;i:23;i:1;i:64;}i:20;a:2:{i:0;i:23;i:1;i:64;}i:21;a:2:{i:0;d:25.7;i:1;d:63.4;}i:22;a:2:{i:0;d:27.7;i:1;d:61.4;}i:23;a:2:{i:0;i:29;i:1;d:57.6;}i:24;a:2:{i:0;d:29.5;i:1;d:51.9;}}s:1:\"o\";a:25:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-1.8;}i:3;a:2:{i:0;d:-0.2;i:1;d:-1.3;}i:4;a:2:{i:0;d:-0.4;i:1;d:-0.9;}i:5;a:2:{i:0;d:-0.5;i:1;d:-0.6;}i:6;a:2:{i:0;d:-0.7;i:1;d:-0.3;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;i:-1;i:1;i:0;}i:9;a:2:{i:0;d:-0.8;i:1;d:0.4;}i:10;a:2:{i:0;d:-0.6;i:1;d:0.9;}i:11;a:2:{i:0;d:-0.3;i:1;d:1.5;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;d:1.8;}i:15;a:2:{i:0;d:0.2;i:1;d:1.4;}i:16;a:2:{i:0;d:0.4;i:1;d:0.9;}i:17;a:2:{i:0;d:0.5;i:1;d:0.6;}i:18;a:2:{i:0;d:0.7;i:1;d:0.3;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;i:1;i:1;i:0;}i:21;a:2:{i:0;d:0.8;i:1;d:-0.4;}i:22;a:2:{i:0;d:0.6;i:1;d:-0.9;}i:23;a:2:{i:0;d:0.3;i:1;d:-1.6;}i:24;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:22;a:7:{s:3:\"ind\";i:36;s:2:\"ty\";i:3;s:6:\"parent\";i:31;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:45.788;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:23;a:8:{s:3:\"ind\";i:39;s:2:\"ty\";i:4;s:6:\"parent\";i:38;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:8:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:8:{i:0;a:2:{i:0;d:31.1;i:1;d:17.1;}i:1;a:2:{i:0;d:32.2;i:1;d:17.1;}i:2;a:2:{i:0;d:32.2;i:1;d:73.3;}i:3;a:2:{i:0;d:19.2;i:1;d:73.3;}i:4;a:2:{i:0;d:19.2;i:1;d:31.8;}i:5;a:2:{i:0;d:6.4;i:1;d:35.5;}i:6;a:2:{i:0;d:6.4;i:1;d:25.7;}i:7;a:2:{i:0;d:31.1;i:1;d:17.1;}}s:1:\"o\";a:8:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:24;a:7:{s:3:\"ind\";i:38;s:2:\"ty\";i:3;s:6:\"parent\";i:31;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:25;a:7:{s:3:\"ind\";i:31;s:2:\"ty\";i:3;s:6:\"parent\";i:13;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:26;a:7:{s:3:\"ind\";i:13;s:2:\"ty\";i:3;s:6:\"parent\";i:12;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:25.724;i:1;d:96.111;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:27;a:8:{s:3:\"ind\";i:43;s:2:\"ty\";i:4;s:6:\"parent\";i:42;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:55:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;d:0.5;i:1;d:0.5;}i:3;a:2:{i:0;d:1.2;i:1;d:0.5;}i:4;a:2:{i:0;d:2.1;i:1;d:0.5;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;d:1.8;i:1;d:0.7;}i:7;a:2:{i:0;d:1.3;i:1;i:1;}i:8;a:2:{i:0;d:0.8;i:1;d:1.4;}i:9;a:2:{i:0;i:0;i:1;d:1.8;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;d:-0.8;i:1;d:1.6;}i:12;a:2:{i:0;d:-1.5;i:1;d:1.2;}i:13;a:2:{i:0;d:-2.1;i:1;d:0.7;}i:14;a:2:{i:0;d:-2.7;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;d:-2.7;i:1;d:-1.1;}i:17;a:2:{i:0;d:-1.5;i:1;i:-2;}i:18;a:2:{i:0;i:0;i:1;d:-2.7;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;i:0;i:1;i:0;}i:21;a:2:{i:0;d:0.3;i:1;d:0.7;}i:22;a:2:{i:0;d:0.8;i:1;d:0.4;}i:23;a:2:{i:0;d:1.3;i:1;i:0;}i:24;a:2:{i:0;i:0;i:1;i:0;}i:25;a:2:{i:0;d:0.7;i:1;d:-0.3;}i:26;a:2:{i:0;d:0.4;i:1;d:-0.6;}i:27;a:2:{i:0;i:0;i:1;d:-0.8;}i:28;a:2:{i:0;i:0;i:1;i:0;}i:29;a:2:{i:0;d:-0.3;i:1;d:-0.5;}i:30;a:2:{i:0;d:-0.6;i:1;d:-0.4;}i:31;a:2:{i:0;d:-0.9;i:1;d:-0.3;}i:32;a:2:{i:0;d:-1.2;i:1;d:-0.2;}i:33;a:2:{i:0;i:0;i:1;i:0;}i:34;a:2:{i:0;d:-2.4;i:1;i:-1;}i:35;a:2:{i:0;d:-1.5;i:1;d:-1.7;}i:36;a:2:{i:0;i:0;i:1;i:-3;}i:37;a:2:{i:0;i:0;i:1;i:0;}i:38;a:2:{i:0;d:0.8;i:1;d:-1.6;}i:39;a:2:{i:0;d:1.6;i:1;d:-1.2;}i:40;a:2:{i:0;d:2.2;i:1;d:-0.6;}i:41;a:2:{i:0;d:2.8;i:1;i:0;}i:42;a:2:{i:0;i:0;i:1;i:0;}i:43;a:2:{i:0;d:2.8;i:1;d:1.4;}i:44;a:2:{i:0;d:1.4;i:1;d:2.2;}i:45;a:2:{i:0;i:0;i:1;d:2.2;}i:46;a:2:{i:0;i:0;i:1;i:0;}i:47;a:2:{i:0;i:0;i:1;i:0;}i:48;a:2:{i:0;d:-0.6;i:1;d:-0.8;}i:49;a:2:{i:0;i:-1;i:1;d:-0.4;}i:50;a:2:{i:0;d:-1.3;i:1;i:0;}i:51;a:2:{i:0;i:0;i:1;i:0;}i:52;a:2:{i:0;d:-0.8;i:1;d:0.3;}i:53;a:2:{i:0;d:-0.4;i:1;d:0.6;}i:54;a:2:{i:0;i:0;i:1;d:0.8;}}s:1:\"v\";a:55:{i:0;a:2:{i:0;d:25.5;i:1;d:61.6;}i:1;a:2:{i:0;d:25.5;i:1;d:61.6;}i:2;a:2:{i:0;d:24.8;i:1;d:59.7;}i:3;a:2:{i:0;d:22.3;i:1;d:58.2;}i:4;a:2:{i:0;d:17.4;i:1;d:56.9;}i:5;a:2:{i:0;d:17.4;i:1;d:56.9;}i:6;a:2:{i:0;d:11.6;i:1;d:55.1;}i:7;a:2:{i:0;d:6.9;i:1;d:52.5;}i:8;a:2:{i:0;d:3.8;i:1;d:48.8;}i:9;a:2:{i:0;d:2.7;i:1;i:44;}i:10;a:2:{i:0;d:2.7;i:1;i:44;}i:11;a:2:{i:0;d:3.8;i:1;d:38.9;}i:12;a:2:{i:0;d:7.2;i:1;d:34.7;}i:13;a:2:{i:0;d:12.6;i:1;d:31.8;}i:14;a:2:{i:0;d:19.9;i:1;d:30.8;}i:15;a:2:{i:0;d:19.9;i:1;d:30.8;}i:16;a:2:{i:0;d:29.6;i:1;d:32.5;}i:17;a:2:{i:0;d:35.9;i:1;d:37.3;}i:18;a:2:{i:0;d:38.1;i:1;d:44.4;}i:19;a:2:{i:0;d:38.1;i:1;d:44.4;}i:20;a:2:{i:0;d:25.1;i:1;d:44.4;}i:21;a:2:{i:0;d:24.6;i:1;d:41.7;}i:22;a:2:{i:0;d:22.9;i:1;d:39.9;}i:23;a:2:{i:0;d:19.8;i:1;d:39.3;}i:24;a:2:{i:0;d:19.8;i:1;d:39.3;}i:25;a:2:{i:0;d:17.4;i:1;d:39.8;}i:26;a:2:{i:0;d:15.6;i:1;d:41.2;}i:27;a:2:{i:0;i:15;i:1;d:43.3;}i:28;a:2:{i:0;i:15;i:1;d:43.3;}i:29;a:2:{i:0;d:15.4;i:1;d:44.8;}i:30;a:2:{i:0;d:16.6;i:1;d:46.1;}i:31;a:2:{i:0;d:18.8;i:1;d:47.1;}i:32;a:2:{i:0;d:21.9;i:1;d:47.9;}i:33;a:2:{i:0;d:21.9;i:1;d:47.9;}i:34;a:2:{i:0;d:29.8;i:1;d:50.1;}i:35;a:2:{i:0;d:35.8;i:1;d:54.1;}i:36;a:2:{i:0;d:38.1;i:1;d:61.2;}i:37;a:2:{i:0;d:38.1;i:1;d:61.2;}i:38;a:2:{i:0;d:36.8;i:1;d:66.3;}i:39;a:2:{i:0;d:33.1;i:1;d:70.4;}i:40;a:2:{i:0;d:27.4;i:1;d:73.1;}i:41;a:2:{i:0;d:19.8;i:1;d:74.1;}i:42;a:2:{i:0;d:19.8;i:1;d:74.1;}i:43;a:2:{i:0;d:9.7;i:1;d:71.9;}i:44;a:2:{i:0;d:3.5;i:1;d:66.5;}i:45;a:2:{i:0;d:1.4;i:1;d:59.9;}i:46;a:2:{i:0;d:1.4;i:1;d:59.9;}i:47;a:2:{i:0;d:13.5;i:1;d:59.9;}i:48;a:2:{i:0;d:14.4;i:1;d:63.1;}i:49;a:2:{i:0;d:16.8;i:1;d:64.9;}i:50;a:2:{i:0;d:20.2;i:1;d:65.5;}i:51;a:2:{i:0;d:20.2;i:1;d:65.5;}i:52;a:2:{i:0;d:23.1;i:1;i:65;}i:53;a:2:{i:0;d:24.9;i:1;d:63.6;}i:54;a:2:{i:0;d:25.5;i:1;d:61.6;}}s:1:\"o\";a:55:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;d:-0.7;}i:2;a:2:{i:0;d:-0.5;i:1;d:-0.5;}i:3;a:2:{i:0;d:-1.2;i:1;d:-0.5;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:-2;i:1;d:-0.4;}i:6;a:2:{i:0;d:-1.8;i:1;d:-0.7;}i:7;a:2:{i:0;d:-1.3;i:1;i:-1;}i:8;a:2:{i:0;d:-0.8;i:1;d:-1.4;}i:9;a:2:{i:0;i:0;i:1;i:0;}i:10;a:2:{i:0;i:0;i:1;d:-1.8;}i:11;a:2:{i:0;d:0.8;i:1;d:-1.6;}i:12;a:2:{i:0;d:1.5;i:1;d:-1.2;}i:13;a:2:{i:0;d:2.1;i:1;d:-0.7;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;d:3.8;i:1;i:0;}i:16;a:2:{i:0;d:2.7;i:1;d:1.1;}i:17;a:2:{i:0;d:1.5;i:1;i:2;}i:18;a:2:{i:0;i:0;i:1;i:0;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;i:0;i:1;d:-1.1;}i:21;a:2:{i:0;d:-0.3;i:1;d:-0.7;}i:22;a:2:{i:0;d:-0.8;i:1;d:-0.4;}i:23;a:2:{i:0;i:0;i:1;i:0;}i:24;a:2:{i:0;d:-0.9;i:1;i:0;}i:25;a:2:{i:0;d:-0.7;i:1;d:0.3;}i:26;a:2:{i:0;d:-0.4;i:1;d:0.6;}i:27;a:2:{i:0;i:0;i:1;i:0;}i:28;a:2:{i:0;i:0;i:1;d:0.6;}i:29;a:2:{i:0;d:0.3;i:1;d:0.5;}i:30;a:2:{i:0;d:0.6;i:1;d:0.4;}i:31;a:2:{i:0;d:0.9;i:1;d:0.3;}i:32;a:2:{i:0;i:0;i:1;i:0;}i:33;a:2:{i:0;d:2.8;i:1;d:0.5;}i:34;a:2:{i:0;d:2.4;i:1;i:1;}i:35;a:2:{i:0;d:1.5;i:1;d:1.7;}i:36;a:2:{i:0;i:0;i:1;i:0;}i:37;a:2:{i:0;i:0;i:1;d:1.9;}i:38;a:2:{i:0;d:-0.8;i:1;d:1.6;}i:39;a:2:{i:0;d:-1.6;i:1;d:1.2;}i:40;a:2:{i:0;d:-2.2;i:1;d:0.6;}i:41;a:2:{i:0;i:0;i:1;i:0;}i:42;a:2:{i:0;i:-4;i:1;i:0;}i:43;a:2:{i:0;d:-2.8;i:1;d:-1.4;}i:44;a:2:{i:0;d:-1.4;i:1;d:-2.2;}i:45;a:2:{i:0;i:0;i:1;i:0;}i:46;a:2:{i:0;i:0;i:1;i:0;}i:47;a:2:{i:0;d:0.1;i:1;d:1.3;}i:48;a:2:{i:0;d:0.6;i:1;d:0.8;}i:49;a:2:{i:0;i:1;i:1;d:0.4;}i:50;a:2:{i:0;i:0;i:1;i:0;}i:51;a:2:{i:0;d:1.2;i:1;i:0;}i:52;a:2:{i:0;d:0.8;i:1;d:-0.3;}i:53;a:2:{i:0;d:0.4;i:1;d:-0.6;}i:54;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:28;a:7:{s:3:\"ind\";i:42;s:2:\"ty\";i:3;s:6:\"parent\";i:41;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:377.796;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:29;a:8:{s:3:\"ind\";i:45;s:2:\"ty\";i:4;s:6:\"parent\";i:44;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:7:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:7:{i:0;a:2:{i:0;d:1.7;i:1;i:14;}i:1;a:2:{i:0;i:11;i:1;i:14;}i:2;a:2:{i:0;i:11;i:1;d:20.3;}i:3;a:2:{i:0;d:9.6;i:1;d:36.2;}i:4;a:2:{i:0;d:1.7;i:1;d:36.2;}i:5;a:2:{i:0;d:1.7;i:1;d:20.8;}i:6;a:2:{i:0;d:1.7;i:1;i:14;}}s:1:\"o\";a:7:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:30;a:7:{s:3:\"ind\";i:44;s:2:\"ty\";i:3;s:6:\"parent\";i:41;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:365.606;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:31;a:8:{s:3:\"ind\";i:47;s:2:\"ty\";i:4;s:6:\"parent\";i:46;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:6:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:6:{i:0;a:2:{i:0;d:15.9;i:1;d:31.6;}i:1;a:2:{i:0;d:16.8;i:1;d:41.9;}i:2;a:2:{i:0;d:16.8;i:1;d:73.3;}i:3;a:2:{i:0;d:3.8;i:1;d:73.3;}i:4;a:2:{i:0;d:3.8;i:1;d:31.6;}i:5;a:2:{i:0;d:15.9;i:1;d:31.6;}}s:1:\"o\";a:6:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:19:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:0.9;i:1;d:0.1;}i:4;a:2:{i:0;d:0.6;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;d:1.1;i:1;d:-0.3;}i:7;a:2:{i:0;d:0.7;i:1;d:-0.7;}i:8;a:2:{i:0;d:0.3;i:1;i:-1;}i:9;a:2:{i:0;i:0;i:1;d:-1.4;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;d:-0.6;i:1;d:2.3;}i:13;a:2:{i:0;i:-1;i:1;d:1.7;}i:14;a:2:{i:0;d:-1.5;i:1;d:0.9;}i:15;a:2:{i:0;d:-1.8;i:1;i:0;}i:16;a:2:{i:0;i:0;i:1;i:0;}i:17;a:2:{i:0;d:-0.6;i:1;d:-0.1;}i:18;a:2:{i:0;d:-0.5;i:1;d:-0.2;}}s:1:\"v\";a:19:{i:0;a:2:{i:0;d:29.1;i:1;d:31.2;}i:1;a:2:{i:0;d:29.1;i:1;d:31.2;}i:2;a:2:{i:0;d:28.9;i:1;d:43.3;}i:3;a:2:{i:0;d:26.8;i:1;d:43.1;}i:4;a:2:{i:0;d:24.6;i:1;i:43;}i:5;a:2:{i:0;d:24.6;i:1;i:43;}i:6;a:2:{i:0;d:20.7;i:1;d:43.5;}i:7;a:2:{i:0;i:18;i:1;d:45.1;}i:8;a:2:{i:0;d:16.5;i:1;d:47.6;}i:9;a:2:{i:0;i:16;i:1;d:51.2;}i:10;a:2:{i:0;i:16;i:1;d:51.2;}i:11;a:2:{i:0;d:13.7;i:1;d:49.7;}i:12;a:2:{i:0;d:14.5;i:1;i:42;}i:13;a:2:{i:0;d:16.9;i:1;i:36;}i:14;a:2:{i:0;d:20.6;i:1;d:32.2;}i:15;a:2:{i:0;d:25.5;i:1;d:30.8;}i:16;a:2:{i:0;d:25.5;i:1;d:30.8;}i:17;a:2:{i:0;d:27.4;i:1;d:30.9;}i:18;a:2:{i:0;d:29.1;i:1;d:31.2;}}s:1:\"o\";a:19:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;d:-0.5;i:1;d:-0.1;}i:3;a:2:{i:0;d:-0.9;i:1;d:-0.1;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;d:-1.5;i:1;i:0;}i:6;a:2:{i:0;d:-1.1;i:1;d:0.3;}i:7;a:2:{i:0;d:-0.7;i:1;d:0.7;}i:8;a:2:{i:0;d:-0.3;i:1;i:1;}i:9;a:2:{i:0;i:0;i:1;i:0;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;i:0;i:1;d:-2.8;}i:12;a:2:{i:0;d:0.6;i:1;d:-2.3;}i:13;a:2:{i:0;i:1;i:1;d:-1.7;}i:14;a:2:{i:0;d:1.5;i:1;d:-0.9;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;d:0.6;i:1;i:0;}i:17;a:2:{i:0;d:0.6;i:1;d:0.1;}i:18;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:32;a:7:{s:3:\"ind\";i:46;s:2:\"ty\";i:3;s:6:\"parent\";i:41;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:335.056;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:33;a:8:{s:3:\"ind\";i:49;s:2:\"ty\";i:4;s:6:\"parent\";i:48;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:23:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-0.9;i:1;d:2.6;}i:4;a:2:{i:0;d:-1.7;i:1;d:1.9;}i:5;a:2:{i:0;d:-2.5;i:1;d:1.1;}i:6;a:2:{i:0;d:-3.3;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:-2.5;i:1;d:-1.1;}i:9;a:2:{i:0;d:-1.7;i:1;d:-1.9;}i:10;a:2:{i:0;d:-0.9;i:1;d:-2.6;}i:11;a:2:{i:0;i:0;i:1;d:-3.1;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;d:0.9;i:1;d:-2.6;}i:15;a:2:{i:0;d:1.7;i:1;d:-1.9;}i:16;a:2:{i:0;d:2.5;i:1;d:-1.1;}i:17;a:2:{i:0;d:3.3;i:1;i:0;}i:18;a:2:{i:0;i:0;i:1;i:0;}i:19;a:2:{i:0;d:2.5;i:1;d:1.1;}i:20;a:2:{i:0;d:1.7;i:1;d:1.9;}i:21;a:2:{i:0;d:0.9;i:1;d:2.6;}i:22;a:2:{i:0;i:0;i:1;i:3;}}s:1:\"v\";a:23:{i:0;a:2:{i:0;i:2;i:1;d:52.8;}i:1;a:2:{i:0;i:2;i:1;d:52.8;}i:2;a:2:{i:0;i:2;i:1;i:52;}i:3;a:2:{i:0;d:3.4;i:1;d:43.6;}i:4;a:2:{i:0;d:7.2;i:1;d:36.8;}i:5;a:2:{i:0;d:13.5;i:1;d:32.4;}i:6;a:2:{i:0;d:22.1;i:1;d:30.8;}i:7;a:2:{i:0;d:22.1;i:1;d:30.8;}i:8;a:2:{i:0;d:30.8;i:1;d:32.4;}i:9;a:2:{i:0;d:37.1;i:1;d:36.8;}i:10;a:2:{i:0;i:41;i:1;d:43.6;}i:11;a:2:{i:0;d:42.3;i:1;i:52;}i:12;a:2:{i:0;d:42.3;i:1;i:52;}i:13;a:2:{i:0;d:42.3;i:1;d:52.8;}i:14;a:2:{i:0;i:41;i:1;d:61.3;}i:15;a:2:{i:0;d:37.1;i:1;i:68;}i:16;a:2:{i:0;d:30.9;i:1;d:72.5;}i:17;a:2:{i:0;d:22.2;i:1;d:74.1;}i:18;a:2:{i:0;d:22.2;i:1;d:74.1;}i:19;a:2:{i:0;d:13.5;i:1;d:72.5;}i:20;a:2:{i:0;d:7.2;i:1;i:68;}i:21;a:2:{i:0;d:3.4;i:1;d:61.3;}i:22;a:2:{i:0;i:2;i:1;d:52.8;}}s:1:\"o\";a:23:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-3.1;}i:3;a:2:{i:0;d:0.9;i:1;d:-2.6;}i:4;a:2:{i:0;d:1.7;i:1;d:-1.9;}i:5;a:2:{i:0;d:2.5;i:1;d:-1.1;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:3.3;i:1;i:0;}i:8;a:2:{i:0;d:2.5;i:1;d:1.1;}i:9;a:2:{i:0;d:1.7;i:1;d:1.9;}i:10;a:2:{i:0;d:0.9;i:1;d:2.6;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:3;}i:14;a:2:{i:0;d:-0.9;i:1;d:2.6;}i:15;a:2:{i:0;d:-1.7;i:1;d:1.9;}i:16;a:2:{i:0;d:-2.5;i:1;d:1.1;}i:17;a:2:{i:0;i:0;i:1;i:0;}i:18;a:2:{i:0;d:-3.3;i:1;i:0;}i:19;a:2:{i:0;d:-2.5;i:1;d:-1.1;}i:20;a:2:{i:0;d:-1.7;i:1;d:-1.9;}i:21;a:2:{i:0;d:-0.9;i:1;d:-2.6;}i:22;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:23:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-0.2;i:1;d:-1.4;}i:4;a:2:{i:0;d:-0.5;i:1;i:-1;}i:5;a:2:{i:0;d:-0.9;i:1;d:-0.6;}i:6;a:2:{i:0;d:-1.4;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:-0.9;i:1;d:0.6;}i:9;a:2:{i:0;d:-0.5;i:1;i:1;}i:10;a:2:{i:0;d:-0.2;i:1;d:1.4;}i:11;a:2:{i:0;i:0;i:1;d:1.6;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;d:0.2;i:1;d:1.4;}i:15;a:2:{i:0;d:0.5;i:1;i:1;}i:16;a:2:{i:0;d:0.9;i:1;d:0.6;}i:17;a:2:{i:0;d:1.4;i:1;i:0;}i:18;a:2:{i:0;i:0;i:1;i:0;}i:19;a:2:{i:0;d:0.9;i:1;d:-0.6;}i:20;a:2:{i:0;d:0.5;i:1;i:-1;}i:21;a:2:{i:0;d:0.2;i:1;d:-1.4;}i:22;a:2:{i:0;i:0;i:1;d:-1.5;}}s:1:\"v\";a:23:{i:0;a:2:{i:0;i:15;i:1;i:52;}i:1;a:2:{i:0;i:15;i:1;i:52;}i:2;a:2:{i:0;i:15;i:1;d:52.8;}i:3;a:2:{i:0;d:15.4;i:1;d:57.2;}i:4;a:2:{i:0;d:16.5;i:1;d:60.8;}i:5;a:2:{i:0;d:18.7;i:1;d:63.2;}i:6;a:2:{i:0;d:22.2;i:1;i:64;}i:7;a:2:{i:0;d:22.2;i:1;i:64;}i:8;a:2:{i:0;d:25.6;i:1;d:63.2;}i:9;a:2:{i:0;d:27.8;i:1;d:60.8;}i:10;a:2:{i:0;i:29;i:1;d:57.2;}i:11;a:2:{i:0;d:29.3;i:1;d:52.8;}i:12;a:2:{i:0;d:29.3;i:1;d:52.8;}i:13;a:2:{i:0;d:29.3;i:1;i:52;}i:14;a:2:{i:0;i:29;i:1;d:47.7;}i:15;a:2:{i:0;d:27.8;i:1;d:44.1;}i:16;a:2:{i:0;d:25.6;i:1;d:41.7;}i:17;a:2:{i:0;d:22.1;i:1;d:40.8;}i:18;a:2:{i:0;d:22.1;i:1;d:40.8;}i:19;a:2:{i:0;d:18.7;i:1;d:41.7;}i:20;a:2:{i:0;d:16.5;i:1;d:44.1;}i:21;a:2:{i:0;d:15.4;i:1;d:47.7;}i:22;a:2:{i:0;i:15;i:1;i:52;}}s:1:\"o\";a:23:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:1.6;}i:3;a:2:{i:0;d:0.2;i:1;d:1.4;}i:4;a:2:{i:0;d:0.5;i:1;i:1;}i:5;a:2:{i:0;d:0.9;i:1;d:0.6;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:1.4;i:1;i:0;}i:8;a:2:{i:0;d:0.9;i:1;d:-0.6;}i:9;a:2:{i:0;d:0.5;i:1;i:-1;}i:10;a:2:{i:0;d:0.2;i:1;d:-1.4;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;d:-1.5;}i:14;a:2:{i:0;d:-0.2;i:1;d:-1.4;}i:15;a:2:{i:0;d:-0.5;i:1;i:-1;}i:16;a:2:{i:0;d:-0.9;i:1;d:-0.6;}i:17;a:2:{i:0;i:0;i:1;i:0;}i:18;a:2:{i:0;d:-1.4;i:1;i:0;}i:19;a:2:{i:0;d:-0.9;i:1;d:0.6;}i:20;a:2:{i:0;d:-0.5;i:1;i:1;}i:21;a:2:{i:0;d:-0.2;i:1;d:1.4;}i:22;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:34;a:7:{s:3:\"ind\";i:48;s:2:\"ty\";i:3;s:6:\"parent\";i:41;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:290.657;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:35;a:8:{s:3:\"ind\";i:51;s:2:\"ty\";i:4;s:6:\"parent\";i:50;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:0.5;i:1;d:31.6;}i:1;a:2:{i:0;d:25.7;i:1;d:31.6;}i:2;a:2:{i:0;d:25.7;i:1;d:40.6;}i:3;a:2:{i:0;d:0.5;i:1;d:40.6;}i:4;a:2:{i:0;d:0.5;i:1;d:31.6;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:19:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;d:-0.3;i:1;d:-0.6;}i:5;a:2:{i:0;d:-0.6;i:1;d:-0.2;}i:6;a:2:{i:0;d:-1.1;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:-0.5;i:1;i:0;}i:9;a:2:{i:0;d:-0.4;i:1;d:0.1;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;d:1.2;i:1;d:-0.2;}i:13;a:2:{i:0;d:1.4;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:2;i:1;d:0.9;}i:16;a:2:{i:0;i:1;i:1;d:1.9;}i:17;a:2:{i:0;i:0;i:1;i:3;}i:18;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:19:{i:0;a:2:{i:0;d:5.8;i:1;d:61.3;}i:1;a:2:{i:0;d:5.8;i:1;d:21.2;}i:2;a:2:{i:0;d:18.8;i:1;d:21.2;}i:3;a:2:{i:0;d:18.8;i:1;d:59.7;}i:4;a:2:{i:0;d:19.2;i:1;d:62.2;}i:5;a:2:{i:0;d:20.5;i:1;d:63.5;}i:6;a:2:{i:0;i:23;i:1;d:63.9;}i:7;a:2:{i:0;i:23;i:1;d:63.9;}i:8;a:2:{i:0;d:24.9;i:1;d:63.8;}i:9;a:2:{i:0;d:26.3;i:1;d:63.6;}i:10;a:2:{i:0;d:26.3;i:1;d:63.6;}i:11;a:2:{i:0;d:26.3;i:1;d:72.9;}i:12;a:2:{i:0;d:22.8;i:1;d:73.8;}i:13;a:2:{i:0;d:18.9;i:1;d:74.1;}i:14;a:2:{i:0;d:18.9;i:1;d:74.1;}i:15;a:2:{i:0;d:11.8;i:1;d:72.8;}i:16;a:2:{i:0;d:7.3;i:1;d:68.6;}i:17;a:2:{i:0;d:5.8;i:1;d:61.3;}i:18;a:2:{i:0;d:5.8;i:1;d:61.3;}}s:1:\"o\";a:19:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;d:1.1;}i:4;a:2:{i:0;d:0.3;i:1;d:0.6;}i:5;a:2:{i:0;d:0.6;i:1;d:0.2;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:0.7;i:1;i:0;}i:8;a:2:{i:0;d:0.5;i:1;i:0;}i:9;a:2:{i:0;i:0;i:1;i:0;}i:10;a:2:{i:0;i:0;i:1;i:0;}i:11;a:2:{i:0;d:-1.1;i:1;d:0.4;}i:12;a:2:{i:0;d:-1.2;i:1;d:0.2;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;d:-2.8;i:1;i:0;}i:15;a:2:{i:0;i:-2;i:1;d:-0.9;}i:16;a:2:{i:0;i:-1;i:1;d:-1.9;}i:17;a:2:{i:0;i:0;i:1;i:0;}i:18;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:36;a:7:{s:3:\"ind\";i:50;s:2:\"ty\";i:3;s:6:\"parent\";i:41;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:264.658;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:37;a:8:{s:3:\"ind\";i:53;s:2:\"ty\";i:4;s:6:\"parent\";i:52;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:3:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:6:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:6:{i:0;a:2:{i:0;d:15.6;i:1;d:31.6;}i:1;a:2:{i:0;d:16.4;i:1;d:40.5;}i:2;a:2:{i:0;d:16.4;i:1;d:73.3;}i:3;a:2:{i:0;d:3.4;i:1;d:73.3;}i:4;a:2:{i:0;d:3.4;i:1;d:31.6;}i:5;a:2:{i:0;d:15.6;i:1;d:31.6;}}s:1:\"o\";a:6:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:24:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-0.8;i:1;d:2.5;}i:4;a:2:{i:0;d:-1.4;i:1;d:1.7;}i:5;a:2:{i:0;i:-2;i:1;d:0.9;}i:6;a:2:{i:0;d:-2.4;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:-1.6;i:1;d:-0.6;}i:9;a:2:{i:0;d:-1.2;i:1;d:-1.3;}i:10;a:2:{i:0;d:-0.6;i:1;d:-2.1;}i:11;a:2:{i:0;i:0;i:1;i:-3;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;d:0.5;i:1;d:0.9;}i:17;a:2:{i:0;d:0.9;i:1;d:0.3;}i:18;a:2:{i:0;d:1.3;i:1;i:0;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;d:0.9;i:1;d:-0.5;}i:21;a:2:{i:0;d:0.6;i:1;d:-0.9;}i:22;a:2:{i:0;d:0.2;i:1;d:-1.2;}i:23;a:2:{i:0;i:0;i:1;d:-1.5;}}s:1:\"v\";a:24:{i:0;a:2:{i:0;d:14.9;i:1;i:51;}i:1;a:2:{i:0;d:14.9;i:1;i:51;}i:2;a:2:{i:0;d:11.8;i:1;d:51.1;}i:3;a:2:{i:0;i:13;i:1;d:42.5;}i:4;a:2:{i:0;d:16.3;i:1;d:36.1;}i:5;a:2:{i:0;d:21.4;i:1;d:32.2;}i:6;a:2:{i:0;d:27.9;i:1;d:30.8;}i:7;a:2:{i:0;d:27.9;i:1;d:30.8;}i:8;a:2:{i:0;d:33.2;i:1;d:31.6;}i:9;a:2:{i:0;d:37.4;i:1;d:34.4;}i:10;a:2:{i:0;d:40.1;i:1;d:39.4;}i:11;a:2:{i:0;i:41;i:1;i:47;}i:12;a:2:{i:0;i:41;i:1;i:47;}i:13;a:2:{i:0;i:41;i:1;d:73.3;}i:14;a:2:{i:0;i:28;i:1;d:73.3;}i:15;a:2:{i:0;i:28;i:1;i:47;}i:16;a:2:{i:0;d:27.3;i:1;d:43.1;}i:17;a:2:{i:0;d:25.3;i:1;d:41.3;}i:18;a:2:{i:0;d:22.1;i:1;d:40.8;}i:19;a:2:{i:0;d:22.1;i:1;d:40.8;}i:20;a:2:{i:0;d:18.7;i:1;d:41.6;}i:21;a:2:{i:0;d:16.5;i:1;d:43.7;}i:22;a:2:{i:0;d:15.3;i:1;d:46.9;}i:23;a:2:{i:0;d:14.9;i:1;i:51;}}s:1:\"o\";a:24:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-3.2;}i:3;a:2:{i:0;d:0.8;i:1;d:-2.5;}i:4;a:2:{i:0;d:1.4;i:1;d:-1.7;}i:5;a:2:{i:0;i:2;i:1;d:-0.9;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:1.9;i:1;i:0;}i:8;a:2:{i:0;d:1.6;i:1;d:0.6;}i:9;a:2:{i:0;d:1.2;i:1;d:1.3;}i:10;a:2:{i:0;d:0.6;i:1;d:2.1;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;d:-1.7;}i:16;a:2:{i:0;d:-0.5;i:1;d:-0.9;}i:17;a:2:{i:0;d:-0.9;i:1;d:-0.3;}i:18;a:2:{i:0;i:0;i:1;i:0;}i:19;a:2:{i:0;d:-1.3;i:1;i:0;}i:20;a:2:{i:0;d:-0.9;i:1;d:0.5;}i:21;a:2:{i:0;d:-0.6;i:1;d:0.9;}i:22;a:2:{i:0;d:-0.2;i:1;d:1.2;}i:23;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:38;a:7:{s:3:\"ind\";i:52;s:2:\"ty\";i:3;s:6:\"parent\";i:41;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:220.066;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:39;a:8:{s:3:\"ind\";i:55;s:2:\"ty\";i:4;s:6:\"parent\";i:54;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:45:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;d:2.7;i:1;d:1.1;}i:3;a:2:{i:0;d:1.8;i:1;d:1.9;}i:4;a:2:{i:0;i:1;i:1;d:2.4;}i:5;a:2:{i:0;i:0;i:1;d:2.7;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:-0.8;i:1;d:2.6;}i:9;a:2:{i:0;d:-1.7;i:1;i:2;}i:10;a:2:{i:0;d:-2.5;i:1;d:1.1;}i:11;a:2:{i:0;d:-3.3;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;d:-2.3;i:1;i:-1;}i:14;a:2:{i:0;d:-1.6;i:1;d:-1.8;}i:15;a:2:{i:0;d:-0.9;i:1;d:-2.5;}i:16;a:2:{i:0;i:0;i:1;d:-3.1;}i:17;a:2:{i:0;i:0;i:1;i:0;}i:18;a:2:{i:0;i:0;i:1;i:0;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;i:0;i:1;i:0;}i:21;a:2:{i:0;i:0;i:1;i:0;}i:22;a:2:{i:0;i:0;i:1;i:0;}i:23;a:2:{i:0;d:0.5;i:1;i:1;}i:24;a:2:{i:0;i:1;i:1;d:0.5;}i:25;a:2:{i:0;d:1.4;i:1;i:0;}i:26;a:2:{i:0;i:0;i:1;i:0;}i:27;a:2:{i:0;d:0.9;i:1;d:-0.6;}i:28;a:2:{i:0;d:0.5;i:1;d:-1.1;}i:29;a:2:{i:0;d:0.2;i:1;d:-1.4;}i:30;a:2:{i:0;i:0;i:1;d:-1.5;}i:31;a:2:{i:0;i:0;i:1;i:0;}i:32;a:2:{i:0;i:0;i:1;i:0;}i:33;a:2:{i:0;d:-0.4;i:1;d:-1.3;}i:34;a:2:{i:0;d:-0.8;i:1;d:-0.9;}i:35;a:2:{i:0;d:-1.1;i:1;d:-0.5;}i:36;a:2:{i:0;d:-1.5;i:1;i:0;}i:37;a:2:{i:0;i:0;i:1;i:0;}i:38;a:2:{i:0;d:-1.7;i:1;d:0.7;}i:39;a:2:{i:0;d:-1.2;i:1;d:1.5;}i:40;a:2:{i:0;i:0;i:1;i:0;}i:41;a:2:{i:0;i:0;i:1;i:0;}i:42;a:2:{i:0;d:1.6;i:1;d:-1.1;}i:43;a:2:{i:0;d:2.2;i:1;d:-0.7;}i:44;a:2:{i:0;d:2.7;i:1;i:0;}}s:1:\"v\";a:45:{i:0;a:2:{i:0;d:23.9;i:1;d:74.1;}i:1;a:2:{i:0;d:23.9;i:1;d:74.1;}i:2;a:2:{i:0;d:14.8;i:1;d:72.5;}i:3;a:2:{i:0;i:8;i:1;i:68;}i:4;a:2:{i:0;d:3.8;i:1;d:61.6;}i:5;a:2:{i:0;d:2.4;i:1;d:53.8;}i:6;a:2:{i:0;d:2.4;i:1;d:53.8;}i:7;a:2:{i:0;d:2.4;i:1;d:52.3;}i:8;a:2:{i:0;d:3.6;i:1;d:43.8;}i:9;a:2:{i:0;d:7.4;i:1;i:37;}i:10;a:2:{i:0;d:13.7;i:1;d:32.4;}i:11;a:2:{i:0;d:22.5;i:1;d:30.8;}i:12;a:2:{i:0;d:22.5;i:1;d:30.8;}i:13;a:2:{i:0;d:30.4;i:1;d:32.2;}i:14;a:2:{i:0;d:36.4;i:1;d:36.3;}i:15;a:2:{i:0;d:40.1;i:1;d:42.7;}i:16;a:2:{i:0;d:41.4;i:1;d:51.2;}i:17;a:2:{i:0;d:41.4;i:1;d:51.2;}i:18;a:2:{i:0;d:41.4;i:1;d:56.5;}i:19;a:2:{i:0;d:7.3;i:1;d:56.5;}i:20;a:2:{i:0;d:7.3;i:1;d:48.4;}i:21;a:2:{i:0;d:28.7;i:1;d:48.4;}i:22;a:2:{i:0;d:28.7;i:1;d:47.4;}i:23;a:2:{i:0;i:28;i:1;d:43.8;}i:24;a:2:{i:0;d:25.8;i:1;d:41.6;}i:25;a:2:{i:0;d:22.4;i:1;d:40.8;}i:26;a:2:{i:0;d:22.4;i:1;d:40.8;}i:27;a:2:{i:0;d:18.9;i:1;d:41.7;}i:28;a:2:{i:0;d:16.8;i:1;d:44.3;}i:29;a:2:{i:0;d:15.7;i:1;d:47.9;}i:30;a:2:{i:0;d:15.4;i:1;d:52.3;}i:31;a:2:{i:0;d:15.4;i:1;d:52.3;}i:32;a:2:{i:0;d:15.4;i:1;d:53.8;}i:33;a:2:{i:0;i:16;i:1;i:58;}i:34;a:2:{i:0;d:17.9;i:1;d:61.2;}i:35;a:2:{i:0;d:20.8;i:1;d:63.3;}i:36;a:2:{i:0;d:24.7;i:1;i:64;}i:37;a:2:{i:0;d:24.7;i:1;i:64;}i:38;a:2:{i:0;i:30;i:1;i:63;}i:39;a:2:{i:0;d:34.4;i:1;d:59.7;}i:40;a:2:{i:0;d:34.4;i:1;d:59.7;}i:41;a:2:{i:0;d:40.3;i:1;d:66.7;}i:42;a:2:{i:0;d:36.7;i:1;d:70.2;}i:43;a:2:{i:0;d:31.1;i:1;i:73;}i:44;a:2:{i:0;d:23.9;i:1;d:74.1;}}s:1:\"o\";a:45:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:-3.4;i:1;i:0;}i:2;a:2:{i:0;d:-2.7;i:1;d:-1.1;}i:3;a:2:{i:0;d:-1.8;i:1;d:-1.9;}i:4;a:2:{i:0;i:-1;i:1;d:-2.4;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;d:-3.1;}i:8;a:2:{i:0;d:0.8;i:1;d:-2.6;}i:9;a:2:{i:0;d:1.7;i:1;i:-2;}i:10;a:2:{i:0;d:2.5;i:1;d:-1.1;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:3;i:1;i:0;}i:13;a:2:{i:0;d:2.3;i:1;i:1;}i:14;a:2:{i:0;d:1.6;i:1;d:1.8;}i:15;a:2:{i:0;d:0.9;i:1;d:2.5;}i:16;a:2:{i:0;i:0;i:1;i:0;}i:17;a:2:{i:0;i:0;i:1;i:0;}i:18;a:2:{i:0;i:0;i:1;i:0;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;i:0;i:1;i:0;}i:21;a:2:{i:0;i:0;i:1;i:0;}i:22;a:2:{i:0;i:0;i:1;d:-1.4;}i:23;a:2:{i:0;d:-0.5;i:1;i:-1;}i:24;a:2:{i:0;i:-1;i:1;d:-0.5;}i:25;a:2:{i:0;i:0;i:1;i:0;}i:26;a:2:{i:0;d:-1.4;i:1;i:0;}i:27;a:2:{i:0;d:-0.9;i:1;d:0.6;}i:28;a:2:{i:0;d:-0.5;i:1;d:1.1;}i:29;a:2:{i:0;d:-0.2;i:1;d:1.4;}i:30;a:2:{i:0;i:0;i:1;i:0;}i:31;a:2:{i:0;i:0;i:1;i:0;}i:32;a:2:{i:0;i:0;i:1;d:1.5;}i:33;a:2:{i:0;d:0.4;i:1;d:1.3;}i:34;a:2:{i:0;d:0.8;i:1;d:0.9;}i:35;a:2:{i:0;d:1.1;i:1;d:0.5;}i:36;a:2:{i:0;i:0;i:1;i:0;}i:37;a:2:{i:0;d:1.8;i:1;i:0;}i:38;a:2:{i:0;d:1.7;i:1;d:-0.7;}i:39;a:2:{i:0;i:0;i:1;i:0;}i:40;a:2:{i:0;i:0;i:1;i:0;}i:41;a:2:{i:0;d:-0.8;i:1;d:1.2;}i:42;a:2:{i:0;d:-1.6;i:1;d:1.1;}i:43;a:2:{i:0;d:-2.2;i:1;d:0.7;}i:44;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:40;a:7:{s:3:\"ind\";i:54;s:2:\"ty\";i:3;s:6:\"parent\";i:41;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:177.017;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:41;a:8:{s:3:\"ind\";i:57;s:2:\"ty\";i:4;s:6:\"parent\";i:56;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:4:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:6:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:6:{i:0;a:2:{i:0;i:16;i:1;d:31.6;}i:1;a:2:{i:0;d:16.8;i:1;d:40.4;}i:2;a:2:{i:0;d:16.8;i:1;d:73.3;}i:3;a:2:{i:0;d:3.8;i:1;d:73.3;}i:4;a:2:{i:0;d:3.8;i:1;d:31.6;}i:5;a:2:{i:0;i:16;i:1;d:31.6;}}s:1:\"o\";a:6:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}i:5;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:24:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-0.7;i:1;d:2.5;}i:4;a:2:{i:0;d:-1.4;i:1;d:1.8;}i:5;a:2:{i:0;i:-2;i:1;i:1;}i:6;a:2:{i:0;d:-2.6;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:-1.5;i:1;d:-0.6;}i:9;a:2:{i:0;d:-1.1;i:1;d:-1.2;}i:10;a:2:{i:0;d:-0.6;i:1;d:-1.9;}i:11;a:2:{i:0;i:0;i:1;d:-2.6;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;d:0.4;i:1;d:0.9;}i:17;a:2:{i:0;d:0.7;i:1;d:0.3;}i:18;a:2:{i:0;d:1.1;i:1;i:0;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;d:0.9;i:1;d:-0.5;}i:21;a:2:{i:0;d:0.6;i:1;d:-0.9;}i:22;a:2:{i:0;d:0.3;i:1;d:-1.2;}i:23;a:2:{i:0;i:0;i:1;d:-1.5;}}s:1:\"v\";a:24:{i:0;a:2:{i:0;d:15.2;i:1;i:51;}i:1;a:2:{i:0;d:15.2;i:1;i:51;}i:2;a:2:{i:0;d:12.2;i:1;d:51.1;}i:3;a:2:{i:0;d:13.3;i:1;i:43;}i:4;a:2:{i:0;d:16.4;i:1;d:36.5;}i:5;a:2:{i:0;d:21.4;i:1;d:32.3;}i:6;a:2:{i:0;d:28.3;i:1;d:30.8;}i:7;a:2:{i:0;d:28.3;i:1;d:30.8;}i:8;a:2:{i:0;d:33.3;i:1;d:31.6;}i:9;a:2:{i:0;d:37.1;i:1;d:34.2;}i:10;a:2:{i:0;d:39.6;i:1;d:38.7;}i:11;a:2:{i:0;d:40.5;i:1;d:45.4;}i:12;a:2:{i:0;d:40.5;i:1;d:45.4;}i:13;a:2:{i:0;d:40.5;i:1;d:73.3;}i:14;a:2:{i:0;d:27.5;i:1;d:73.3;}i:15;a:2:{i:0;d:27.5;i:1;d:47.1;}i:16;a:2:{i:0;d:26.9;i:1;d:43.1;}i:17;a:2:{i:0;d:25.2;i:1;d:41.3;}i:18;a:2:{i:0;d:22.5;i:1;d:40.8;}i:19;a:2:{i:0;d:22.5;i:1;d:40.8;}i:20;a:2:{i:0;d:19.4;i:1;d:41.6;}i:21;a:2:{i:0;d:17.1;i:1;d:43.7;}i:22;a:2:{i:0;d:15.7;i:1;d:46.9;}i:23;a:2:{i:0;d:15.2;i:1;i:51;}}s:1:\"o\";a:24:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-2.9;}i:3;a:2:{i:0;d:0.7;i:1;d:-2.5;}i:4;a:2:{i:0;d:1.4;i:1;d:-1.8;}i:5;a:2:{i:0;i:2;i:1;i:-1;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:1.8;i:1;i:0;}i:8;a:2:{i:0;d:1.5;i:1;d:0.6;}i:9;a:2:{i:0;d:1.1;i:1;d:1.2;}i:10;a:2:{i:0;d:0.6;i:1;d:1.9;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;d:-1.8;}i:16;a:2:{i:0;d:-0.4;i:1;d:-0.9;}i:17;a:2:{i:0;d:-0.7;i:1;d:-0.3;}i:18;a:2:{i:0;i:0;i:1;i:0;}i:19;a:2:{i:0;d:-1.1;i:1;i:0;}i:20;a:2:{i:0;d:-0.9;i:1;d:0.5;}i:21;a:2:{i:0;d:-0.6;i:1;d:0.9;}i:22;a:2:{i:0;d:-0.3;i:1;d:1.2;}i:23;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:24:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;d:-0.7;i:1;d:2.5;}i:4;a:2:{i:0;d:-1.3;i:1;d:1.8;}i:5;a:2:{i:0;i:-2;i:1;i:1;}i:6;a:2:{i:0;d:-2.6;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:-1.6;i:1;d:-0.6;}i:9;a:2:{i:0;d:-1.2;i:1;d:-1.3;}i:10;a:2:{i:0;d:-0.6;i:1;d:-2.1;}i:11;a:2:{i:0;i:0;i:1;i:-3;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;i:0;}i:16;a:2:{i:0;d:0.4;i:1;d:0.9;}i:17;a:2:{i:0;d:0.7;i:1;d:0.3;}i:18;a:2:{i:0;i:1;i:1;i:0;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;d:0.9;i:1;d:-0.5;}i:21;a:2:{i:0;d:0.6;i:1;d:-0.9;}i:22;a:2:{i:0;d:0.3;i:1;d:-1.2;}i:23;a:2:{i:0;i:0;i:1;d:-1.5;}}s:1:\"v\";a:24:{i:0;a:2:{i:0;i:39;i:1;i:51;}i:1;a:2:{i:0;i:39;i:1;i:51;}i:2;a:2:{i:0;d:35.4;i:1;d:51.1;}i:3;a:2:{i:0;d:36.4;i:1;i:43;}i:4;a:2:{i:0;d:39.4;i:1;d:36.5;}i:5;a:2:{i:0;d:44.3;i:1;d:32.3;}i:6;a:2:{i:0;d:51.2;i:1;d:30.8;}i:7;a:2:{i:0;d:51.2;i:1;d:30.8;}i:8;a:2:{i:0;d:56.5;i:1;d:31.6;}i:9;a:2:{i:0;d:60.6;i:1;d:34.4;}i:10;a:2:{i:0;d:63.3;i:1;d:39.4;}i:11;a:2:{i:0;d:64.3;i:1;i:47;}i:12;a:2:{i:0;d:64.3;i:1;i:47;}i:13;a:2:{i:0;d:64.3;i:1;d:73.3;}i:14;a:2:{i:0;d:51.2;i:1;d:73.3;}i:15;a:2:{i:0;d:51.2;i:1;i:47;}i:16;a:2:{i:0;d:50.6;i:1;d:43.1;}i:17;a:2:{i:0;d:48.9;i:1;d:41.3;}i:18;a:2:{i:0;d:46.3;i:1;d:40.8;}i:19;a:2:{i:0;d:46.3;i:1;d:40.8;}i:20;a:2:{i:0;i:43;i:1;d:41.6;}i:21;a:2:{i:0;d:40.8;i:1;d:43.7;}i:22;a:2:{i:0;d:39.5;i:1;d:46.9;}i:23;a:2:{i:0;i:39;i:1;i:51;}}s:1:\"o\";a:24:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;d:-2.9;}i:3;a:2:{i:0;d:0.7;i:1;d:-2.5;}i:4;a:2:{i:0;d:1.3;i:1;d:-1.8;}i:5;a:2:{i:0;i:2;i:1;i:-1;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;d:1.9;i:1;i:0;}i:8;a:2:{i:0;d:1.6;i:1;d:0.6;}i:9;a:2:{i:0;d:1.2;i:1;d:1.3;}i:10;a:2:{i:0;d:0.6;i:1;d:2.1;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;i:0;i:1;i:0;}i:14;a:2:{i:0;i:0;i:1;i:0;}i:15;a:2:{i:0;i:0;i:1;d:-1.7;}i:16;a:2:{i:0;d:-0.4;i:1;d:-0.9;}i:17;a:2:{i:0;d:-0.7;i:1;d:-0.3;}i:18;a:2:{i:0;i:0;i:1;i:0;}i:19;a:2:{i:0;d:-1.2;i:1;i:0;}i:20;a:2:{i:0;d:-0.9;i:1;d:0.5;}i:21;a:2:{i:0;d:-0.6;i:1;d:0.9;}i:22;a:2:{i:0;d:-0.3;i:1;d:1.2;}i:23;a:2:{i:0;i:0;i:1;i:0;}}}}}i:3;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:42;a:7:{s:3:\"ind\";i:56;s:2:\"ty\";i:3;s:6:\"parent\";i:41;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:108.972;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:43;a:8:{s:3:\"ind\";i:59;s:2:\"ty\";i:4;s:6:\"parent\";i:58;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:45:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;d:2.7;i:1;d:1.1;}i:3;a:2:{i:0;d:1.8;i:1;d:1.9;}i:4;a:2:{i:0;i:1;i:1;d:2.4;}i:5;a:2:{i:0;i:0;i:1;d:2.7;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;i:0;}i:8;a:2:{i:0;d:-0.8;i:1;d:2.6;}i:9;a:2:{i:0;d:-1.7;i:1;i:2;}i:10;a:2:{i:0;d:-2.5;i:1;d:1.1;}i:11;a:2:{i:0;d:-3.3;i:1;i:0;}i:12;a:2:{i:0;i:0;i:1;i:0;}i:13;a:2:{i:0;d:-2.3;i:1;i:-1;}i:14;a:2:{i:0;d:-1.6;i:1;d:-1.8;}i:15;a:2:{i:0;d:-0.9;i:1;d:-2.5;}i:16;a:2:{i:0;i:0;i:1;d:-3.1;}i:17;a:2:{i:0;i:0;i:1;i:0;}i:18;a:2:{i:0;i:0;i:1;i:0;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;i:0;i:1;i:0;}i:21;a:2:{i:0;i:0;i:1;i:0;}i:22;a:2:{i:0;i:0;i:1;i:0;}i:23;a:2:{i:0;d:0.5;i:1;i:1;}i:24;a:2:{i:0;i:1;i:1;d:0.5;}i:25;a:2:{i:0;d:1.4;i:1;i:0;}i:26;a:2:{i:0;i:0;i:1;i:0;}i:27;a:2:{i:0;d:0.9;i:1;d:-0.6;}i:28;a:2:{i:0;d:0.5;i:1;d:-1.1;}i:29;a:2:{i:0;d:0.2;i:1;d:-1.4;}i:30;a:2:{i:0;i:0;i:1;d:-1.5;}i:31;a:2:{i:0;i:0;i:1;i:0;}i:32;a:2:{i:0;i:0;i:1;i:0;}i:33;a:2:{i:0;d:-0.4;i:1;d:-1.3;}i:34;a:2:{i:0;d:-0.8;i:1;d:-0.9;}i:35;a:2:{i:0;d:-1.1;i:1;d:-0.5;}i:36;a:2:{i:0;d:-1.5;i:1;i:0;}i:37;a:2:{i:0;i:0;i:1;i:0;}i:38;a:2:{i:0;d:-1.7;i:1;d:0.7;}i:39;a:2:{i:0;d:-1.2;i:1;d:1.5;}i:40;a:2:{i:0;i:0;i:1;i:0;}i:41;a:2:{i:0;i:0;i:1;i:0;}i:42;a:2:{i:0;d:1.6;i:1;d:-1.1;}i:43;a:2:{i:0;d:2.2;i:1;d:-0.7;}i:44;a:2:{i:0;d:2.7;i:1;i:0;}}s:1:\"v\";a:45:{i:0;a:2:{i:0;d:23.9;i:1;d:74.1;}i:1;a:2:{i:0;d:23.9;i:1;d:74.1;}i:2;a:2:{i:0;d:14.8;i:1;d:72.5;}i:3;a:2:{i:0;i:8;i:1;i:68;}i:4;a:2:{i:0;d:3.8;i:1;d:61.6;}i:5;a:2:{i:0;d:2.4;i:1;d:53.8;}i:6;a:2:{i:0;d:2.4;i:1;d:53.8;}i:7;a:2:{i:0;d:2.4;i:1;d:52.3;}i:8;a:2:{i:0;d:3.6;i:1;d:43.8;}i:9;a:2:{i:0;d:7.4;i:1;i:37;}i:10;a:2:{i:0;d:13.7;i:1;d:32.4;}i:11;a:2:{i:0;d:22.5;i:1;d:30.8;}i:12;a:2:{i:0;d:22.5;i:1;d:30.8;}i:13;a:2:{i:0;d:30.4;i:1;d:32.2;}i:14;a:2:{i:0;d:36.4;i:1;d:36.3;}i:15;a:2:{i:0;d:40.1;i:1;d:42.7;}i:16;a:2:{i:0;d:41.4;i:1;d:51.2;}i:17;a:2:{i:0;d:41.4;i:1;d:51.2;}i:18;a:2:{i:0;d:41.4;i:1;d:56.5;}i:19;a:2:{i:0;d:7.3;i:1;d:56.5;}i:20;a:2:{i:0;d:7.3;i:1;d:48.4;}i:21;a:2:{i:0;d:28.7;i:1;d:48.4;}i:22;a:2:{i:0;d:28.7;i:1;d:47.4;}i:23;a:2:{i:0;i:28;i:1;d:43.8;}i:24;a:2:{i:0;d:25.8;i:1;d:41.6;}i:25;a:2:{i:0;d:22.4;i:1;d:40.8;}i:26;a:2:{i:0;d:22.4;i:1;d:40.8;}i:27;a:2:{i:0;d:18.9;i:1;d:41.7;}i:28;a:2:{i:0;d:16.8;i:1;d:44.3;}i:29;a:2:{i:0;d:15.7;i:1;d:47.9;}i:30;a:2:{i:0;d:15.4;i:1;d:52.3;}i:31;a:2:{i:0;d:15.4;i:1;d:52.3;}i:32;a:2:{i:0;d:15.4;i:1;d:53.8;}i:33;a:2:{i:0;i:16;i:1;i:58;}i:34;a:2:{i:0;d:17.9;i:1;d:61.2;}i:35;a:2:{i:0;d:20.8;i:1;d:63.3;}i:36;a:2:{i:0;d:24.7;i:1;i:64;}i:37;a:2:{i:0;d:24.7;i:1;i:64;}i:38;a:2:{i:0;i:30;i:1;i:63;}i:39;a:2:{i:0;d:34.4;i:1;d:59.7;}i:40;a:2:{i:0;d:34.4;i:1;d:59.7;}i:41;a:2:{i:0;d:40.3;i:1;d:66.7;}i:42;a:2:{i:0;d:36.7;i:1;d:70.2;}i:43;a:2:{i:0;d:31.1;i:1;i:73;}i:44;a:2:{i:0;d:23.9;i:1;d:74.1;}}s:1:\"o\";a:45:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;d:-3.4;i:1;i:0;}i:2;a:2:{i:0;d:-2.7;i:1;d:-1.1;}i:3;a:2:{i:0;d:-1.8;i:1;d:-1.9;}i:4;a:2:{i:0;i:-1;i:1;d:-2.4;}i:5;a:2:{i:0;i:0;i:1;i:0;}i:6;a:2:{i:0;i:0;i:1;i:0;}i:7;a:2:{i:0;i:0;i:1;d:-3.1;}i:8;a:2:{i:0;d:0.8;i:1;d:-2.6;}i:9;a:2:{i:0;d:1.7;i:1;i:-2;}i:10;a:2:{i:0;d:2.5;i:1;d:-1.1;}i:11;a:2:{i:0;i:0;i:1;i:0;}i:12;a:2:{i:0;i:3;i:1;i:0;}i:13;a:2:{i:0;d:2.3;i:1;i:1;}i:14;a:2:{i:0;d:1.6;i:1;d:1.8;}i:15;a:2:{i:0;d:0.9;i:1;d:2.5;}i:16;a:2:{i:0;i:0;i:1;i:0;}i:17;a:2:{i:0;i:0;i:1;i:0;}i:18;a:2:{i:0;i:0;i:1;i:0;}i:19;a:2:{i:0;i:0;i:1;i:0;}i:20;a:2:{i:0;i:0;i:1;i:0;}i:21;a:2:{i:0;i:0;i:1;i:0;}i:22;a:2:{i:0;i:0;i:1;d:-1.4;}i:23;a:2:{i:0;d:-0.5;i:1;i:-1;}i:24;a:2:{i:0;i:-1;i:1;d:-0.5;}i:25;a:2:{i:0;i:0;i:1;i:0;}i:26;a:2:{i:0;d:-1.4;i:1;i:0;}i:27;a:2:{i:0;d:-0.9;i:1;d:0.6;}i:28;a:2:{i:0;d:-0.5;i:1;d:1.1;}i:29;a:2:{i:0;d:-0.2;i:1;d:1.4;}i:30;a:2:{i:0;i:0;i:1;i:0;}i:31;a:2:{i:0;i:0;i:1;i:0;}i:32;a:2:{i:0;i:0;i:1;d:1.5;}i:33;a:2:{i:0;d:0.4;i:1;d:1.3;}i:34;a:2:{i:0;d:0.8;i:1;d:0.9;}i:35;a:2:{i:0;d:1.1;i:1;d:0.5;}i:36;a:2:{i:0;i:0;i:1;i:0;}i:37;a:2:{i:0;d:1.8;i:1;i:0;}i:38;a:2:{i:0;d:1.7;i:1;d:-0.7;}i:39;a:2:{i:0;i:0;i:1;i:0;}i:40;a:2:{i:0;i:0;i:1;i:0;}i:41;a:2:{i:0;d:-0.8;i:1;d:1.2;}i:42;a:2:{i:0;d:-1.6;i:1;d:1.1;}i:43;a:2:{i:0;d:-2.2;i:1;d:0.7;}i:44;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:44;a:7:{s:3:\"ind\";i:58;s:2:\"ty\";i:3;s:6:\"parent\";i:41;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:65.923;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:45;a:8:{s:3:\"ind\";i:61;s:2:\"ty\";i:4;s:6:\"parent\";i:60;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:4.4;i:1;i:14;}i:1;a:2:{i:0;d:17.4;i:1;i:14;}i:2;a:2:{i:0;d:17.4;i:1;d:73.3;}i:3;a:2:{i:0;d:4.4;i:1;d:73.3;}i:4;a:2:{i:0;d:4.4;i:1;i:14;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:46;a:7:{s:3:\"ind\";i:60;s:2:\"ty\";i:3;s:6:\"parent\";i:41;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:44.206;i:1;i:0;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:47;a:8:{s:3:\"ind\";i:63;s:2:\"ty\";i:4;s:6:\"parent\";i:62;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:5:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;i:13;i:1;d:62.9;}i:1;a:2:{i:0;d:42.9;i:1;d:62.9;}i:2;a:2:{i:0;d:42.9;i:1;d:73.3;}i:3;a:2:{i:0;i:13;i:1;d:73.3;}i:4;a:2:{i:0;i:13;i:1;d:62.9;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;d:4.3;i:1;d:17.1;}i:1;a:2:{i:0;d:17.8;i:1;d:17.1;}i:2;a:2:{i:0;d:17.8;i:1;d:73.3;}i:3;a:2:{i:0;d:4.3;i:1;d:73.3;}i:4;a:2:{i:0;d:4.3;i:1;d:17.1;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}}}}i:2;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;i:13;i:1;d:39.4;}i:1;a:2:{i:0;d:39.1;i:1;d:39.4;}i:2;a:2:{i:0;d:39.1;i:1;d:49.5;}i:3;a:2:{i:0;i:13;i:1;d:49.5;}i:4;a:2:{i:0;i:13;i:1;d:39.4;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}}}}i:3;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;i:13;i:1;d:17.1;}i:1;a:2:{i:0;i:43;i:1;d:17.1;}i:2;a:2:{i:0;i:43;i:1;d:27.6;}i:3;a:2:{i:0;i:13;i:1;d:27.6;}i:4;a:2:{i:0;i:13;i:1;d:17.1;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}i:4;a:2:{i:0;i:0;i:1;i:0;}}}}}i:4;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:48;a:7:{s:3:\"ind\";i:62;s:2:\"ty\";i:3;s:6:\"parent\";i:41;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:49;a:7:{s:3:\"ind\";i:41;s:2:\"ty\";i:3;s:6:\"parent\";i:40;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:50;a:7:{s:3:\"ind\";i:40;s:2:\"ty\";i:3;s:6:\"parent\";i:12;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:47.351;i:1;d:1.311;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:51;a:6:{s:3:\"ind\";i:12;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:1;i:1;i:-14;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}}}i:3;a:2:{s:2:\"id\";s:2:\"70\";s:6:\"layers\";a:2:{i:0;a:7:{s:3:\"ind\";i:69;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:16;i:1;i:16;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:32;i:1;i:32;}}}i:1;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:0;i:1;i:0;i:2;i:0;i:3;i:0;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}}}}i:1;a:7:{s:3:\"ind\";i:0;s:2:\"ty\";i:4;s:2:\"ks\";a:1:{s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:133.33;i:1;d:133.33;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:1:{i:0;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:2:{i:0;a:2:{s:2:\"ty\";s:2:\"gr\";s:2:\"it\";a:7:{i:0;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:5:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;d:-6.63;}i:2;a:2:{i:0;d:-6.63;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;d:6.63;}i:4;a:2:{i:0;d:6.63;i:1;i:0;}}s:1:\"o\";a:5:{i:0;a:2:{i:0;d:-6.63;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;d:6.63;}i:2;a:2:{i:0;d:6.63;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;d:-6.63;}i:4;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:5:{i:0;a:2:{i:0;i:12;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:12;}i:2;a:2:{i:0;i:12;i:1;i:24;}i:3;a:2:{i:0;i:24;i:1;i:12;}i:4;a:2:{i:0;i:12;i:1;i:0;}}}}}i:1;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:4:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"o\";a:4:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:4:{i:0;a:2:{i:0;d:8.4;i:1;i:18;}i:1;a:2:{i:0;i:6;i:1;i:18;}i:2;a:2:{i:0;i:6;i:1;i:6;}i:3;a:2:{i:0;d:8.4;i:1;i:6;}}}}}i:2;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:4:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"o\";a:4:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:4:{i:0;a:2:{i:0;i:18;i:1;i:18;}i:1;a:2:{i:0;d:10.8;i:1;i:18;}i:2;a:2:{i:0;d:10.8;i:1;d:15.6;}i:3;a:2:{i:0;i:18;i:1;d:15.6;}}}}}i:3;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:4:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"o\";a:4:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:4:{i:0;a:2:{i:0;i:18;i:1;d:13.2;}i:1;a:2:{i:0;d:10.8;i:1;d:13.2;}i:2;a:2:{i:0;d:10.8;i:1;d:10.8;}i:3;a:2:{i:0;i:18;i:1;d:10.8;}}}}}i:4;a:2:{s:2:\"ty\";s:2:\"sh\";s:2:\"ks\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{s:1:\"c\";b:1;s:1:\"i\";a:4:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"o\";a:4:{i:0;a:2:{i:0;i:0;i:1;i:0;}i:1;a:2:{i:0;i:0;i:1;i:0;}i:2;a:2:{i:0;i:0;i:1;i:0;}i:3;a:2:{i:0;i:0;i:1;i:0;}}s:1:\"v\";a:4:{i:0;a:2:{i:0;i:18;i:1;d:8.4;}i:1;a:2:{i:0;d:10.8;i:1;d:8.4;}i:2;a:2:{i:0;d:10.8;i:1;i:6;}i:3;a:2:{i:0;i:18;i:1;i:6;}}}}}i:5;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:1;i:1;i:1;i:2;i:1;i:3;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}i:6;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}i:1;a:2:{s:2:\"ty\";s:2:\"tr\";s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}}}}}i:4;a:2:{s:2:\"id\";s:2:\"73\";s:6:\"layers\";a:2:{i:0;a:10:{s:3:\"ind\";i:72;s:2:\"ty\";i:0;s:6:\"parent\";i:68;s:2:\"ks\";a:0:{}s:1:\"w\";i:32;s:1:\"h\";i:32;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:2:\"70\";}i:1;a:6:{s:3:\"ind\";i:68;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:468.75;i:1;d:468.75;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}}}i:5;a:2:{s:2:\"id\";s:2:\"79\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:78;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.804;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:181.607;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.804;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.804;i:1;d:813.803;}}}}}}}i:6;a:2:{s:2:\"id\";s:2:\"83\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:82;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.804;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:181.607;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.804;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.804;i:1;d:813.803;}}}}}}}i:7;a:2:{s:2:\"id\";s:2:\"87\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:86;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.804;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:181.607;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:111.6;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.739;i:1;d:0.728;}s:1:\"y\";a:2:{i:0;d:0.398;i:1;d:0.376;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.414;i:1;d:0.401;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.676;i:1;d:2117.513;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:111.6;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.72;s:1:\"y\";d:0.358;}s:1:\"o\";a:2:{s:1:\"x\";d:0.392;s:1:\"y\";d:0.001;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.506;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.816;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.506;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.816;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:111.6;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.733;i:1;d:0.728;}s:1:\"y\";a:2:{i:0;d:0.387;i:1;d:0.376;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.408;i:1;d:0.401;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:91.046;i:1;d:743.604;}s:1:\"h\";i:1;}}}}}}}}i:8;a:2:{s:2:\"id\";s:2:\"91\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:90;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.804;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:181.607;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:90;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.451;i:1;d:0.443;}s:1:\"y\";a:2:{i:0;d:0.517;i:1;d:0.556;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.565;i:1;d:0.559;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:87.71;i:1;d:750.7;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";i:90;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.444;s:1:\"y\";d:0.556;}s:1:\"o\";a:2:{s:1:\"x\";d:0.558;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.002;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.406;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.738;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.002;i:21;i:0;i:22;d:0.406;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.738;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:90;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.448;i:1;d:0.443;}s:1:\"y\";a:2:{i:0;d:0.534;i:1;d:0.556;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.562;i:1;d:0.559;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:96.432;i:1;d:-726.013;}s:1:\"h\";i:1;}}}}}}}}i:9;a:2:{s:2:\"id\";s:2:\"95\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:94;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.804;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:181.607;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:46.8;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.729;i:1;d:0.728;}s:1:\"y\";a:2:{i:0;d:0.538;i:1;d:0.583;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.744;i:1;d:0.73;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:87.409;i:1;d:625.459;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:46.8;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.728;s:1:\"y\";d:0.584;}s:1:\"o\";a:2:{s:1:\"x\";d:0.73;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.396;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.731;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.396;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.731;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:46.8;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.729;i:1;d:0.728;}s:1:\"y\";a:2:{i:0;d:0.558;i:1;d:0.583;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.738;i:1;d:0.73;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:96.954;i:1;d:-860.671;}s:1:\"h\";i:1;}}}}}}}}i:10;a:2:{s:2:\"id\";s:2:\"99\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:98;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.804;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:181.607;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:25.2;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.375;i:1;d:0.362;}s:1:\"y\";a:2:{i:0;d:0.553;i:1;d:0.59;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.53;i:1;d:0.524;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:82.2;s:1:\"s\";a:2:{i:0;d:87.327;i:1;d:591.4397139805983;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.626;i:1;d:0.532;}s:1:\"y\";a:2:{i:0;d:0.83;i:1;d:0.795;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.277;i:1;d:0.219;}s:1:\"y\";a:2:{i:0;d:0.525;i:1;d:0.43;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.018;i:1;d:70.633;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:25.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.085;s:1:\"y\";d:0.802;}s:1:\"o\";a:2:{s:1:\"x\";d:0.351;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;i:0;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.355;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.7;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;i:0;i:21;i:0;i:22;d:0.355;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.7;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:25.2;s:1:\"s\";a:2:{i:0;d:90.804;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.369;i:1;d:0.362;}s:1:\"y\";a:2:{i:0;d:0.569;i:1;d:0.59;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.527;i:1;d:0.524;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:82.2;s:1:\"s\";a:2:{i:0;d:97.096;i:1;d:-897.2474970922436;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.604;i:1;d:0.532;}s:1:\"y\";a:2:{i:0;d:0.823;i:1;d:0.795;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.263;i:1;d:0.219;}s:1:\"y\";a:2:{i:0;d:0.507;i:1;d:0.43;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:99.327;i:1;d:-1457.21;}s:1:\"h\";i:1;}}}}}}}}i:11;a:2:{s:2:\"id\";s:3:\"102\";s:6:\"layers\";a:6:{i:0;a:9:{s:3:\"ind\";i:81;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:182;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:2:\"79\";}i:1;a:9:{s:3:\"ind\";i:85;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:182;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:2:\"83\";}i:2;a:9:{s:3:\"ind\";i:89;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:182;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:2:\"87\";}i:3;a:9:{s:3:\"ind\";i:93;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:182;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:2:\"91\";}i:4;a:9:{s:3:\"ind\";i:97;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:182;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:2:\"95\";}i:5;a:9:{s:3:\"ind\";i:101;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:182;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:2:\"99\";}}}i:12;a:2:{s:2:\"id\";s:3:\"107\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:106;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;d:813.803;}}}}}}}i:13;a:2:{s:2:\"id\";s:3:\"111\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:110;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;d:813.803;}}}}}}}i:14;a:2:{s:2:\"id\";s:3:\"115\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:114;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:107.4;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.747;i:1;d:0.735;}s:1:\"y\";a:2:{i:0;d:0.399;i:1;d:0.375;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.425;i:1;d:0.41;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:89.279;i:1;d:2092.041;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:107.4;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.73;s:1:\"y\";d:0.363;}s:1:\"o\";a:2:{s:1:\"x\";d:0.404;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.504;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.815;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.504;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.815;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:107.4;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.741;i:1;d:0.735;}s:1:\"y\";a:2:{i:0;d:0.388;i:1;d:0.375;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.418;i:1;d:0.41;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:89.794;i:1;d:716.217;}s:1:\"h\";i:1;}}}}}}}}i:15;a:2:{s:2:\"id\";s:3:\"119\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:118;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:85.8;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.407;i:1;d:0.397;}s:1:\"y\";a:2:{i:0;d:0.536;i:1;d:0.574;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.546;i:1;d:0.539;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.127;i:1;d:659.92;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:85.8;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.397;s:1:\"y\";d:0.575;}s:1:\"o\";a:2:{s:1:\"x\";d:0.539;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.399;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.733;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.399;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.733;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:85.8;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.403;i:1;d:0.397;}s:1:\"y\";a:2:{i:0;d:0.553;i:1;d:0.574;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.543;i:1;d:0.539;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:95.444;i:1;d:-823.598;}s:1:\"h\";i:1;}}}}}}}}i:16;a:2:{s:2:\"id\";s:3:\"123\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:122;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:42.6;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.695;i:1;d:0.694;}s:1:\"y\";a:2:{i:0;d:0.563;i:1;d:0.607;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.752;i:1;d:0.735;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:85.797;i:1;d:525.089;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:42.6;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.695;s:1:\"y\";d:0.608;}s:1:\"o\";a:2:{s:1:\"x\";d:0.735;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.389;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.726;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.389;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.726;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:42.6;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.695;i:1;d:0.694;}s:1:\"y\";a:2:{i:0;d:0.582;i:1;d:0.607;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.744;i:1;d:0.735;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:96.009;i:1;d:-968.565;}s:1:\"h\";i:1;}}}}}}}}i:17;a:2:{s:2:\"id\";s:3:\"127\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:126;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:21;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.357;i:1;d:0.343;}s:1:\"y\";a:2:{i:0;d:0.562;i:1;d:0.599;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.521;i:1;d:0.515;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:80.1;s:1:\"s\";a:2:{i:0;d:85.871;i:1;d:554.9631242260887;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.645;i:1;d:0.535;}s:1:\"y\";a:2:{i:0;d:0.846;i:1;d:0.804;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.288;i:1;d:0.221;}s:1:\"y\";a:2:{i:0;d:0.554;i:1;d:0.438;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:84.604;i:1;d:54.746;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";i:21;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.075;s:1:\"y\";d:0.817;}s:1:\"o\";a:2:{s:1:\"x\";d:0.343;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;i:0;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.354;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.699;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;i:0;i:21;i:0;i:22;d:0.354;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.699;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:21;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.351;i:1;d:0.343;}s:1:\"y\";a:2:{i:0;d:0.578;i:1;d:0.599;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.518;i:1;d:0.515;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:80.1;s:1:\"s\";a:2:{i:0;d:95.883;i:1;d:-936.4450532645491;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.626;i:1;d:0.535;}s:1:\"y\";a:2:{i:0;d:0.84;i:1;d:0.804;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.276;i:1;d:0.221;}s:1:\"y\";a:2:{i:0;d:0.539;i:1;d:0.438;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:98.023;i:1;d:-1474.263;}s:1:\"h\";i:1;}}}}}}}}i:18;a:2:{s:2:\"id\";s:3:\"130\";s:6:\"layers\";a:6:{i:0;a:9:{s:3:\"ind\";i:109;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"107\";}i:1;a:9:{s:3:\"ind\";i:113;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"111\";}i:2;a:9:{s:3:\"ind\";i:117;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"115\";}i:3;a:9:{s:3:\"ind\";i:121;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"119\";}i:4;a:9:{s:3:\"ind\";i:125;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"123\";}i:5;a:9:{s:3:\"ind\";i:129;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"127\";}}}i:19;a:2:{s:2:\"id\";s:3:\"135\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:134;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:813.803;}}}}}}}i:20;a:2:{s:2:\"id\";s:3:\"139\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:138;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:813.803;}}}}}}}i:21;a:2:{s:2:\"id\";s:3:\"143\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:142;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:103.2;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.756;i:1;d:0.744;}s:1:\"y\";a:2:{i:0;d:0.402;i:1;d:0.376;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.438;i:1;d:0.421;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.031;i:1;d:2060.639;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:103.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.741;s:1:\"y\";d:0.369;}s:1:\"o\";a:2:{s:1:\"x\";d:0.417;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.502;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.813;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.502;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.813;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:103.2;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.75;i:1;d:0.744;}s:1:\"y\";a:2:{i:0;d:0.39;i:1;d:0.376;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.43;i:1;d:0.421;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.726;i:1;d:682.452;}s:1:\"h\";i:1;}}}}}}}}i:22;a:2:{s:2:\"id\";s:3:\"147\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:146;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:81.6;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.369;i:1;d:0.356;}s:1:\"y\";a:2:{i:0;d:0.555;i:1;d:0.592;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.528;i:1;d:0.521;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.76;i:1;d:580.888;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:81.6;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.356;s:1:\"y\";d:0.593;}s:1:\"o\";a:2:{s:1:\"x\";d:0.521;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.393;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.729;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.393;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.729;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:81.6;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.363;i:1;d:0.356;}s:1:\"y\";a:2:{i:0;d:0.571;i:1;d:0.592;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.524;i:1;d:0.521;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:96.6;i:1;d:-908.584;}s:1:\"h\";i:1;}}}}}}}}i:23;a:2:{s:2:\"id\";s:3:\"151\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:150;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:38.4;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.662;i:1;d:0.66;}s:1:\"y\";a:2:{i:0;d:0.587;i:1;d:0.63;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.756;i:1;d:0.736;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.412;i:1;d:439.515;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:38.4;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.661;s:1:\"y\";d:0.631;}s:1:\"o\";a:2:{s:1:\"x\";d:0.736;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.383;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.721;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.383;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.721;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:38.4;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.661;i:1;d:0.66;}s:1:\"y\";a:2:{i:0;d:0.607;i:1;d:0.63;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.747;i:1;d:0.736;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:97.197;i:1;d:-1060.587;}s:1:\"h\";i:1;}}}}}}}}i:24;a:2:{s:2:\"id\";s:3:\"155\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:154;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:16.8;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.34;i:1;d:0.325;}s:1:\"y\";a:2:{i:0;d:0.571;i:1;d:0.607;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.512;i:1;d:0.506;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";i:78;s:1:\"s\";a:2:{i:0;d:86.613;i:1;d:520.7514200499265;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.669;i:1;d:0.537;}s:1:\"y\";a:2:{i:0;d:0.863;i:1;d:0.815;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.3;i:1;d:0.222;}s:1:\"y\";a:2:{i:0;d:0.588;i:1;d:0.447;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:85.397;i:1;d:40.705;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:16.8;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.066;s:1:\"y\";d:0.833;}s:1:\"o\";a:2:{s:1:\"x\";d:0.336;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;i:0;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.353;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.698;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;i:0;i:21;i:0;i:22;d:0.353;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.698;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:16.8;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.333;i:1;d:0.325;}s:1:\"y\";a:2:{i:0;d:0.587;i:1;d:0.607;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.509;i:1;d:0.506;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";i:78;s:1:\"s\";a:2:{i:0;d:96.853;i:1;d:-973.2415182166502;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.654;i:1;d:0.537;}s:1:\"y\";a:2:{i:0;d:0.859;i:1;d:0.815;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.291;i:1;d:0.222;}s:1:\"y\";a:2:{i:0;d:0.576;i:1;d:0.447;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:98.914;i:1;d:-1489.376;}s:1:\"h\";i:1;}}}}}}}}i:25;a:2:{s:2:\"id\";s:3:\"158\";s:6:\"layers\";a:6:{i:0;a:9:{s:3:\"ind\";i:137;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"135\";}i:1;a:9:{s:3:\"ind\";i:141;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"139\";}i:2;a:9:{s:3:\"ind\";i:145;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"143\";}i:3;a:9:{s:3:\"ind\";i:149;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"147\";}i:4;a:9:{s:3:\"ind\";i:153;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"151\";}i:5;a:9:{s:3:\"ind\";i:157;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"155\";}}}i:26;a:2:{s:2:\"id\";s:3:\"163\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:162;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:813.803;}}}}}}}i:27;a:2:{s:2:\"id\";s:3:\"167\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:166;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:138;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.27;i:1;d:2182.26;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:138;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.273;i:1;d:813.222;}s:1:\"h\";i:1;}}}}}}}}i:28;a:2:{s:2:\"id\";s:3:\"171\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:170;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:99;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.766;i:1;d:0.753;}s:1:\"y\";a:2:{i:0;d:0.404;i:1;d:0.379;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.451;i:1;d:0.434;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:89.955;i:1;d:2022.298;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";i:99;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.752;s:1:\"y\";d:0.375;}s:1:\"o\";a:2:{s:1:\"x\";d:0.431;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.004;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.499;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.811;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.004;i:21;i:0;i:22;d:0.499;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.811;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:99;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.76;i:1;d:0.753;}s:1:\"y\";a:2:{i:0;d:0.392;i:1;d:0.379;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.443;i:1;d:0.434;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.869;i:1;d:641.227;}s:1:\"h\";i:1;}}}}}}}}i:29;a:2:{s:2:\"id\";s:3:\"175\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:174;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:77.4;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.715;i:1;d:0.714;}s:1:\"y\";a:2:{i:0;d:0.429;i:1;d:0.458;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.606;i:1;d:0.605;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:108.3;s:1:\"s\";a:2:{i:0;d:88.609;i:1;d:1378.7421221470518;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.464;i:1;d:0.458;}s:1:\"y\";a:2:{i:0;d:0.686;i:1;d:0.7;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.192;i:1;d:0.19;}s:1:\"y\";a:2:{i:0;d:0.317;i:1;d:0.333;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.59;i:1;d:511.44;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:77.4;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.32;s:1:\"y\";d:0.61;}s:1:\"o\";a:2:{s:1:\"x\";d:0.503;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.388;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.725;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.388;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.725;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:77.4;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.329;i:1;d:0.32;}s:1:\"y\";a:2:{i:0;d:0.589;i:1;d:0.609;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.506;i:1;d:0.503;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:96.893;i:1;d:-983.254;}s:1:\"h\";i:1;}}}}}}}}i:30;a:2:{s:2:\"id\";s:3:\"179\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:178;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:34.2;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.629;i:1;d:0.627;}s:1:\"y\";a:2:{i:0;d:0.612;i:1;d:0.653;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.756;i:1;d:0.735;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.23;i:1;d:366.458;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:34.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.627;s:1:\"y\";d:0.654;}s:1:\"o\";a:2:{s:1:\"x\";d:0.734;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.377;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.717;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.377;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.717;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:34.2;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.629;i:1;d:0.627;}s:1:\"y\";a:2:{i:0;d:0.631;i:1;d:0.653;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.746;i:1;d:0.735;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:97.508;i:1;d:-1139.136;}s:1:\"h\";i:1;}}}}}}}}i:31;a:2:{s:2:\"id\";s:3:\"183\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:182;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:12.6;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.325;i:1;d:0.308;}s:1:\"y\";a:2:{i:0;d:0.58;i:1;d:0.616;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.503;i:1;d:0.497;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:75.9;s:1:\"s\";a:2:{i:0;d:86.534;i:1;d:488.5856280800872;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.656;i:1;d:0.539;}s:1:\"y\";a:2:{i:0;d:0.866;i:1;d:0.826;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.295;i:1;d:0.224;}s:1:\"y\";a:2:{i:0;d:0.586;i:1;d:0.457;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:85.365;i:1;d:28.356;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:12.6;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.058;s:1:\"y\";d:0.848;}s:1:\"o\";a:2:{s:1:\"x\";d:0.329;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;i:0;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.352;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.697;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;i:0;i:21;i:0;i:22;d:0.352;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.697;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:12.6;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.318;i:1;d:0.308;}s:1:\"y\";a:2:{i:0;d:0.596;i:1;d:0.616;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.5;i:1;d:0.497;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:75.9;s:1:\"s\";a:2:{i:0;d:96.989;i:1;d:-1007.8261463488428;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.64;i:1;d:0.539;}s:1:\"y\";a:2:{i:0;d:0.861;i:1;d:0.826;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.285;i:1;d:0.224;}s:1:\"y\";a:2:{i:0;d:0.572;i:1;d:0.457;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:98.968;i:1;d:-1502.654;}s:1:\"h\";i:1;}}}}}}}}i:32;a:2:{s:2:\"id\";s:3:\"186\";s:6:\"layers\";a:6:{i:0;a:9:{s:3:\"ind\";i:165;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"163\";}i:1;a:9:{s:3:\"ind\";i:169;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"167\";}i:2;a:9:{s:3:\"ind\";i:173;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"171\";}i:3;a:9:{s:3:\"ind\";i:177;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"175\";}i:4;a:9:{s:3:\"ind\";i:181;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"179\";}i:5;a:9:{s:3:\"ind\";i:185;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"183\";}}}i:33;a:2:{s:2:\"id\";s:3:\"191\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:190;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;d:813.803;}}}}}}}i:34;a:2:{s:2:\"id\";s:3:\"195\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:194;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:133.8;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;d:0.712;}s:1:\"y\";a:2:{i:0;i:1;i:1;d:0.381;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;d:0.382;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.003;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:89.435;i:1;d:2170.895;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:133.8;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.695;s:1:\"y\";d:0.346;}s:1:\"o\";a:2:{s:1:\"x\";d:0.363;s:1:\"y\";d:0.002;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.51;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.819;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.51;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.819;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:133.8;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;d:0.712;}s:1:\"y\";a:2:{i:0;i:1;i:1;d:0.381;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;d:0.382;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.003;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:89.502;i:1;d:801.002;}s:1:\"h\";i:1;}}}}}}}}i:35;a:2:{s:2:\"id\";s:3:\"199\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:198;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:94.8;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.776;i:1;d:0.764;}s:1:\"y\";a:2:{i:0;d:0.407;i:1;d:0.384;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.467;i:1;d:0.449;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:89.047;i:1;d:1975.76;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:94.8;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.763;s:1:\"y\";d:0.382;}s:1:\"o\";a:2:{s:1:\"x\";d:0.448;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.004;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.496;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.808;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.004;i:21;i:0;i:22;d:0.496;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.808;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:94.8;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.771;i:1;d:0.764;}s:1:\"y\";a:2:{i:0;d:0.396;i:1;d:0.384;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.459;i:1;d:0.449;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.229;i:1;d:591.19;}s:1:\"h\";i:1;}}}}}}}}i:36;a:2:{s:2:\"id\";s:3:\"203\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:202;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:73.2;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.683;i:1;d:0.681;}s:1:\"y\";a:2:{i:0;d:0.441;i:1;d:0.472;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.611;i:1;d:0.609;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:106.2;s:1:\"s\";a:2:{i:0;d:87.569;i:1;d:1279.388198590613;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.471;i:1;d:0.468;}s:1:\"y\";a:2:{i:0;d:0.694;i:1;d:0.708;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.191;i:1;d:0.19;}s:1:\"y\";a:2:{i:0;d:0.325;i:1;d:0.343;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:85.611;i:1;d:449.972;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:73.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.288;s:1:\"y\";d:0.626;}s:1:\"o\";a:2:{s:1:\"x\";d:0.486;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.383;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.721;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.383;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.721;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:73.2;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.298;i:1;d:0.288;}s:1:\"y\";a:2:{i:0;d:0.606;i:1;d:0.626;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.489;i:1;d:0.486;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:96.326;i:1;d:-1049.328;}s:1:\"h\";i:1;}}}}}}}}i:37;a:2:{s:2:\"id\";s:3:\"207\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:206;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:30;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.797;i:1;d:0.793;}s:1:\"y\";a:2:{i:0;d:0.398;i:1;d:0.403;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.502;i:1;d:0.497;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:84.6;s:1:\"s\";a:2:{i:0;d:88.726;i:1;d:1818.191957881311;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.476;i:1;d:0.465;}s:1:\"y\";a:2:{i:0;d:0.713;i:1;d:0.734;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.409;i:1;d:0.402;}s:1:\"y\";a:2:{i:0;d:0.255;i:1;d:0.279;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:85.245;i:1;d:303.934;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";i:30;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.595;s:1:\"y\";d:0.676;}s:1:\"o\";a:2:{s:1:\"x\";d:0.73;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.373;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.713;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.373;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.713;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:30;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.597;i:1;d:0.595;}s:1:\"y\";a:2:{i:0;d:0.654;i:1;d:0.676;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.743;i:1;d:0.73;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:96.947;i:1;d:-1206.344;}s:1:\"h\";i:1;}}}}}}}}i:38;a:2:{s:2:\"id\";s:3:\"211\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:210;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:8.4;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.31;i:1;d:0.292;}s:1:\"y\";a:2:{i:0;d:0.589;i:1;d:0.624;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.495;i:1;d:0.489;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:73.8;s:1:\"s\";a:2:{i:0;d:85.632;i:1;d:458.2887620028571;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.664;i:1;d:0.541;}s:1:\"y\";a:2:{i:0;d:0.878;i:1;d:0.838;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.299;i:1;d:0.225;}s:1:\"y\";a:2:{i:0;d:0.606;i:1;d:0.468;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:84.506;i:1;d:17.585;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:8.4;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.05;s:1:\"y\";d:0.863;}s:1:\"o\";a:2:{s:1:\"x\";d:0.322;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;i:0;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.351;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.697;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;i:0;i:21;i:0;i:22;d:0.351;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.697;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:8.4;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.303;i:1;d:0.292;}s:1:\"y\";a:2:{i:0;d:0.604;i:1;d:0.624;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.492;i:1;d:0.489;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:73.8;s:1:\"s\";a:2:{i:0;d:96.29;i:1;d:-1040.3866892855467;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.65;i:1;d:0.541;}s:1:\"y\";a:2:{i:0;d:0.874;i:1;d:0.838;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.29;i:1;d:0.225;}s:1:\"y\";a:2:{i:0;d:0.595;i:1;d:0.468;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:98.185;i:1;d:-1514.217;}s:1:\"h\";i:1;}}}}}}}}i:39;a:2:{s:2:\"id\";s:3:\"214\";s:6:\"layers\";a:6:{i:0;a:9:{s:3:\"ind\";i:193;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"191\";}i:1;a:9:{s:3:\"ind\";i:197;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"195\";}i:2;a:9:{s:3:\"ind\";i:201;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"199\";}i:3;a:9:{s:3:\"ind\";i:205;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"203\";}i:4;a:9:{s:3:\"ind\";i:209;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"207\";}i:5;a:9:{s:3:\"ind\";i:213;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"211\";}}}i:40;a:2:{s:2:\"id\";s:3:\"219\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:218;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:182.169;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;d:813.803;}}}}}}}i:41;a:2:{s:2:\"id\";s:3:\"223\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:222;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:182.169;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:129.6;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;d:0.724;}s:1:\"y\";a:2:{i:0;i:1;i:1;d:0.365;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;d:0.399;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.002;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:91.002;i:1;d:2140.231;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:129.6;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.72;s:1:\"y\";d:0.354;}s:1:\"o\";a:2:{s:1:\"x\";d:0.392;s:1:\"y\";d:0.001;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.508;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.817;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.508;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.817;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:129.6;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.727;i:1;d:0.724;}s:1:\"y\";a:2:{i:0;d:0.369;i:1;d:0.365;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.401;i:1;d:0.399;}s:1:\"y\";a:2:{i:0;d:0.002;i:1;d:0.002;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:91.243;i:1;d:768.031;}s:1:\"h\";i:1;}}}}}}}}i:42;a:2:{s:2:\"id\";s:3:\"227\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:226;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:182.169;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:90.6;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.787;i:1;d:0.776;}s:1:\"y\";a:2:{i:0;d:0.41;i:1;d:0.391;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.484;i:1;d:0.467;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.564;i:1;d:1919.452;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:90.6;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.775;s:1:\"y\";d:0.39;}s:1:\"o\";a:2:{s:1:\"x\";d:0.466;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.004;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.492;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.805;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.004;i:21;i:0;i:22;d:0.492;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.805;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:90.6;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.782;i:1;d:0.776;}s:1:\"y\";a:2:{i:0;d:0.401;i:1;d:0.391;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.476;i:1;d:0.467;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:92.072;i:1;d:530.642;}s:1:\"h\";i:1;}}}}}}}}i:43;a:2:{s:2:\"id\";s:3:\"231\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:230;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:182.169;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:69;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.649;i:1;d:0.647;}s:1:\"y\";a:2:{i:0;d:0.45;i:1;d:0.484;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.611;i:1;d:0.609;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:104.1;s:1:\"s\";a:2:{i:0;d:89.007;i:1;d:1188.3854586695336;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.487;i:1;d:0.478;}s:1:\"y\";a:2:{i:0;d:0.706;i:1;d:0.716;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.197;i:1;d:0.192;}s:1:\"y\";a:2:{i:0;d:0.342;i:1;d:0.352;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:87.129;i:1;d:395.289;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";i:69;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.26;s:1:\"y\";d:0.643;}s:1:\"o\";a:2:{s:1:\"x\";d:0.47;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.379;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.718;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.379;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.718;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:69;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.271;i:1;d:0.259;}s:1:\"y\";a:2:{i:0;d:0.623;i:1;d:0.642;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.473;i:1;d:0.47;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:98.213;i:1;d:-1108.152;}s:1:\"h\";i:1;}}}}}}}}i:44;a:2:{s:2:\"id\";s:3:\"235\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:234;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:182.169;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:25.8;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.803;i:1;d:0.799;}s:1:\"y\";a:2:{i:0;d:0.4;i:1;d:0.409;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.513;i:1;d:0.509;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:82.5;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:1775.7755266584609;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.446;i:1;d:0.434;}s:1:\"y\";a:2:{i:0;d:0.731;i:1;d:0.751;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.377;i:1;d:0.371;}s:1:\"y\";a:2:{i:0;d:0.266;i:1;d:0.292;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.765;i:1;d:250.33;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:25.8;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.565;s:1:\"y\";d:0.698;}s:1:\"o\";a:2:{s:1:\"x\";d:0.725;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.369;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.71;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.369;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.71;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:25.8;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.567;i:1;d:0.564;}s:1:\"y\";a:2:{i:0;d:0.677;i:1;d:0.697;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.738;i:1;d:0.725;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:98.834;i:1;d:-1264.009;}s:1:\"h\";i:1;}}}}}}}}i:45;a:2:{s:2:\"id\";s:3:\"239\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:238;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:182.169;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:4.2;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.297;i:1;d:0.278;}s:1:\"y\";a:2:{i:0;d:0.598;i:1;d:0.632;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.486;i:1;d:0.48;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:71.7;s:1:\"s\";a:2:{i:0;d:87.215;i:1;d:429.73381715054416;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.653;i:1;d:0.543;}s:1:\"y\";a:2:{i:0;d:0.883;i:1;d:0.85;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.294;i:1;d:0.226;}s:1:\"y\";a:2:{i:0;d:0.607;i:1;d:0.479;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.143;i:1;d:8.327;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:4.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.042;s:1:\"y\";d:0.879;}s:1:\"o\";a:2:{s:1:\"x\";d:0.315;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;i:0;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.351;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.696;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;i:0;i:21;i:0;i:22;d:0.351;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.696;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:4.2;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.289;i:1;d:0.278;}s:1:\"y\";a:2:{i:0;d:0.613;i:1;d:0.632;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.483;i:1;d:0.48;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:71.7;s:1:\"s\";a:2:{i:0;d:98.066;i:1;d:-1071.1164985712362;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.637;i:1;d:0.543;}s:1:\"y\";a:2:{i:0;d:0.88;i:1;d:0.85;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.284;i:1;d:0.226;}s:1:\"y\";a:2:{i:0;d:0.593;i:1;d:0.479;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:99.886;i:1;d:-1524.206;}s:1:\"h\";i:1;}}}}}}}}i:46;a:2:{s:2:\"id\";s:3:\"242\";s:6:\"layers\";a:6:{i:0;a:9:{s:3:\"ind\";i:221;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:183;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"219\";}i:1;a:9:{s:3:\"ind\";i:225;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:183;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"223\";}i:2;a:9:{s:3:\"ind\";i:229;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:183;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"227\";}i:3;a:9:{s:3:\"ind\";i:233;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:183;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"231\";}i:4;a:9:{s:3:\"ind\";i:237;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:183;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"235\";}i:5;a:9:{s:3:\"ind\";i:241;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:183;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"239\";}}}i:47;a:2:{s:2:\"id\";s:3:\"247\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:246;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:813.803;}}}}}}}i:48;a:2:{s:2:\"id\";s:3:\"251\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:250;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:125.4;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.752;i:1;d:0.747;}s:1:\"y\";a:2:{i:0;d:0.376;i:1;d:0.368;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.437;i:1;d:0.431;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.072;i:1;d:2081.374;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:125.4;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.746;s:1:\"y\";d:0.366;}s:1:\"o\";a:2:{s:1:\"x\";d:0.429;s:1:\"y\";d:0.001;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.504;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.814;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.504;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.814;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:125.4;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.75;i:1;d:0.747;}s:1:\"y\";a:2:{i:0;d:0.372;i:1;d:0.368;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.434;i:1;d:0.431;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.648;i:1;d:704.747;}s:1:\"h\";i:1;}}}}}}}}i:49;a:2:{s:2:\"id\";s:3:\"255\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:254;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:86.4;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.798;i:1;d:0.788;}s:1:\"y\";a:2:{i:0;d:0.413;i:1;d:0.399;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.503;i:1;d:0.487;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:89.61;i:1;d:1851.407;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:86.4;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.788;s:1:\"y\";d:0.399;}s:1:\"o\";a:2:{s:1:\"x\";d:0.487;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.004;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.487;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.801;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.004;i:21;i:0;i:22;d:0.487;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.801;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:86.4;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.793;i:1;d:0.788;}s:1:\"y\";a:2:{i:0;d:0.407;i:1;d:0.399;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.496;i:1;d:0.487;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:91.515;i:1;d:457.481;}s:1:\"h\";i:1;}}}}}}}}i:50;a:2:{s:2:\"id\";s:3:\"259\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:258;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:64.8;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.616;i:1;d:0.613;}s:1:\"y\";a:2:{i:0;d:0.46;i:1;d:0.496;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.609;i:1;d:0.605;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";i:102;s:1:\"s\";a:2:{i:0;d:87.998;i:1;d:1105.4690900494036;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.498;i:1;d:0.487;}s:1:\"y\";a:2:{i:0;d:0.716;i:1;d:0.723;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.202;i:1;d:0.195;}s:1:\"y\";a:2:{i:0;d:0.354;i:1;d:0.36;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.18;i:1;d:346.392;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:64.8;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.234;s:1:\"y\";d:0.658;}s:1:\"o\";a:2:{s:1:\"x\";d:0.455;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.376;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.715;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.376;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.715;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:64.8;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.247;i:1;d:0.234;}s:1:\"y\";a:2:{i:0;d:0.64;i:1;d:0.658;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.457;i:1;d:0.455;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:97.594;i:1;d:-1160.71;}s:1:\"h\";i:1;}}}}}}}}i:51;a:2:{s:2:\"id\";s:3:\"263\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:262;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:21.6;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.81;i:1;d:0.805;}s:1:\"y\";a:2:{i:0;d:0.41;i:1;d:0.414;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.53;i:1;d:0.522;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:80.4;s:1:\"s\";a:2:{i:0;d:89.357;i:1;d:1729.2038542412133;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.42;i:1;d:0.408;}s:1:\"y\";a:2:{i:0;d:0.75;i:1;d:0.768;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.346;i:1;d:0.341;}s:1:\"y\";a:2:{i:0;d:0.278;i:1;d:0.305;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:85.819;i:1;d:204.265;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:21.6;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.535;s:1:\"y\";d:0.72;}s:1:\"o\";a:2:{s:1:\"x\";d:0.718;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;i:0;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.365;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.707;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;i:0;i:21;i:0;i:22;d:0.365;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.707;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:21.6;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.539;i:1;d:0.535;}s:1:\"y\";a:2:{i:0;d:0.7;i:1;d:0.719;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.731;i:1;d:0.718;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:98.204;i:1;d:-1313.521;}s:1:\"h\";i:1;}}}}}}}}i:52;a:2:{s:2:\"id\";s:3:\"267\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:266;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.284;i:1;d:0.264;}s:1:\"y\";a:2:{i:0;d:0.607;i:1;d:0.64;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.478;i:1;d:0.472;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:1;a:4:{s:1:\"t\";d:69.6;s:1:\"s\";a:2:{i:0;d:86.321;i:1;d:402.7432796647611;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.667;i:1;d:0.545;}s:1:\"y\";a:2:{i:0;d:0.899;i:1;d:0.865;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.302;i:1;d:0.227;}s:1:\"y\";a:2:{i:0;d:0.637;i:1;d:0.491;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:85.292;i:1;d:0.44;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:2:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.035;s:1:\"y\";d:0.894;}s:1:\"o\";a:2:{s:1:\"x\";d:0.309;s:1:\"y\";i:0;}}i:1;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;i:0;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.35;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.696;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;i:0;i:21;i:0;i:22;d:0.35;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.696;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.275;i:1;d:0.264;}s:1:\"y\";a:2:{i:0;d:0.621;i:1;d:0.64;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.475;i:1;d:0.472;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:1;a:4:{s:1:\"t\";d:69.6;s:1:\"s\";a:2:{i:0;d:97.353;i:1;d:-1100.1217518124122;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.655;i:1;d:0.545;}s:1:\"y\";a:2:{i:0;d:0.896;i:1;d:0.865;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.294;i:1;d:0.227;}s:1:\"y\";a:2:{i:0;d:0.626;i:1;d:0.491;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:99.09;i:1;d:-1532.668;}s:1:\"h\";i:1;}}}}}}}}i:53;a:2:{s:2:\"id\";s:3:\"270\";s:6:\"layers\";a:6:{i:0;a:9:{s:3:\"ind\";i:249;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"247\";}i:1;a:9:{s:3:\"ind\";i:253;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"251\";}i:2;a:9:{s:3:\"ind\";i:257;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"255\";}i:3;a:9:{s:3:\"ind\";i:261;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"259\";}i:4;a:9:{s:3:\"ind\";i:265;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"263\";}i:5;a:9:{s:3:\"ind\";i:269;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"267\";}}}i:54;a:2:{s:2:\"id\";s:3:\"275\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:274;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:813.803;}}}}}}}i:55;a:2:{s:2:\"id\";s:3:\"279\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:278;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:129.6;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;d:0.724;}s:1:\"y\";a:2:{i:0;i:1;i:1;d:0.365;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;d:0.399;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.002;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.188;i:1;d:2140.231;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:129.6;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.72;s:1:\"y\";d:0.354;}s:1:\"o\";a:2:{s:1:\"x\";d:0.392;s:1:\"y\";d:0.001;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.508;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.817;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.508;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.817;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:129.6;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.727;i:1;d:0.724;}s:1:\"y\";a:2:{i:0;d:0.369;i:1;d:0.365;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.401;i:1;d:0.399;}s:1:\"y\";a:2:{i:0;d:0.002;i:1;d:0.002;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.429;i:1;d:768.031;}s:1:\"h\";i:1;}}}}}}}}i:56;a:2:{s:2:\"id\";s:3:\"283\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:282;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:90.6;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.787;i:1;d:0.776;}s:1:\"y\";a:2:{i:0;d:0.41;i:1;d:0.391;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.484;i:1;d:0.467;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:89.749;i:1;d:1919.451;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:90.6;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.775;s:1:\"y\";d:0.39;}s:1:\"o\";a:2:{s:1:\"x\";d:0.466;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.004;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.492;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.805;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.004;i:21;i:0;i:22;d:0.492;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.805;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:90.6;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.782;i:1;d:0.776;}s:1:\"y\";a:2:{i:0;d:0.401;i:1;d:0.391;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.476;i:1;d:0.467;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:91.257;i:1;d:530.643;}s:1:\"h\";i:1;}}}}}}}}i:57;a:2:{s:2:\"id\";s:3:\"287\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:286;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:69;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.649;i:1;d:0.647;}s:1:\"y\";a:2:{i:0;d:0.45;i:1;d:0.484;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.611;i:1;d:0.609;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:104.1;s:1:\"s\";a:2:{i:0;d:88.186;i:1;d:1188.3815644034535;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.487;i:1;d:0.478;}s:1:\"y\";a:2:{i:0;d:0.706;i:1;d:0.716;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.197;i:1;d:0.192;}s:1:\"y\";a:2:{i:0;d:0.342;i:1;d:0.352;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.302;i:1;d:395.282;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";i:69;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.26;s:1:\"y\";d:0.643;}s:1:\"o\";a:2:{s:1:\"x\";d:0.47;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.379;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.718;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.379;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.718;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:69;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.271;i:1;d:0.259;}s:1:\"y\";a:2:{i:0;d:0.623;i:1;d:0.642;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.473;i:1;d:0.47;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:97.385;i:1;d:-1108.145;}s:1:\"h\";i:1;}}}}}}}}i:58;a:2:{s:2:\"id\";s:3:\"291\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:290;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:25.8;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.803;i:1;d:0.799;}s:1:\"y\";a:2:{i:0;d:0.4;i:1;d:0.409;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.513;i:1;d:0.509;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:82.5;s:1:\"s\";a:2:{i:0;d:89.454;i:1;d:1775.7740522444394;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.446;i:1;d:0.434;}s:1:\"y\";a:2:{i:0;d:0.731;i:1;d:0.751;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.377;i:1;d:0.371;}s:1:\"y\";a:2:{i:0;d:0.266;i:1;d:0.292;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:85.937;i:1;d:250.323;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:25.8;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.565;s:1:\"y\";d:0.698;}s:1:\"o\";a:2:{s:1:\"x\";d:0.725;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.369;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.71;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.369;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.71;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:25.8;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.567;i:1;d:0.564;}s:1:\"y\";a:2:{i:0;d:0.677;i:1;d:0.697;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.738;i:1;d:0.725;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:98.005;i:1;d:-1264.002;}s:1:\"h\";i:1;}}}}}}}}i:59;a:2:{s:2:\"id\";s:3:\"295\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:294;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:4.2;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.297;i:1;d:0.278;}s:1:\"y\";a:2:{i:0;d:0.598;i:1;d:0.632;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.486;i:1;d:0.48;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:71.7;s:1:\"s\";a:2:{i:0;d:86.388;i:1;d:429.72656073412645;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.652;i:1;d:0.543;}s:1:\"y\";a:2:{i:0;d:0.883;i:1;d:0.85;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.294;i:1;d:0.226;}s:1:\"y\";a:2:{i:0;d:0.607;i:1;d:0.479;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:85.312;i:1;d:8.318;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:4.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.042;s:1:\"y\";d:0.879;}s:1:\"o\";a:2:{s:1:\"x\";d:0.315;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;i:0;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.351;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.696;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;i:0;i:21;i:0;i:22;d:0.351;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.696;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:4.2;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.289;i:1;d:0.278;}s:1:\"y\";a:2:{i:0;d:0.613;i:1;d:0.632;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.483;i:1;d:0.48;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:71.7;s:1:\"s\";a:2:{i:0;d:97.239;i:1;d:-1071.1100489142896;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.637;i:1;d:0.543;}s:1:\"y\";a:2:{i:0;d:0.88;i:1;d:0.85;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.284;i:1;d:0.226;}s:1:\"y\";a:2:{i:0;d:0.593;i:1;d:0.479;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:99.056;i:1;d:-1524.198;}s:1:\"h\";i:1;}}}}}}}}i:60;a:2:{s:2:\"id\";s:3:\"298\";s:6:\"layers\";a:6:{i:0;a:9:{s:3:\"ind\";i:277;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"275\";}i:1;a:9:{s:3:\"ind\";i:281;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"279\";}i:2;a:9:{s:3:\"ind\";i:285;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"283\";}i:3;a:9:{s:3:\"ind\";i:289;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"287\";}i:4;a:9:{s:3:\"ind\";i:293;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"291\";}i:5;a:9:{s:3:\"ind\";i:297;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"295\";}}}i:61;a:2:{s:2:\"id\";s:3:\"303\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:302;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;d:813.803;}}}}}}}i:62;a:2:{s:2:\"id\";s:3:\"307\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:306;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:133.8;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;d:0.712;}s:1:\"y\";a:2:{i:0;i:1;i:1;d:0.381;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;d:0.382;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.003;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:89.435;i:1;d:2170.895;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:133.8;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.695;s:1:\"y\";d:0.346;}s:1:\"o\";a:2:{s:1:\"x\";d:0.363;s:1:\"y\";d:0.002;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.51;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.819;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.51;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.819;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:133.8;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;d:0.712;}s:1:\"y\";a:2:{i:0;i:1;i:1;d:0.381;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;d:0.382;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.003;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:89.502;i:1;d:801.002;}s:1:\"h\";i:1;}}}}}}}}i:63;a:2:{s:2:\"id\";s:3:\"311\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:310;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:94.8;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.776;i:1;d:0.764;}s:1:\"y\";a:2:{i:0;d:0.407;i:1;d:0.384;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.467;i:1;d:0.449;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:89.047;i:1;d:1975.76;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:94.8;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.763;s:1:\"y\";d:0.382;}s:1:\"o\";a:2:{s:1:\"x\";d:0.448;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.004;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.496;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.808;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.004;i:21;i:0;i:22;d:0.496;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.808;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:94.8;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.771;i:1;d:0.764;}s:1:\"y\";a:2:{i:0;d:0.396;i:1;d:0.384;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.459;i:1;d:0.449;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.229;i:1;d:591.19;}s:1:\"h\";i:1;}}}}}}}}i:64;a:2:{s:2:\"id\";s:3:\"315\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:314;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:73.2;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.683;i:1;d:0.681;}s:1:\"y\";a:2:{i:0;d:0.441;i:1;d:0.472;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.611;i:1;d:0.609;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:106.2;s:1:\"s\";a:2:{i:0;d:87.569;i:1;d:1279.388198590613;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.471;i:1;d:0.468;}s:1:\"y\";a:2:{i:0;d:0.694;i:1;d:0.708;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.191;i:1;d:0.19;}s:1:\"y\";a:2:{i:0;d:0.325;i:1;d:0.343;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:85.611;i:1;d:449.972;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:73.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.288;s:1:\"y\";d:0.626;}s:1:\"o\";a:2:{s:1:\"x\";d:0.486;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.383;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.721;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.383;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.721;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:73.2;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.298;i:1;d:0.288;}s:1:\"y\";a:2:{i:0;d:0.606;i:1;d:0.626;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.489;i:1;d:0.486;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:96.326;i:1;d:-1049.328;}s:1:\"h\";i:1;}}}}}}}}i:65;a:2:{s:2:\"id\";s:3:\"319\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:318;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:30;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.797;i:1;d:0.793;}s:1:\"y\";a:2:{i:0;d:0.398;i:1;d:0.403;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.502;i:1;d:0.497;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:84.6;s:1:\"s\";a:2:{i:0;d:88.726;i:1;d:1818.191957881311;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.476;i:1;d:0.465;}s:1:\"y\";a:2:{i:0;d:0.713;i:1;d:0.734;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.409;i:1;d:0.402;}s:1:\"y\";a:2:{i:0;d:0.255;i:1;d:0.279;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:85.245;i:1;d:303.934;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";i:30;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.595;s:1:\"y\";d:0.676;}s:1:\"o\";a:2:{s:1:\"x\";d:0.73;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.373;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.713;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.373;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.713;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:30;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.597;i:1;d:0.595;}s:1:\"y\";a:2:{i:0;d:0.654;i:1;d:0.676;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.743;i:1;d:0.73;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:96.947;i:1;d:-1206.344;}s:1:\"h\";i:1;}}}}}}}}i:66;a:2:{s:2:\"id\";s:3:\"323\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:322;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:8.4;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.31;i:1;d:0.292;}s:1:\"y\";a:2:{i:0;d:0.589;i:1;d:0.624;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.495;i:1;d:0.489;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:73.8;s:1:\"s\";a:2:{i:0;d:85.632;i:1;d:458.2887620028571;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.664;i:1;d:0.541;}s:1:\"y\";a:2:{i:0;d:0.878;i:1;d:0.838;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.299;i:1;d:0.225;}s:1:\"y\";a:2:{i:0;d:0.606;i:1;d:0.468;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:84.506;i:1;d:17.585;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:8.4;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.05;s:1:\"y\";d:0.863;}s:1:\"o\";a:2:{s:1:\"x\";d:0.322;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;i:0;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.351;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.697;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;i:0;i:21;i:0;i:22;d:0.351;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.697;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:8.4;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.303;i:1;d:0.292;}s:1:\"y\";a:2:{i:0;d:0.604;i:1;d:0.624;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.492;i:1;d:0.489;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:73.8;s:1:\"s\";a:2:{i:0;d:96.29;i:1;d:-1040.3866892855467;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.65;i:1;d:0.541;}s:1:\"y\";a:2:{i:0;d:0.874;i:1;d:0.838;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.29;i:1;d:0.225;}s:1:\"y\";a:2:{i:0;d:0.595;i:1;d:0.468;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:98.185;i:1;d:-1514.217;}s:1:\"h\";i:1;}}}}}}}}i:67;a:2:{s:2:\"id\";s:3:\"326\";s:6:\"layers\";a:6:{i:0;a:9:{s:3:\"ind\";i:305;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"303\";}i:1;a:9:{s:3:\"ind\";i:309;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"307\";}i:2;a:9:{s:3:\"ind\";i:313;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"311\";}i:3;a:9:{s:3:\"ind\";i:317;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"315\";}i:4;a:9:{s:3:\"ind\";i:321;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"319\";}i:5;a:9:{s:3:\"ind\";i:325;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"323\";}}}i:68;a:2:{s:2:\"id\";s:3:\"331\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:330;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:813.803;}}}}}}}i:69;a:2:{s:2:\"id\";s:3:\"335\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:334;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:138;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.27;i:1;d:2182.26;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:138;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.273;i:1;d:813.222;}s:1:\"h\";i:1;}}}}}}}}i:70;a:2:{s:2:\"id\";s:3:\"339\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:338;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:99;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.766;i:1;d:0.753;}s:1:\"y\";a:2:{i:0;d:0.404;i:1;d:0.379;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.451;i:1;d:0.434;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:89.955;i:1;d:2022.298;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";i:99;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.752;s:1:\"y\";d:0.375;}s:1:\"o\";a:2:{s:1:\"x\";d:0.431;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.004;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.499;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.811;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.004;i:21;i:0;i:22;d:0.499;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.811;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:99;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.76;i:1;d:0.753;}s:1:\"y\";a:2:{i:0;d:0.392;i:1;d:0.379;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.443;i:1;d:0.434;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.869;i:1;d:641.227;}s:1:\"h\";i:1;}}}}}}}}i:71;a:2:{s:2:\"id\";s:3:\"343\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:342;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:77.4;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.715;i:1;d:0.714;}s:1:\"y\";a:2:{i:0;d:0.429;i:1;d:0.458;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.606;i:1;d:0.605;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:108.3;s:1:\"s\";a:2:{i:0;d:88.609;i:1;d:1378.7421221470518;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.464;i:1;d:0.458;}s:1:\"y\";a:2:{i:0;d:0.686;i:1;d:0.7;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.192;i:1;d:0.19;}s:1:\"y\";a:2:{i:0;d:0.317;i:1;d:0.333;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.59;i:1;d:511.44;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:77.4;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.32;s:1:\"y\";d:0.61;}s:1:\"o\";a:2:{s:1:\"x\";d:0.503;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.388;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.725;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.388;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.725;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:77.4;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.329;i:1;d:0.32;}s:1:\"y\";a:2:{i:0;d:0.589;i:1;d:0.609;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.506;i:1;d:0.503;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:96.893;i:1;d:-983.254;}s:1:\"h\";i:1;}}}}}}}}i:72;a:2:{s:2:\"id\";s:3:\"347\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:346;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:34.2;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.629;i:1;d:0.627;}s:1:\"y\";a:2:{i:0;d:0.612;i:1;d:0.653;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.756;i:1;d:0.735;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.23;i:1;d:366.458;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:34.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.627;s:1:\"y\";d:0.654;}s:1:\"o\";a:2:{s:1:\"x\";d:0.734;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.377;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.717;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.377;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.717;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:34.2;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.629;i:1;d:0.627;}s:1:\"y\";a:2:{i:0;d:0.631;i:1;d:0.653;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.746;i:1;d:0.735;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:97.508;i:1;d:-1139.136;}s:1:\"h\";i:1;}}}}}}}}i:73;a:2:{s:2:\"id\";s:3:\"351\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:350;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:12.6;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.325;i:1;d:0.308;}s:1:\"y\";a:2:{i:0;d:0.58;i:1;d:0.616;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.503;i:1;d:0.497;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:75.9;s:1:\"s\";a:2:{i:0;d:86.534;i:1;d:488.5856280800872;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.656;i:1;d:0.539;}s:1:\"y\";a:2:{i:0;d:0.866;i:1;d:0.826;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.295;i:1;d:0.224;}s:1:\"y\";a:2:{i:0;d:0.586;i:1;d:0.457;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:85.365;i:1;d:28.356;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:12.6;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.058;s:1:\"y\";d:0.848;}s:1:\"o\";a:2:{s:1:\"x\";d:0.329;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;i:0;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.352;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.697;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;i:0;i:21;i:0;i:22;d:0.352;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.697;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:12.6;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.318;i:1;d:0.308;}s:1:\"y\";a:2:{i:0;d:0.596;i:1;d:0.616;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.5;i:1;d:0.497;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:75.9;s:1:\"s\";a:2:{i:0;d:96.989;i:1;d:-1007.8261463488428;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.64;i:1;d:0.539;}s:1:\"y\";a:2:{i:0;d:0.861;i:1;d:0.826;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.285;i:1;d:0.224;}s:1:\"y\";a:2:{i:0;d:0.572;i:1;d:0.457;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:98.968;i:1;d:-1502.654;}s:1:\"h\";i:1;}}}}}}}}i:74;a:2:{s:2:\"id\";s:3:\"354\";s:6:\"layers\";a:6:{i:0;a:9:{s:3:\"ind\";i:333;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"331\";}i:1;a:9:{s:3:\"ind\";i:337;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"335\";}i:2;a:9:{s:3:\"ind\";i:341;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"339\";}i:3;a:9:{s:3:\"ind\";i:345;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"343\";}i:4;a:9:{s:3:\"ind\";i:349;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"347\";}i:5;a:9:{s:3:\"ind\";i:353;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"351\";}}}i:75;a:2:{s:2:\"id\";s:3:\"359\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:358;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:182.169;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;d:813.803;}}}}}}}i:76;a:2:{s:2:\"id\";s:3:\"363\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:362;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:182.169;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;d:813.803;}}}}}}}i:77;a:2:{s:2:\"id\";s:3:\"367\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:366;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:182.169;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:103.2;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.756;i:1;d:0.744;}s:1:\"y\";a:2:{i:0;d:0.402;i:1;d:0.376;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.438;i:1;d:0.421;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.846;i:1;d:2060.639;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:103.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.741;s:1:\"y\";d:0.369;}s:1:\"o\";a:2:{s:1:\"x\";d:0.417;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.502;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.813;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.502;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.813;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:103.2;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.75;i:1;d:0.744;}s:1:\"y\";a:2:{i:0;d:0.389;i:1;d:0.376;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.43;i:1;d:0.421;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:91.54;i:1;d:682.451;}s:1:\"h\";i:1;}}}}}}}}i:78;a:2:{s:2:\"id\";s:3:\"371\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:370;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:182.169;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:81.6;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.369;i:1;d:0.356;}s:1:\"y\";a:2:{i:0;d:0.555;i:1;d:0.592;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.528;i:1;d:0.521;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:87.586;i:1;d:580.895;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:81.6;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.356;s:1:\"y\";d:0.593;}s:1:\"o\";a:2:{s:1:\"x\";d:0.521;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.393;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.729;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.393;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.729;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:81.6;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.363;i:1;d:0.356;}s:1:\"y\";a:2:{i:0;d:0.571;i:1;d:0.592;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.524;i:1;d:0.521;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:97.426;i:1;d:-908.591;}s:1:\"h\";i:1;}}}}}}}}i:79;a:2:{s:2:\"id\";s:3:\"375\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:374;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:182.169;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:38.4;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.662;i:1;d:0.66;}s:1:\"y\";a:2:{i:0;d:0.587;i:1;d:0.63;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.756;i:1;d:0.736;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:87.239;i:1;d:439.522;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:38.4;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.661;s:1:\"y\";d:0.631;}s:1:\"o\";a:2:{s:1:\"x\";d:0.736;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.383;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.721;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.383;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.721;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:38.4;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.661;i:1;d:0.66;}s:1:\"y\";a:2:{i:0;d:0.607;i:1;d:0.63;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.747;i:1;d:0.736;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:98.024;i:1;d:-1060.594;}s:1:\"h\";i:1;}}}}}}}}i:80;a:2:{s:2:\"id\";s:3:\"379\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:378;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:91.084;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:182.169;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:16.8;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.34;i:1;d:0.325;}s:1:\"y\";a:2:{i:0;d:0.571;i:1;d:0.607;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.512;i:1;d:0.506;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";i:78;s:1:\"s\";a:2:{i:0;d:87.44;i:1;d:520.7584031376139;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.669;i:1;d:0.537;}s:1:\"y\";a:2:{i:0;d:0.863;i:1;d:0.815;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.3;i:1;d:0.222;}s:1:\"y\";a:2:{i:0;d:0.588;i:1;d:0.447;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.227;i:1;d:40.714;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:16.8;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.066;s:1:\"y\";d:0.833;}s:1:\"o\";a:2:{s:1:\"x\";d:0.336;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;i:0;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.353;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.698;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;i:0;i:21;i:0;i:22;d:0.353;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.698;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:16.8;s:1:\"s\";a:2:{i:0;d:91.084;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.333;i:1;d:0.325;}s:1:\"y\";a:2:{i:0;d:0.587;i:1;d:0.607;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.509;i:1;d:0.506;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";i:78;s:1:\"s\";a:2:{i:0;d:97.68;i:1;d:-973.2485020959226;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.654;i:1;d:0.537;}s:1:\"y\";a:2:{i:0;d:0.859;i:1;d:0.815;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.291;i:1;d:0.222;}s:1:\"y\";a:2:{i:0;d:0.576;i:1;d:0.447;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:99.744;i:1;d:-1489.385;}s:1:\"h\";i:1;}}}}}}}}i:81;a:2:{s:2:\"id\";s:3:\"382\";s:6:\"layers\";a:6:{i:0;a:9:{s:3:\"ind\";i:361;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:183;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"359\";}i:1;a:9:{s:3:\"ind\";i:365;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:183;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"363\";}i:2;a:9:{s:3:\"ind\";i:369;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:183;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"367\";}i:3;a:9:{s:3:\"ind\";i:373;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:183;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"371\";}i:4;a:9:{s:3:\"ind\";i:377;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:183;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"375\";}i:5;a:9:{s:3:\"ind\";i:381;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:183;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"379\";}}}i:82;a:2:{s:2:\"id\";s:3:\"387\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:386;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;d:813.803;}}}}}}}i:83;a:2:{s:2:\"id\";s:3:\"391\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:390;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;d:813.803;}}}}}}}i:84;a:2:{s:2:\"id\";s:3:\"395\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:394;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:107.4;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.747;i:1;d:0.735;}s:1:\"y\";a:2:{i:0;d:0.399;i:1;d:0.375;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.425;i:1;d:0.41;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:89.279;i:1;d:2092.041;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:107.4;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.73;s:1:\"y\";d:0.363;}s:1:\"o\";a:2:{s:1:\"x\";d:0.404;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.504;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.815;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.504;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.815;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:107.4;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.741;i:1;d:0.735;}s:1:\"y\";a:2:{i:0;d:0.388;i:1;d:0.375;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.418;i:1;d:0.41;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:89.794;i:1;d:716.217;}s:1:\"h\";i:1;}}}}}}}}i:85;a:2:{s:2:\"id\";s:3:\"399\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:398;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:85.8;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.407;i:1;d:0.397;}s:1:\"y\";a:2:{i:0;d:0.536;i:1;d:0.574;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.546;i:1;d:0.539;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.127;i:1;d:659.92;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:85.8;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.397;s:1:\"y\";d:0.575;}s:1:\"o\";a:2:{s:1:\"x\";d:0.539;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.399;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.733;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.399;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.733;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:85.8;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.403;i:1;d:0.397;}s:1:\"y\";a:2:{i:0;d:0.553;i:1;d:0.574;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.543;i:1;d:0.539;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:95.444;i:1;d:-823.598;}s:1:\"h\";i:1;}}}}}}}}i:86;a:2:{s:2:\"id\";s:3:\"403\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:402;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:42.6;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.695;i:1;d:0.694;}s:1:\"y\";a:2:{i:0;d:0.563;i:1;d:0.607;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.752;i:1;d:0.735;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:85.797;i:1;d:525.089;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:42.6;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.695;s:1:\"y\";d:0.608;}s:1:\"o\";a:2:{s:1:\"x\";d:0.735;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.389;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.726;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.389;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.726;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:42.6;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.695;i:1;d:0.694;}s:1:\"y\";a:2:{i:0;d:0.582;i:1;d:0.607;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.744;i:1;d:0.735;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:96.009;i:1;d:-968.565;}s:1:\"h\";i:1;}}}}}}}}i:87;a:2:{s:2:\"id\";s:3:\"407\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:406;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:89.458;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:178.916;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:21;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.357;i:1;d:0.343;}s:1:\"y\";a:2:{i:0;d:0.562;i:1;d:0.599;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.521;i:1;d:0.515;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:80.1;s:1:\"s\";a:2:{i:0;d:85.871;i:1;d:554.9631242260887;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.645;i:1;d:0.535;}s:1:\"y\";a:2:{i:0;d:0.846;i:1;d:0.804;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.288;i:1;d:0.221;}s:1:\"y\";a:2:{i:0;d:0.554;i:1;d:0.438;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:84.604;i:1;d:54.746;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";i:21;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.075;s:1:\"y\";d:0.817;}s:1:\"o\";a:2:{s:1:\"x\";d:0.343;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;i:0;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.354;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.699;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;i:0;i:21;i:0;i:22;d:0.354;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.699;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:21;s:1:\"s\";a:2:{i:0;d:89.458;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.351;i:1;d:0.343;}s:1:\"y\";a:2:{i:0;d:0.578;i:1;d:0.599;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.518;i:1;d:0.515;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:80.1;s:1:\"s\";a:2:{i:0;d:95.883;i:1;d:-936.4450532645491;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.626;i:1;d:0.535;}s:1:\"y\";a:2:{i:0;d:0.84;i:1;d:0.804;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.276;i:1;d:0.221;}s:1:\"y\";a:2:{i:0;d:0.539;i:1;d:0.438;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:98.023;i:1;d:-1474.263;}s:1:\"h\";i:1;}}}}}}}}i:88;a:2:{s:2:\"id\";s:3:\"410\";s:6:\"layers\";a:6:{i:0;a:9:{s:3:\"ind\";i:389;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"387\";}i:1;a:9:{s:3:\"ind\";i:393;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"391\";}i:2;a:9:{s:3:\"ind\";i:397;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"395\";}i:3;a:9:{s:3:\"ind\";i:401;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"399\";}i:4;a:9:{s:3:\"ind\";i:405;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"403\";}i:5;a:9:{s:3:\"ind\";i:409;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:179;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"407\";}}}i:89;a:2:{s:2:\"id\";s:3:\"415\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:414;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:813.803;}}}}}}}i:90;a:2:{s:2:\"id\";s:3:\"419\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:418;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:2182.8;}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;d:813.803;}}}}}}}i:91;a:2:{s:2:\"id\";s:3:\"423\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:422;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:111.6;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.739;i:1;d:0.728;}s:1:\"y\";a:2:{i:0;d:0.398;i:1;d:0.376;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.414;i:1;d:0.401;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.144;i:1;d:2117.513;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:111.6;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.72;s:1:\"y\";d:0.358;}s:1:\"o\";a:2:{s:1:\"x\";d:0.392;s:1:\"y\";d:0.001;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.506;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.816;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.506;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.816;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:111.6;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.733;i:1;d:0.728;}s:1:\"y\";a:2:{i:0;d:0.387;i:1;d:0.376;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.408;i:1;d:0.401;}s:1:\"y\";a:2:{i:0;d:0.001;i:1;d:0.001;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:90.513;i:1;d:743.604;}s:1:\"h\";i:1;}}}}}}}}i:92;a:2:{s:2:\"id\";s:3:\"427\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:426;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:90;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.451;i:1;d:0.443;}s:1:\"y\";a:2:{i:0;d:0.517;i:1;d:0.556;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.565;i:1;d:0.559;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:87.17;i:1;d:750.696;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";i:90;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.444;s:1:\"y\";d:0.556;}s:1:\"o\";a:2:{s:1:\"x\";d:0.558;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.002;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.406;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.738;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.002;i:21;i:0;i:22;d:0.406;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.738;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";i:90;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.448;i:1;d:0.443;}s:1:\"y\";a:2:{i:0;d:0.534;i:1;d:0.556;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.562;i:1;d:0.559;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:95.892;i:1;d:-726.009;}s:1:\"h\";i:1;}}}}}}}}i:93;a:2:{s:2:\"id\";s:3:\"431\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:430;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:46.8;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.729;i:1;d:0.728;}s:1:\"y\";a:2:{i:0;d:0.538;i:1;d:0.583;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.744;i:1;d:0.73;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:86.869;i:1;d:625.455;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:46.8;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.728;s:1:\"y\";d:0.584;}s:1:\"o\";a:2:{s:1:\"x\";d:0.73;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;d:0.001;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.396;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.731;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.001;i:21;i:0;i:22;d:0.396;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.731;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:46.8;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.729;i:1;d:0.728;}s:1:\"y\";a:2:{i:0;d:0.558;i:1;d:0.583;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.738;i:1;d:0.73;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:96.413;i:1;d:-860.667;}s:1:\"h\";i:1;}}}}}}}}i:94;a:2:{s:2:\"id\";s:3:\"435\";s:6:\"layers\";a:1:{i:0;a:7:{s:3:\"ind\";i:434;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:90.271;i:1;i:642;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;d:180.542;i:1;i:1284;}}}i:1;a:6:{s:2:\"ty\";s:2:\"gf\";s:1:\"e\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:25.2;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:2182.8;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.375;i:1;d:0.362;}s:1:\"y\";a:2:{i:0;d:0.553;i:1;d:0.59;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.53;i:1;d:0.524;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:82.2;s:1:\"s\";a:2:{i:0;d:86.786;i:1;d:591.4359468535531;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.625;i:1;d:0.532;}s:1:\"y\";a:2:{i:0;d:0.83;i:1;d:0.795;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.277;i:1;d:0.219;}s:1:\"y\";a:2:{i:0;d:0.525;i:1;d:0.43;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:85.475;i:1;d:70.628;}s:1:\"h\";i:1;}}}s:1:\"g\";a:2:{s:1:\"p\";i:5;s:1:\"k\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:25.2;s:1:\"s\";a:30:{i:0;d:0.005;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.511;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.82;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;d:0.005;i:21;i:0;i:22;d:0.511;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.82;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"i\";a:2:{s:1:\"x\";d:0.085;s:1:\"y\";d:0.802;}s:1:\"o\";a:2:{s:1:\"x\";d:0.351;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:30:{i:0;i:0;i:1;d:0.98;i:2;d:0.894;i:3;d:0.98;i:4;d:0.355;i:5;d:0.929;i:6;d:0.004;i:7;d:0.933;i:8;d:0.575;i:9;i:0;i:10;i:0;i:11;i:0;i:12;d:0.7;i:13;d:0.929;i:14;d:0.004;i:15;d:0.933;i:16;i:1;i:17;d:0.98;i:18;d:0.894;i:19;d:0.98;i:20;i:0;i:21;i:0;i:22;d:0.355;i:23;i:1;i:24;d:0.575;i:25;i:1;i:26;d:0.7;i:27;i:1;i:28;i:1;i:29;i:0;}s:1:\"h\";i:1;}}}}s:1:\"t\";i:1;s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}s:1:\"s\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:4:{i:0;a:4:{s:1:\"t\";i:0;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;i:1;i:1;i:1;}s:1:\"y\";a:2:{i:0;i:1;i:1;i:1;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;i:0;i:1;i:0;}s:1:\"y\";a:2:{i:0;i:0;i:1;i:0;}}}i:1;a:4:{s:1:\"t\";d:25.2;s:1:\"s\";a:2:{i:0;d:90.271;i:1;d:813.803;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.369;i:1;d:0.362;}s:1:\"y\";a:2:{i:0;d:0.569;i:1;d:0.59;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.527;i:1;d:0.524;}s:1:\"y\";a:2:{i:0;i:0;i:1;d:0.001;}}}i:2;a:4:{s:1:\"t\";d:82.2;s:1:\"s\";a:2:{i:0;d:96.556;i:1;d:-897.2437299396621;}s:1:\"i\";a:2:{s:1:\"x\";a:2:{i:0;d:0.604;i:1;d:0.532;}s:1:\"y\";a:2:{i:0;d:0.823;i:1;d:0.795;}}s:1:\"o\";a:2:{s:1:\"x\";a:2:{i:0;d:0.263;i:1;d:0.219;}s:1:\"y\";a:2:{i:0;d:0.507;i:1;d:0.43;}}}i:3;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:2:{i:0;d:98.784;i:1;d:-1457.205;}s:1:\"h\";i:1;}}}}}}}}i:95;a:2:{s:2:\"id\";s:3:\"438\";s:6:\"layers\";a:6:{i:0;a:9:{s:3:\"ind\";i:417;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"415\";}i:1;a:9:{s:3:\"ind\";i:421;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"419\";}i:2;a:9:{s:3:\"ind\";i:425;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"423\";}i:3;a:9:{s:3:\"ind\";i:429;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"427\";}i:4;a:9:{s:3:\"ind\";i:433;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"431\";}i:5;a:9:{s:3:\"ind\";i:437;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:3:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";d:91.2;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:181;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"435\";}}}i:96;a:2:{s:2:\"id\";s:3:\"442\";s:6:\"layers\";a:27:{i:0;a:10:{s:3:\"ind\";i:104;s:2:\"ty\";i:0;s:6:\"parent\";i:77;s:2:\"ks\";a:2:{s:1:\"a\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:1327;i:1;i:2;}}s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:1327;i:1;i:2;}}}s:1:\"w\";i:113;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"102\";}i:1;a:6:{s:3:\"ind\";i:77;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:1327;i:1;i:2;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:2;a:10:{s:3:\"ind\";i:132;s:2:\"ty\";i:0;s:6:\"parent\";i:105;s:2:\"ks\";a:2:{s:1:\"a\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:1217;i:1;i:2;}}s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:1217;i:1;i:2;}}}s:1:\"w\";i:110;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"130\";}i:3;a:6:{s:3:\"ind\";i:105;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:1217;i:1;i:2;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:4;a:10:{s:3:\"ind\";i:160;s:2:\"ty\";i:0;s:6:\"parent\";i:133;s:2:\"ks\";a:2:{s:1:\"a\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:1106;i:1;i:2;}}s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:1106;i:1;i:2;}}}s:1:\"w\";i:111;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"158\";}i:5;a:6:{s:3:\"ind\";i:133;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:1106;i:1;i:2;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:6;a:10:{s:3:\"ind\";i:188;s:2:\"ty\";i:0;s:6:\"parent\";i:161;s:2:\"ks\";a:2:{s:1:\"a\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:995;i:1;i:2;}}s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:995;i:1;i:2;}}}s:1:\"w\";i:111;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"186\";}i:7;a:6:{s:3:\"ind\";i:161;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:995;i:1;i:2;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:8;a:10:{s:3:\"ind\";i:216;s:2:\"ty\";i:0;s:6:\"parent\";i:189;s:2:\"ks\";a:2:{s:1:\"a\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:885;i:1;i:2;}}s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:885;i:1;i:2;}}}s:1:\"w\";i:110;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"214\";}i:9;a:6:{s:3:\"ind\";i:189;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:885;i:1;i:2;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:10;a:10:{s:3:\"ind\";i:244;s:2:\"ty\";i:0;s:6:\"parent\";i:217;s:2:\"ks\";a:2:{s:1:\"a\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:773;i:1;i:2;}}s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:773;i:1;i:2;}}}s:1:\"w\";i:112;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"242\";}i:11;a:6:{s:3:\"ind\";i:217;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:773;i:1;i:2;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:12;a:10:{s:3:\"ind\";i:272;s:2:\"ty\";i:0;s:6:\"parent\";i:245;s:2:\"ks\";a:2:{s:1:\"a\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:662;i:1;i:2;}}s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:662;i:1;i:2;}}}s:1:\"w\";i:111;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"270\";}i:13;a:6:{s:3:\"ind\";i:245;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:662;i:1;i:2;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:14;a:10:{s:3:\"ind\";i:300;s:2:\"ty\";i:0;s:6:\"parent\";i:273;s:2:\"ks\";a:2:{s:1:\"a\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:551;i:1;i:2;}}s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:551;i:1;i:2;}}}s:1:\"w\";i:111;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"298\";}i:15;a:6:{s:3:\"ind\";i:273;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:551;i:1;i:2;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:16;a:10:{s:3:\"ind\";i:328;s:2:\"ty\";i:0;s:6:\"parent\";i:301;s:2:\"ks\";a:2:{s:1:\"a\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:441;i:1;i:2;}}s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:441;i:1;i:2;}}}s:1:\"w\";i:110;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"326\";}i:17;a:6:{s:3:\"ind\";i:301;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:441;i:1;i:2;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:18;a:10:{s:3:\"ind\";i:356;s:2:\"ty\";i:0;s:6:\"parent\";i:329;s:2:\"ks\";a:2:{s:1:\"a\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:330;i:1;i:2;}}s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:330;i:1;i:2;}}}s:1:\"w\";i:111;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"354\";}i:19;a:6:{s:3:\"ind\";i:329;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:330;i:1;i:2;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:20;a:10:{s:3:\"ind\";i:384;s:2:\"ty\";i:0;s:6:\"parent\";i:357;s:2:\"ks\";a:2:{s:1:\"a\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:218;i:1;i:2;}}s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:218;i:1;i:2;}}}s:1:\"w\";i:112;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"382\";}i:21;a:6:{s:3:\"ind\";i:357;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:218;i:1;i:2;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:22;a:10:{s:3:\"ind\";i:412;s:2:\"ty\";i:0;s:6:\"parent\";i:385;s:2:\"ks\";a:2:{s:1:\"a\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:108;i:1;i:2;}}s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:108;i:1;i:2;}}}s:1:\"w\";i:110;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"410\";}i:23;a:6:{s:3:\"ind\";i:385;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:108;i:1;i:2;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:24;a:10:{s:3:\"ind\";i:440;s:2:\"ty\";i:0;s:6:\"parent\";i:413;s:2:\"ks\";a:2:{s:1:\"a\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:-3;i:1;i:2;}}s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:-3;i:1;i:2;}}}s:1:\"w\";i:111;s:1:\"h\";i:1284;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"438\";}i:25;a:6:{s:3:\"ind\";i:413;s:2:\"ty\";i:3;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:-3;i:1;i:2;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:26;a:7:{s:3:\"ind\";i:441;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:720;i:1;i:395;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:1440;i:1;i:790;}}}i:1;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:100;}}}}}}i:97;a:2:{s:2:\"id\";s:3:\"446\";s:6:\"layers\";a:2:{i:0;a:9:{s:3:\"ind\";i:444;s:2:\"ty\";i:0;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:12;i:1;i:12;}}}s:1:\"w\";i:1440;s:1:\"h\";i:790;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"442\";}i:1;a:7:{s:3:\"ind\";i:445;s:2:\"ty\";i:4;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:6:\"shapes\";a:2:{i:0;a:4:{s:2:\"ty\";s:2:\"rc\";s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:732;i:1;i:407;}}s:1:\"r\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}s:1:\"s\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:1464;i:1;i:814;}}}i:1;a:3:{s:2:\"ty\";s:2:\"fl\";s:1:\"c\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:4:{i:0;i:0;i:1;i:0;i:2;i:0;i:3;i:0;}}s:1:\"o\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:0;}}}}}}}s:2:\"fr\";i:60;s:1:\"h\";i:790;s:2:\"ip\";i:0;s:6:\"layers\";a:8:{i:0;a:10:{s:3:\"ind\";i:66;s:2:\"ty\";i:0;s:6:\"parent\";i:11;s:2:\"ks\";a:2:{s:1:\"a\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:1;i:1;i:-14;}}s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:5:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";i:21;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:46.8;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:3;a:4:{s:1:\"t\";d:113.4;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:4;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:489;s:1:\"h\";i:173;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:2:\"64\";}i:1;a:7:{s:3:\"ind\";i:11;s:2:\"ty\";i:3;s:6:\"parent\";i:1;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:464;i:1;i:359;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:2;a:10:{s:3:\"ind\";i:75;s:2:\"ty\";i:0;s:6:\"parent\";i:67;s:2:\"ks\";a:1:{s:1:\"o\";a:2:{s:1:\"a\";i:1;s:1:\"k\";a:5:{i:0;a:3:{s:1:\"t\";i:0;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}i:1;a:4:{s:1:\"t\";i:21;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:2;a:3:{s:1:\"t\";d:46.8;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"h\";i:1;}i:3;a:4:{s:1:\"t\";d:113.4;s:1:\"s\";a:1:{i:0;i:100;}s:1:\"i\";a:2:{s:1:\"x\";i:1;s:1:\"y\";i:1;}s:1:\"o\";a:2:{s:1:\"x\";i:0;s:1:\"y\";i:0;}}i:4;a:3:{s:1:\"t\";d:139.2;s:1:\"s\";a:1:{i:0;i:0;}s:1:\"h\";i:1;}}}}s:1:\"w\";i:150;s:1:\"h\";i:150;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:2:\"73\";}i:3;a:7:{s:3:\"ind\";i:67;s:2:\"ty\";i:3;s:6:\"parent\";i:1;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:645;i:1;i:156;}}}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:4;a:11:{s:3:\"ind\";i:448;s:2:\"ty\";i:0;s:6:\"parent\";i:76;s:2:\"ks\";a:1:{s:1:\"p\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:2:{i:0;i:-12;i:1;i:-12;}}}s:2:\"ef\";a:1:{i:0;a:2:{s:2:\"ty\";i:25;s:2:\"ef\";a:5:{i:0;a:3:{s:2:\"ty\";i:2;s:2:\"nm\";s:12:\"Shadow Color\";s:1:\"v\";a:2:{s:1:\"a\";i:0;s:1:\"k\";a:3:{i:0;i:0;i:1;i:0;i:2;i:0;}}}i:1;a:3:{s:2:\"ty\";i:0;s:2:\"nm\";s:7:\"Opacity\";s:1:\"v\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:64;}}i:2;a:3:{s:2:\"ty\";i:1;s:2:\"nm\";s:9:\"Direction\";s:1:\"v\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:180;}}i:3;a:3:{s:2:\"ty\";i:0;s:2:\"nm\";s:8:\"Distance\";s:1:\"v\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:4;}}i:4;a:3:{s:2:\"ty\";i:0;s:2:\"nm\";s:8:\"Softness\";s:1:\"v\";a:2:{s:1:\"a\";i:0;s:1:\"k\";i:8;}}}}}s:1:\"w\";i:1464;s:1:\"h\";i:814;s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;s:5:\"refId\";s:3:\"446\";}i:5;a:7:{s:3:\"ind\";i:76;s:2:\"ty\";i:3;s:6:\"parent\";i:1;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:6;a:7:{s:3:\"ind\";i:1;s:2:\"ty\";i:3;s:6:\"parent\";i:0;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}i:7;a:6:{s:3:\"ind\";i:0;s:2:\"ty\";i:3;s:2:\"ks\";a:0:{}s:2:\"ip\";i:0;s:2:\"op\";d:140.2;s:2:\"st\";i:0;}}s:4:\"meta\";a:1:{s:1:\"g\";s:20:\"https://jitter.video\";}s:2:\"op\";d:139.2;s:1:\"v\";s:5:\"5.7.4\";s:1:\"w\";i:1440;}', 'off');
INSERT INTO `wp_options` VALUES ('1122', '_elementor_design_system_sync_css_meta', 'a:2:{s:4:\"time\";i:1783390646;i:0;b:0;}', 'auto');
INSERT INTO `wp_options` VALUES ('1123', '_site_transient_timeout_wp_plugin_dependencies_plugin_timeout_elementor', '1783434318', 'off');
INSERT INTO `wp_options` VALUES ('1124', '_site_transient_wp_plugin_dependencies_plugin_timeout_elementor', '1', 'off');
INSERT INTO `wp_options` VALUES ('1125', '_site_transient_timeout_wp_plugin_dependencies_plugin_timeout_the-events-calendar', '1783434319', 'off');
INSERT INTO `wp_options` VALUES ('1126', '_site_transient_wp_plugin_dependencies_plugin_timeout_the-events-calendar', '1', 'off');
INSERT INTO `wp_options` VALUES ('1127', 'akeebabackupwp_plugin_dir', 'akeebabackupwp', 'auto');
INSERT INTO `wp_options` VALUES ('1128', '_site_transient_timeout_poptags_40cd750bba9870f18aada2478b24840a', '1783401937', 'off');
INSERT INTO `wp_options` VALUES ('1129', '_site_transient_poptags_40cd750bba9870f18aada2478b24840a', 'O:8:\"stdClass\":100:{s:11:\"woocommerce\";a:3:{s:4:\"name\";s:11:\"woocommerce\";s:4:\"slug\";s:11:\"woocommerce\";s:5:\"count\";i:9912;}s:6:\"widget\";a:3:{s:4:\"name\";s:6:\"widget\";s:4:\"slug\";s:6:\"widget\";s:5:\"count\";i:5065;}s:5:\"admin\";a:3:{s:4:\"name\";s:5:\"admin\";s:4:\"slug\";s:5:\"admin\";s:5:\"count\";i:2914;}s:3:\"seo\";a:3:{s:4:\"name\";s:3:\"seo\";s:4:\"slug\";s:3:\"seo\";s:5:\"count\";i:2905;}s:4:\"post\";a:3:{s:4:\"name\";s:4:\"post\";s:4:\"slug\";s:4:\"post\";s:5:\"count\";i:2801;}s:9:\"shortcode\";a:3:{s:4:\"name\";s:9:\"shortcode\";s:4:\"slug\";s:9:\"shortcode\";s:5:\"count\";i:2304;}s:5:\"posts\";a:3:{s:4:\"name\";s:5:\"posts\";s:4:\"slug\";s:5:\"posts\";s:5:\"count\";i:2207;}s:8:\"comments\";a:3:{s:4:\"name\";s:8:\"comments\";s:4:\"slug\";s:8:\"comments\";s:5:\"count\";i:2008;}s:9:\"ecommerce\";a:3:{s:4:\"name\";s:9:\"ecommerce\";s:4:\"slug\";s:9:\"ecommerce\";s:5:\"count\";i:1860;}s:8:\"security\";a:3:{s:4:\"name\";s:8:\"security\";s:4:\"slug\";s:8:\"security\";s:5:\"count\";i:1768;}s:6:\"images\";a:3:{s:4:\"name\";s:6:\"images\";s:4:\"slug\";s:6:\"images\";s:5:\"count\";i:1748;}s:2:\"ai\";a:3:{s:4:\"name\";s:2:\"AI\";s:4:\"slug\";s:2:\"ai\";s:5:\"count\";i:1730;}s:5:\"image\";a:3:{s:4:\"name\";s:5:\"image\";s:4:\"slug\";s:5:\"image\";s:5:\"count\";i:1636;}s:5:\"email\";a:3:{s:4:\"name\";s:5:\"email\";s:4:\"slug\";s:5:\"email\";s:5:\"count\";i:1629;}s:6:\"google\";a:3:{s:4:\"name\";s:6:\"google\";s:4:\"slug\";s:6:\"google\";s:5:\"count\";i:1570;}s:8:\"facebook\";a:3:{s:4:\"name\";s:8:\"facebook\";s:4:\"slug\";s:8:\"facebook\";s:5:\"count\";i:1523;}s:7:\"twitter\";a:3:{s:4:\"name\";s:7:\"twitter\";s:4:\"slug\";s:7:\"twitter\";s:5:\"count\";i:1513;}s:7:\"gallery\";a:3:{s:4:\"name\";s:7:\"gallery\";s:4:\"slug\";s:7:\"gallery\";s:5:\"count\";i:1444;}s:5:\"login\";a:3:{s:4:\"name\";s:5:\"login\";s:4:\"slug\";s:5:\"login\";s:5:\"count\";i:1376;}s:9:\"gutenberg\";a:3:{s:4:\"name\";s:9:\"gutenberg\";s:4:\"slug\";s:9:\"gutenberg\";s:5:\"count\";i:1359;}s:9:\"analytics\";a:3:{s:4:\"name\";s:9:\"analytics\";s:4:\"slug\";s:9:\"analytics\";s:5:\"count\";i:1336;}s:7:\"sidebar\";a:3:{s:4:\"name\";s:7:\"sidebar\";s:4:\"slug\";s:7:\"sidebar\";s:5:\"count\";i:1325;}s:9:\"elementor\";a:3:{s:4:\"name\";s:9:\"elementor\";s:4:\"slug\";s:9:\"elementor\";s:5:\"count\";i:1295;}s:6:\"social\";a:3:{s:4:\"name\";s:6:\"social\";s:4:\"slug\";s:6:\"social\";s:5:\"count\";i:1201;}s:5:\"block\";a:3:{s:4:\"name\";s:5:\"block\";s:4:\"slug\";s:5:\"block\";s:5:\"count\";i:1171;}s:7:\"payment\";a:3:{s:4:\"name\";s:7:\"payment\";s:4:\"slug\";s:7:\"payment\";s:5:\"count\";i:1160;}s:4:\"page\";a:3:{s:4:\"name\";s:4:\"page\";s:4:\"slug\";s:4:\"page\";s:5:\"count\";i:1155;}s:7:\"content\";a:3:{s:4:\"name\";s:7:\"content\";s:4:\"slug\";s:7:\"content\";s:5:\"count\";i:1147;}s:5:\"video\";a:3:{s:4:\"name\";s:5:\"video\";s:4:\"slug\";s:5:\"video\";s:5:\"count\";i:1128;}s:15:\"payment-gateway\";a:3:{s:4:\"name\";s:15:\"payment gateway\";s:4:\"slug\";s:15:\"payment-gateway\";s:5:\"count\";i:1113;}s:7:\"widgets\";a:3:{s:4:\"name\";s:7:\"widgets\";s:4:\"slug\";s:7:\"widgets\";s:5:\"count\";i:1051;}s:10:\"e-commerce\";a:3:{s:4:\"name\";s:10:\"e-commerce\";s:4:\"slug\";s:10:\"e-commerce\";s:5:\"count\";i:1045;}s:5:\"media\";a:3:{s:4:\"name\";s:5:\"media\";s:4:\"slug\";s:5:\"media\";s:5:\"count\";i:1024;}s:6:\"slider\";a:3:{s:4:\"name\";s:6:\"slider\";s:4:\"slug\";s:6:\"slider\";s:5:\"count\";i:1016;}s:11:\"performance\";a:3:{s:4:\"name\";s:11:\"performance\";s:4:\"slug\";s:11:\"performance\";s:5:\"count\";i:1011;}s:4:\"spam\";a:3:{s:4:\"name\";s:4:\"spam\";s:4:\"slug\";s:4:\"spam\";s:5:\"count\";i:983;}s:5:\"links\";a:3:{s:4:\"name\";s:5:\"links\";s:4:\"slug\";s:5:\"links\";s:5:\"count\";i:967;}s:4:\"form\";a:3:{s:4:\"name\";s:4:\"form\";s:4:\"slug\";s:4:\"form\";s:5:\"count\";i:944;}s:12:\"contact-form\";a:3:{s:4:\"name\";s:12:\"contact form\";s:4:\"slug\";s:12:\"contact-form\";s:5:\"count\";i:934;}s:6:\"search\";a:3:{s:4:\"name\";s:6:\"search\";s:4:\"slug\";s:6:\"search\";s:5:\"count\";i:930;}s:6:\"editor\";a:3:{s:4:\"name\";s:6:\"editor\";s:4:\"slug\";s:6:\"editor\";s:5:\"count\";i:870;}s:4:\"chat\";a:3:{s:4:\"name\";s:4:\"chat\";s:4:\"slug\";s:4:\"chat\";s:5:\"count\";i:842;}s:5:\"embed\";a:3:{s:4:\"name\";s:5:\"embed\";s:4:\"slug\";s:5:\"embed\";s:5:\"count\";i:839;}s:8:\"shipping\";a:3:{s:4:\"name\";s:8:\"shipping\";s:4:\"slug\";s:8:\"shipping\";s:5:\"count\";i:811;}s:4:\"menu\";a:3:{s:4:\"name\";s:4:\"menu\";s:4:\"slug\";s:4:\"menu\";s:5:\"count\";i:805;}s:3:\"rss\";a:3:{s:4:\"name\";s:3:\"rss\";s:4:\"slug\";s:3:\"rss\";s:5:\"count\";i:801;}s:10:\"buddypress\";a:3:{s:4:\"name\";s:10:\"buddypress\";s:4:\"slug\";s:10:\"buddypress\";s:5:\"count\";i:785;}s:14:\"contact-form-7\";a:3:{s:4:\"name\";s:14:\"contact form 7\";s:4:\"slug\";s:14:\"contact-form-7\";s:5:\"count\";i:783;}s:3:\"api\";a:3:{s:4:\"name\";s:3:\"api\";s:4:\"slug\";s:3:\"api\";s:5:\"count\";i:769;}s:5:\"pages\";a:3:{s:4:\"name\";s:5:\"pages\";s:4:\"slug\";s:5:\"pages\";s:5:\"count\";i:764;}s:7:\"chatbot\";a:3:{s:4:\"name\";s:7:\"chatbot\";s:4:\"slug\";s:7:\"chatbot\";s:5:\"count\";i:754;}s:9:\"dashboard\";a:3:{s:4:\"name\";s:9:\"dashboard\";s:4:\"slug\";s:9:\"dashboard\";s:5:\"count\";i:750;}s:4:\"feed\";a:3:{s:4:\"name\";s:4:\"feed\";s:4:\"slug\";s:4:\"feed\";s:5:\"count\";i:748;}s:9:\"marketing\";a:3:{s:4:\"name\";s:9:\"marketing\";s:4:\"slug\";s:9:\"marketing\";s:5:\"count\";i:740;}s:8:\"checkout\";a:3:{s:4:\"name\";s:8:\"checkout\";s:4:\"slug\";s:8:\"checkout\";s:5:\"count\";i:735;}s:4:\"ajax\";a:3:{s:4:\"name\";s:4:\"ajax\";s:4:\"slug\";s:4:\"ajax\";s:5:\"count\";i:729;}s:5:\"forms\";a:3:{s:4:\"name\";s:5:\"forms\";s:4:\"slug\";s:5:\"forms\";s:5:\"count\";i:729;}s:7:\"youtube\";a:3:{s:4:\"name\";s:7:\"youtube\";s:4:\"slug\";s:7:\"youtube\";s:5:\"count\";i:715;}s:8:\"category\";a:3:{s:4:\"name\";s:8:\"category\";s:4:\"slug\";s:8:\"category\";s:5:\"count\";i:711;}s:9:\"affiliate\";a:3:{s:4:\"name\";s:9:\"affiliate\";s:4:\"slug\";s:9:\"affiliate\";s:5:\"count\";i:701;}s:8:\"calendar\";a:3:{s:4:\"name\";s:8:\"calendar\";s:4:\"slug\";s:8:\"calendar\";s:5:\"count\";i:691;}s:6:\"blocks\";a:3:{s:4:\"name\";s:6:\"blocks\";s:4:\"slug\";s:6:\"blocks\";s:5:\"count\";i:685;}s:10:\"responsive\";a:3:{s:4:\"name\";s:10:\"responsive\";s:4:\"slug\";s:10:\"responsive\";s:5:\"count\";i:684;}s:8:\"payments\";a:3:{s:4:\"name\";s:8:\"payments\";s:4:\"slug\";s:8:\"payments\";s:5:\"count\";i:678;}s:6:\"events\";a:3:{s:4:\"name\";s:6:\"events\";s:4:\"slug\";s:6:\"events\";s:5:\"count\";i:675;}s:6:\"jquery\";a:3:{s:4:\"name\";s:6:\"jquery\";s:4:\"slug\";s:6:\"jquery\";s:5:\"count\";i:664;}s:5:\"popup\";a:3:{s:4:\"name\";s:5:\"popup\";s:4:\"slug\";s:5:\"popup\";s:5:\"count\";i:663;}s:3:\"css\";a:3:{s:4:\"name\";s:3:\"css\";s:4:\"slug\";s:3:\"css\";s:5:\"count\";i:653;}s:7:\"contact\";a:3:{s:4:\"name\";s:7:\"contact\";s:4:\"slug\";s:7:\"contact\";s:5:\"count\";i:644;}s:10:\"automation\";a:3:{s:4:\"name\";s:10:\"automation\";s:4:\"slug\";s:10:\"automation\";s:5:\"count\";i:640;}s:5:\"share\";a:3:{s:4:\"name\";s:5:\"share\";s:4:\"slug\";s:5:\"share\";s:5:\"count\";i:624;}s:4:\"link\";a:3:{s:4:\"name\";s:4:\"link\";s:4:\"slug\";s:4:\"link\";s:5:\"count\";i:624;}s:3:\"ads\";a:3:{s:4:\"name\";s:3:\"ads\";s:4:\"slug\";s:3:\"ads\";s:5:\"count\";i:618;}s:10:\"javascript\";a:3:{s:4:\"name\";s:10:\"javascript\";s:4:\"slug\";s:10:\"javascript\";s:5:\"count\";i:617;}s:8:\"tracking\";a:3:{s:4:\"name\";s:8:\"tracking\";s:4:\"slug\";s:8:\"tracking\";s:5:\"count\";i:616;}s:10:\"categories\";a:3:{s:4:\"name\";s:10:\"categories\";s:4:\"slug\";s:10:\"categories\";s:5:\"count\";i:590;}s:5:\"theme\";a:3:{s:4:\"name\";s:5:\"theme\";s:4:\"slug\";s:5:\"theme\";s:5:\"count\";i:586;}s:9:\"live-chat\";a:3:{s:4:\"name\";s:9:\"live chat\";s:4:\"slug\";s:9:\"live-chat\";s:5:\"count\";i:586;}s:10:\"newsletter\";a:3:{s:4:\"name\";s:10:\"newsletter\";s:4:\"slug\";s:10:\"newsletter\";s:5:\"count\";i:583;}s:6:\"button\";a:3:{s:4:\"name\";s:6:\"button\";s:4:\"slug\";s:6:\"button\";s:5:\"count\";i:575;}s:6:\"custom\";a:3:{s:4:\"name\";s:6:\"custom\";s:4:\"slug\";s:6:\"custom\";s:5:\"count\";i:575;}s:7:\"comment\";a:3:{s:4:\"name\";s:7:\"comment\";s:4:\"slug\";s:7:\"comment\";s:5:\"count\";i:572;}s:10:\"navigation\";a:3:{s:4:\"name\";s:10:\"navigation\";s:4:\"slug\";s:10:\"navigation\";s:5:\"count\";i:562;}s:12:\"social-media\";a:3:{s:4:\"name\";s:12:\"social media\";s:4:\"slug\";s:12:\"social-media\";s:5:\"count\";i:558;}s:7:\"booking\";a:3:{s:4:\"name\";s:7:\"booking\";s:4:\"slug\";s:7:\"booking\";s:5:\"count\";i:555;}s:6:\"import\";a:3:{s:4:\"name\";s:6:\"import\";s:4:\"slug\";s:6:\"import\";s:5:\"count\";i:551;}s:5:\"users\";a:3:{s:4:\"name\";s:5:\"users\";s:4:\"slug\";s:5:\"users\";s:5:\"count\";i:551;}s:4:\"tags\";a:3:{s:4:\"name\";s:4:\"tags\";s:4:\"slug\";s:4:\"tags\";s:5:\"count\";i:548;}s:4:\"gdpr\";a:3:{s:4:\"name\";s:4:\"GDPR\";s:4:\"slug\";s:4:\"gdpr\";s:5:\"count\";i:543;}s:4:\"user\";a:3:{s:4:\"name\";s:4:\"user\";s:4:\"slug\";s:4:\"user\";s:5:\"count\";i:540;}s:8:\"redirect\";a:3:{s:4:\"name\";s:8:\"redirect\";s:4:\"slug\";s:8:\"redirect\";s:5:\"count\";i:537;}s:6:\"mobile\";a:3:{s:4:\"name\";s:6:\"mobile\";s:4:\"slug\";s:6:\"mobile\";s:5:\"count\";i:532;}s:7:\"gateway\";a:3:{s:4:\"name\";s:7:\"gateway\";s:4:\"slug\";s:7:\"gateway\";s:5:\"count\";i:528;}s:5:\"cache\";a:3:{s:4:\"name\";s:5:\"cache\";s:4:\"slug\";s:5:\"cache\";s:5:\"count\";i:522;}s:10:\"statistics\";a:3:{s:4:\"name\";s:10:\"statistics\";s:4:\"slug\";s:10:\"statistics\";s:5:\"count\";i:514;}s:12:\"notification\";a:3:{s:4:\"name\";s:12:\"notification\";s:4:\"slug\";s:12:\"notification\";s:5:\"count\";i:505;}s:13:\"accessibility\";a:3:{s:4:\"name\";s:13:\"accessibility\";s:4:\"slug\";s:13:\"accessibility\";s:5:\"count\";i:497;}s:8:\"products\";a:3:{s:4:\"name\";s:8:\"products\";s:4:\"slug\";s:8:\"products\";s:5:\"count\";i:488;}s:7:\"reviews\";a:3:{s:4:\"name\";s:7:\"reviews\";s:4:\"slug\";s:7:\"reviews\";s:5:\"count\";i:477;}s:5:\"stats\";a:3:{s:4:\"name\";s:5:\"stats\";s:4:\"slug\";s:5:\"stats\";s:5:\"count\";i:476;}}', 'off');
INSERT INTO `wp_options` VALUES ('1130', 'akeebabackupwp_config', '{\n    \"cms_url\": \"http:\\/\\/localhost:8082\\/ideiasti\",\n    \"timezone\": \"America\\/Sao_Paulo\",\n    \"options\": {\n        \"frontend_secret_word\": \"###AES128###Jl8oqU1pea1njx+0k693O0pQU1RMkBVUh\\/W1fQMDksGMnskM9EmKO8JUNwjEzv\\/kUZB5gd1GjL+B4VVes0EiA7A5H0e0iYekyIneYd5klu7AnCN4SlBJVrOZV2WvdJEng3\\/ydx5YiF8AAAAA\",\n        \"siteurl\": \"http:\\/\\/localhost:8082\\/ideiasti\\/wp-content\\/plugins\\/akeebabackupwp\\/app\\/\",\n        \"ajaxurl\": \"http:\\/\\/localhost:8082\\/ideiasti\\/wp-admin\\/admin-ajax.php\",\n        \"confwiz_upgrade\": 1,\n        \"show_howtorestoremodal\": 0\n    }\n}', 'off');
INSERT INTO `wp_options` VALUES ('1131', '_site_transient_timeout_wp_theme_files_patterns-12f1d8a6572de18ba0532a463778afed', '1783393405', 'off');
INSERT INTO `wp_options` VALUES ('1132', '_site_transient_wp_theme_files_patterns-12f1d8a6572de18ba0532a463778afed', 'a:2:{s:7:\"version\";s:5:\"1.0.0\";s:8:\"patterns\";a:0:{}}', 'off');

DROP TABLE IF EXISTS `wp_postmeta`;
CREATE TABLE `wp_postmeta` (
  `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `post_id` bigint(20) unsigned NOT NULL DEFAULT 0,
  `meta_key` varchar(255) DEFAULT NULL,
  `meta_value` longtext DEFAULT NULL,
  PRIMARY KEY (`meta_id`),
  KEY `post_id` (`post_id`),
  KEY `meta_key` (`meta_key`(191))
) ENGINE=InnoDB AUTO_INCREMENT=2417 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

INSERT INTO `wp_postmeta` VALUES ('5', '9', '_achadinho_preco', 'R$ 29,90');
INSERT INTO `wp_postmeta` VALUES ('6', '9', '_achadinho_preco_original', 'R$ 59,90');
INSERT INTO `wp_postmeta` VALUES ('7', '9', '_achadinho_desconto', '50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('8', '9', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=mini+aspirador+usb');
INSERT INTO `wp_postmeta` VALUES ('9', '9', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('10', '9', '_achadinho_num_avaliacoes', '2340');
INSERT INTO `wp_postmeta` VALUES ('11', '9', '_achadinho_especificacoes', 'Alimentação USB 5V\nAcompanha escova e borracha\nTamanho compacto 15cm\nPortátil e leve');
INSERT INTO `wp_postmeta` VALUES ('12', '9', '_achadinho_tags', 'aspirador, limpeza, teclado, usb, portátil');
INSERT INTO `wp_postmeta` VALUES ('13', '9', '_achadinho_destaque', '1');
INSERT INTO `wp_postmeta` VALUES ('14', '10', '_achadinho_preco', 'R$ 19,90');
INSERT INTO `wp_postmeta` VALUES ('15', '10', '_achadinho_preco_original', 'R$ 49,90');
INSERT INTO `wp_postmeta` VALUES ('16', '10', '_achadinho_desconto', '60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('17', '10', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=cabo+magnetico+3+em+1');
INSERT INTO `wp_postmeta` VALUES ('18', '10', '_achadinho_avaliacao', '4.6');
INSERT INTO `wp_postmeta` VALUES ('19', '10', '_achadinho_num_avaliacoes', '5670');
INSERT INTO `wp_postmeta` VALUES ('20', '10', '_achadinho_especificacoes', '3 pontas: USB-C, Micro, Lightning\nCarregamento rápido 3A\nConexão magnética\nComprimento 1.2m');
INSERT INTO `wp_postmeta` VALUES ('21', '10', '_achadinho_tags', 'cabo, magnético, carregador, 3 em 1, USB');
INSERT INTO `wp_postmeta` VALUES ('22', '11', '_achadinho_preco', 'R$ 24,90');
INSERT INTO `wp_postmeta` VALUES ('23', '11', '_achadinho_preco_original', 'R$ 54,90');
INSERT INTO `wp_postmeta` VALUES ('24', '11', '_achadinho_desconto', '54{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('25', '11', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=mini+ventilador+usb');
INSERT INTO `wp_postmeta` VALUES ('26', '11', '_achadinho_avaliacao', '4.3');
INSERT INTO `wp_postmeta` VALUES ('27', '11', '_achadinho_num_avaliacoes', '1890');
INSERT INTO `wp_postmeta` VALUES ('28', '11', '_achadinho_especificacoes', 'Porta USB alimentação\nSilencioso < 30dB\nBase articulada\nHélice flexível');
INSERT INTO `wp_postmeta` VALUES ('29', '11', '_achadinho_tags', 'ventilador, usb, silencioso, portátil, escritório');
INSERT INTO `wp_postmeta` VALUES ('30', '12', '_achadinho_preco', 'R$ 34,90');
INSERT INTO `wp_postmeta` VALUES ('31', '12', '_achadinho_preco_original', 'R$ 79,90');
INSERT INTO `wp_postmeta` VALUES ('32', '12', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('33', '12', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=lampada+inteligente+wi+fi');
INSERT INTO `wp_postmeta` VALUES ('34', '12', '_achadinho_avaliacao', '4.4');
INSERT INTO `wp_postmeta` VALUES ('35', '12', '_achadinho_num_avaliacoes', '3210');
INSERT INTO `wp_postmeta` VALUES ('36', '12', '_achadinho_especificacoes', 'Wi-Fi 2.4GHz\nCompatível Alexa/Google\n16 milhões de cores\nBocal E27');
INSERT INTO `wp_postmeta` VALUES ('37', '12', '_achadinho_tags', 'lâmpada, inteligente, wi-fi, alexa, smart');
INSERT INTO `wp_postmeta` VALUES ('38', '13', '_achadinho_preco', 'R$ 18,90');
INSERT INTO `wp_postmeta` VALUES ('39', '13', '_achadinho_preco_original', 'R$ 44,90');
INSERT INTO `wp_postmeta` VALUES ('40', '13', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('41', '13', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=fita+led+rgb+setup');
INSERT INTO `wp_postmeta` VALUES ('42', '13', '_achadinho_avaliacao', '4.7');
INSERT INTO `wp_postmeta` VALUES ('43', '13', '_achadinho_num_avaliacoes', '8900');
INSERT INTO `wp_postmeta` VALUES ('44', '13', '_achadinho_especificacoes', 'Comprimento 2m/5m\nControle remoto incluso\nRGB 16 cores\nAutoadesiva');
INSERT INTO `wp_postmeta` VALUES ('45', '13', '_achadinho_tags', 'fita, led, rgb, setup, gamer');
INSERT INTO `wp_postmeta` VALUES ('46', '14', '_achadinho_preco', 'R$ 22,90');
INSERT INTO `wp_postmeta` VALUES ('47', '14', '_achadinho_preco_original', 'R$ 54,90');
INSERT INTO `wp_postmeta` VALUES ('48', '14', '_achadinho_desconto', '58{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('49', '14', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=tripe+flexivel+celular');
INSERT INTO `wp_postmeta` VALUES ('50', '14', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('51', '14', '_achadinho_num_avaliacoes', '4560');
INSERT INTO `wp_postmeta` VALUES ('52', '14', '_achadinho_especificacoes', 'Pernas flexíveis articuláveis\nSuporte universal para celular\nBase antiderrapante\nPeso leve 200g');
INSERT INTO `wp_postmeta` VALUES ('53', '14', '_achadinho_tags', 'tripé, flexível, celular, vlog, foto');
INSERT INTO `wp_postmeta` VALUES ('54', '15', '_achadinho_preco', 'R$ 15,90');
INSERT INTO `wp_postmeta` VALUES ('55', '15', '_achadinho_preco_original', 'R$ 39,90');
INSERT INTO `wp_postmeta` VALUES ('56', '15', '_achadinho_desconto', '60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('57', '15', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=microfone+lapela');
INSERT INTO `wp_postmeta` VALUES ('58', '15', '_achadinho_avaliacao', '4.2');
INSERT INTO `wp_postmeta` VALUES ('59', '15', '_achadinho_num_avaliacoes', '2100');
INSERT INTO `wp_postmeta` VALUES ('60', '15', '_achadinho_especificacoes', 'Plug P2 3.5mm\nCabo 2m\nClipe de lapela\nEspuma antivento');
INSERT INTO `wp_postmeta` VALUES ('61', '15', '_achadinho_tags', 'microfone, lapela, áudio, gravacao, vlog');
INSERT INTO `wp_postmeta` VALUES ('62', '16', '_achadinho_preco', 'R$ 12,90');
INSERT INTO `wp_postmeta` VALUES ('63', '16', '_achadinho_preco_original', 'R$ 34,90');
INSERT INTO `wp_postmeta` VALUES ('64', '16', '_achadinho_desconto', '63{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('65', '16', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=lente+macro+celular');
INSERT INTO `wp_postmeta` VALUES ('66', '16', '_achadinho_avaliacao', '4.1');
INSERT INTO `wp_postmeta` VALUES ('67', '16', '_achadinho_num_avaliacoes', '1230');
INSERT INTO `wp_postmeta` VALUES ('68', '16', '_achadinho_especificacoes', 'Aumento 15x\nClip universal\nLente de vidro\n Estojo de transporte');
INSERT INTO `wp_postmeta` VALUES ('69', '16', '_achadinho_tags', 'lente, macro, celular, fotografia, acessório');
INSERT INTO `wp_postmeta` VALUES ('70', '17', '_achadinho_preco', 'R$ 26,90');
INSERT INTO `wp_postmeta` VALUES ('71', '17', '_achadinho_preco_original', 'R$ 59,90');
INSERT INTO `wp_postmeta` VALUES ('72', '17', '_achadinho_desconto', '55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('73', '17', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/suporte-articulado-celular');
INSERT INTO `wp_postmeta` VALUES ('74', '17', '_achadinho_avaliacao', '4.6');
INSERT INTO `wp_postmeta` VALUES ('75', '17', '_achadinho_num_avaliacoes', '6780');
INSERT INTO `wp_postmeta` VALUES ('76', '17', '_achadinho_especificacoes', 'Braço articulado 80cm\nBase de mesa com grampo\nGarra universal\nRotação 360°');
INSERT INTO `wp_postmeta` VALUES ('77', '17', '_achadinho_tags', 'suporte, celular, articulado, mesa, mãos livres');
INSERT INTO `wp_postmeta` VALUES ('78', '18', '_achadinho_preco', 'R$ 49,90');
INSERT INTO `wp_postmeta` VALUES ('79', '18', '_achadinho_preco_original', 'R$ 99,90');
INSERT INTO `wp_postmeta` VALUES ('80', '18', '_achadinho_desconto', '50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('81', '18', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=powerbank+slim+10000');
INSERT INTO `wp_postmeta` VALUES ('82', '18', '_achadinho_avaliacao', '4.4');
INSERT INTO `wp_postmeta` VALUES ('83', '18', '_achadinho_num_avaliacoes', '8900');
INSERT INTO `wp_postmeta` VALUES ('84', '18', '_achadinho_especificacoes', '10000mAh\nSaída 2.1A rápida\nEntrada USB-C\n2 saídas USB');
INSERT INTO `wp_postmeta` VALUES ('85', '18', '_achadinho_tags', 'powerbank, bateria, portátil, carregador, slim');
INSERT INTO `wp_postmeta` VALUES ('86', '19', '_achadinho_preco', 'R$ 32,90');
INSERT INTO `wp_postmeta` VALUES ('87', '19', '_achadinho_preco_original', 'R$ 74,90');
INSERT INTO `wp_postmeta` VALUES ('88', '19', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('89', '19', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/kit-chaves-precisao');
INSERT INTO `wp_postmeta` VALUES ('90', '19', '_achadinho_avaliacao', '4.8');
INSERT INTO `wp_postmeta` VALUES ('91', '19', '_achadinho_num_avaliacoes', '12300');
INSERT INTO `wp_postmeta` VALUES ('92', '19', '_achadinho_especificacoes', '24 peças\nPontas magnéticas\nEstojo organizador\nAço inoxidável');
INSERT INTO `wp_postmeta` VALUES ('93', '19', '_achadinho_tags', 'chaves, precisão, kit, manutenção, eletrônicos');
INSERT INTO `wp_postmeta` VALUES ('94', '20', '_achadinho_preco', 'R$ 38,90');
INSERT INTO `wp_postmeta` VALUES ('95', '20', '_achadinho_preco_original', 'R$ 89,90');
INSERT INTO `wp_postmeta` VALUES ('96', '20', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('97', '20', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=multimetro+digital');
INSERT INTO `wp_postmeta` VALUES ('98', '20', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('99', '20', '_achadinho_num_avaliacoes', '5670');
INSERT INTO `wp_postmeta` VALUES ('100', '20', '_achadinho_especificacoes', 'Tela LCD digital\nMede AC/DC\nTeste de continuidade\nCabo de prova incluso');
INSERT INTO `wp_postmeta` VALUES ('101', '20', '_achadinho_tags', 'multímetro, digital, voltagem, eletrônica, teste');
INSERT INTO `wp_postmeta` VALUES ('102', '21', '_achadinho_preco', 'R$ 9,90');
INSERT INTO `wp_postmeta` VALUES ('103', '21', '_achadinho_preco_original', 'R$ 24,90');
INSERT INTO `wp_postmeta` VALUES ('104', '21', '_achadinho_desconto', '60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('105', '21', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/pasta-termica-processador');
INSERT INTO `wp_postmeta` VALUES ('106', '21', '_achadinho_avaliacao', '4.3');
INSERT INTO `wp_postmeta` VALUES ('107', '21', '_achadinho_num_avaliacoes', '8900');
INSERT INTO `wp_postmeta` VALUES ('108', '21', '_achadinho_especificacoes', 'Condutividade 4.5 W/mK\nSeringa 3g\nNão condutiva\nAlta performance');
INSERT INTO `wp_postmeta` VALUES ('109', '21', '_achadinho_tags', 'pasta, térmica, processador, cooler, pc');
INSERT INTO `wp_postmeta` VALUES ('110', '22', '_achadinho_preco', 'R$ 14,90');
INSERT INTO `wp_postmeta` VALUES ('111', '22', '_achadinho_preco_original', 'R$ 34,90');
INSERT INTO `wp_postmeta` VALUES ('112', '22', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('113', '22', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=tapete+magnetico+parafusos');
INSERT INTO `wp_postmeta` VALUES ('114', '22', '_achadinho_avaliacao', '4.6');
INSERT INTO `wp_postmeta` VALUES ('115', '22', '_achadinho_num_avaliacoes', '3400');
INSERT INTO `wp_postmeta` VALUES ('116', '22', '_achadinho_especificacoes', 'Base magnética\nBorda elevada\nTamanho 30x20cm\nAntiderrapante');
INSERT INTO `wp_postmeta` VALUES ('117', '22', '_achadinho_tags', 'ímã, parafusos, organizador, ferramentas, oficina');
INSERT INTO `wp_postmeta` VALUES ('118', '23', '_achadinho_preco', 'R$ 21,90');
INSERT INTO `wp_postmeta` VALUES ('119', '23', '_achadinho_preco_original', 'R$ 49,90');
INSERT INTO `wp_postmeta` VALUES ('120', '23', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('121', '23', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/kit-limpeza-eletronicos');
INSERT INTO `wp_postmeta` VALUES ('122', '23', '_achadinho_avaliacao', '4.4');
INSERT INTO `wp_postmeta` VALUES ('123', '23', '_achadinho_num_avaliacoes', '2900');
INSERT INTO `wp_postmeta` VALUES ('124', '23', '_achadinho_especificacoes', 'Spray limpeza 100ml\nPincel antiestático\nFlanela microfibra\nHastes flexíveis');
INSERT INTO `wp_postmeta` VALUES ('125', '23', '_achadinho_tags', 'limpeza, kit, eletrônicos, teclado, câmera');
INSERT INTO `wp_postmeta` VALUES ('126', '24', '_achadinho_preco', 'R$ 89,90');
INSERT INTO `wp_postmeta` VALUES ('127', '24', '_achadinho_preco_original', 'R$ 199,90');
INSERT INTO `wp_postmeta` VALUES ('128', '24', '_achadinho_desconto', '55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('129', '24', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=mini+projetor+portatil');
INSERT INTO `wp_postmeta` VALUES ('130', '24', '_achadinho_avaliacao', '4.2');
INSERT INTO `wp_postmeta` VALUES ('131', '24', '_achadinho_num_avaliacoes', '4500');
INSERT INTO `wp_postmeta` VALUES ('132', '24', '_achadinho_especificacoes', 'Resolução nativa 480p\nSuporta Full HD\nConexão HDMI/USB/AV\nAlto-falante interno');
INSERT INTO `wp_postmeta` VALUES ('133', '24', '_achadinho_tags', 'projetor, portátil, mini, cinema, hdmi');
INSERT INTO `wp_postmeta` VALUES ('134', '25', '_achadinho_preco', 'R$ 18,90');
INSERT INTO `wp_postmeta` VALUES ('135', '25', '_achadinho_preco_original', 'R$ 44,90');
INSERT INTO `wp_postmeta` VALUES ('136', '25', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('137', '25', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/caneta-touch-tablet');
INSERT INTO `wp_postmeta` VALUES ('138', '25', '_achadinho_avaliacao', '4.1');
INSERT INTO `wp_postmeta` VALUES ('139', '25', '_achadinho_num_avaliacoes', '2300');
INSERT INTO `wp_postmeta` VALUES ('140', '25', '_achadinho_especificacoes', 'Ponta precisa 1.5mm\nPalm rejection\nBateria recarregável\nCompatível iOS/Android');
INSERT INTO `wp_postmeta` VALUES ('141', '25', '_achadinho_tags', 'caneta, touch, tablet, desenho, stylus');
INSERT INTO `wp_postmeta` VALUES ('142', '26', '_achadinho_preco', 'R$ 16,90');
INSERT INTO `wp_postmeta` VALUES ('143', '26', '_achadinho_preco_original', 'R$ 39,90');
INSERT INTO `wp_postmeta` VALUES ('144', '26', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('145', '26', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=sensor+presenca+usb');
INSERT INTO `wp_postmeta` VALUES ('146', '26', '_achadinho_avaliacao', '4.3');
INSERT INTO `wp_postmeta` VALUES ('147', '26', '_achadinho_num_avaliacoes', '1800');
INSERT INTO `wp_postmeta` VALUES ('148', '26', '_achadinho_especificacoes', 'Alimentação USB 5V\nAlcance 3m\nÂngulo 120°\nPlug and play');
INSERT INTO `wp_postmeta` VALUES ('149', '26', '_achadinho_tags', 'sensor, presença, usb, automação, led');
INSERT INTO `wp_postmeta` VALUES ('150', '27', '_achadinho_preco', 'R$ 42,90');
INSERT INTO `wp_postmeta` VALUES ('151', '27', '_achadinho_preco_original', 'R$ 89,90');
INSERT INTO `wp_postmeta` VALUES ('152', '27', '_achadinho_desconto', '52{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('153', '27', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/mini-teclado-wireless');
INSERT INTO `wp_postmeta` VALUES ('154', '27', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('155', '27', '_achadinho_num_avaliacoes', '6700');
INSERT INTO `wp_postmeta` VALUES ('156', '27', '_achadinho_especificacoes', 'Conexão 2.4GHz USB\nTouchpad integrado\nAlcance 10m\nBateria recarregável');
INSERT INTO `wp_postmeta` VALUES ('157', '27', '_achadinho_tags', 'teclado, wireless, mini, tv box, controle');
INSERT INTO `wp_postmeta` VALUES ('158', '28', '_achadinho_preco', 'R$ 28,90');
INSERT INTO `wp_postmeta` VALUES ('159', '28', '_achadinho_preco_original', 'R$ 64,90');
INSERT INTO `wp_postmeta` VALUES ('160', '28', '_achadinho_desconto', '55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('161', '28', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/luz-notificacao-rgb');
INSERT INTO `wp_postmeta` VALUES ('162', '28', '_achadinho_avaliacao', '4');
INSERT INTO `wp_postmeta` VALUES ('163', '28', '_achadinho_num_avaliacoes', '980');
INSERT INTO `wp_postmeta` VALUES ('164', '28', '_achadinho_especificacoes', 'Conexão Bluetooth\nApp para controle\nRGB personalizável\nAlimentação USB');
INSERT INTO `wp_postmeta` VALUES ('165', '28', '_achadinho_tags', 'luz, notificação, rgb, bluetooth, setup');
INSERT INTO `wp_postmeta` VALUES ('168', '32', '_wp_trash_meta_status', 'publish');
INSERT INTO `wp_postmeta` VALUES ('169', '32', '_wp_trash_meta_time', '1783053509');
INSERT INTO `wp_postmeta` VALUES ('170', '33', '_achadinho_preco', 'R$ 29,90');
INSERT INTO `wp_postmeta` VALUES ('171', '33', '_achadinho_preco_original', 'R$ 59,90');
INSERT INTO `wp_postmeta` VALUES ('172', '33', '_achadinho_desconto', '50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('173', '33', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=mini+aspirador+usb');
INSERT INTO `wp_postmeta` VALUES ('174', '33', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('175', '33', '_achadinho_num_avaliacoes', '2340');
INSERT INTO `wp_postmeta` VALUES ('176', '33', '_achadinho_especificacoes', 'Alimentação USB 5V\nAcompanha escova e borracha\nTamanho compacto 15cm\nPortátil e leve');
INSERT INTO `wp_postmeta` VALUES ('177', '33', '_achadinho_tags', 'aspirador, limpeza, teclado, usb, portátil');
INSERT INTO `wp_postmeta` VALUES ('178', '33', '_achadinho_destaque', '1');
INSERT INTO `wp_postmeta` VALUES ('179', '34', '_achadinho_preco', 'R$ 19,90');
INSERT INTO `wp_postmeta` VALUES ('180', '34', '_achadinho_preco_original', 'R$ 49,90');
INSERT INTO `wp_postmeta` VALUES ('181', '34', '_achadinho_desconto', '60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('182', '34', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=cabo+magnetico+3+em+1');
INSERT INTO `wp_postmeta` VALUES ('183', '34', '_achadinho_avaliacao', '4.6');
INSERT INTO `wp_postmeta` VALUES ('184', '34', '_achadinho_num_avaliacoes', '5670');
INSERT INTO `wp_postmeta` VALUES ('185', '34', '_achadinho_especificacoes', '3 pontas: USB-C, Micro, Lightning\nCarregamento rápido 3A\nConexão magnética\nComprimento 1.2m');
INSERT INTO `wp_postmeta` VALUES ('186', '34', '_achadinho_tags', 'cabo, magnético, carregador, 3 em 1, USB');
INSERT INTO `wp_postmeta` VALUES ('187', '35', '_achadinho_preco', 'R$ 24,90');
INSERT INTO `wp_postmeta` VALUES ('188', '35', '_achadinho_preco_original', 'R$ 54,90');
INSERT INTO `wp_postmeta` VALUES ('189', '35', '_achadinho_desconto', '54{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('190', '35', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=mini+ventilador+usb');
INSERT INTO `wp_postmeta` VALUES ('191', '35', '_achadinho_avaliacao', '4.3');
INSERT INTO `wp_postmeta` VALUES ('192', '35', '_achadinho_num_avaliacoes', '1890');
INSERT INTO `wp_postmeta` VALUES ('193', '35', '_achadinho_especificacoes', 'Porta USB alimentação\nSilencioso < 30dB\nBase articulada\nHélice flexível');
INSERT INTO `wp_postmeta` VALUES ('194', '35', '_achadinho_tags', 'ventilador, usb, silencioso, portátil, escritório');
INSERT INTO `wp_postmeta` VALUES ('195', '36', '_achadinho_preco', 'R$ 34,90');
INSERT INTO `wp_postmeta` VALUES ('196', '36', '_achadinho_preco_original', 'R$ 79,90');
INSERT INTO `wp_postmeta` VALUES ('197', '36', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('198', '36', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=lampada+inteligente+wi+fi');
INSERT INTO `wp_postmeta` VALUES ('199', '36', '_achadinho_avaliacao', '4.4');
INSERT INTO `wp_postmeta` VALUES ('200', '36', '_achadinho_num_avaliacoes', '3210');
INSERT INTO `wp_postmeta` VALUES ('201', '36', '_achadinho_especificacoes', 'Wi-Fi 2.4GHz\nCompatível Alexa/Google\n16 milhões de cores\nBocal E27');
INSERT INTO `wp_postmeta` VALUES ('202', '36', '_achadinho_tags', 'lâmpada, inteligente, wi-fi, alexa, smart');
INSERT INTO `wp_postmeta` VALUES ('203', '37', '_achadinho_preco', 'R$ 18,90');
INSERT INTO `wp_postmeta` VALUES ('204', '37', '_achadinho_preco_original', 'R$ 44,90');
INSERT INTO `wp_postmeta` VALUES ('205', '37', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('206', '37', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=fita+led+rgb+setup');
INSERT INTO `wp_postmeta` VALUES ('207', '37', '_achadinho_avaliacao', '4.7');
INSERT INTO `wp_postmeta` VALUES ('208', '37', '_achadinho_num_avaliacoes', '8900');
INSERT INTO `wp_postmeta` VALUES ('209', '37', '_achadinho_especificacoes', 'Comprimento 2m/5m\nControle remoto incluso\nRGB 16 cores\nAutoadesiva');
INSERT INTO `wp_postmeta` VALUES ('210', '37', '_achadinho_tags', 'fita, led, rgb, setup, gamer');
INSERT INTO `wp_postmeta` VALUES ('211', '38', '_achadinho_preco', 'R$ 22,90');
INSERT INTO `wp_postmeta` VALUES ('212', '38', '_achadinho_preco_original', 'R$ 54,90');
INSERT INTO `wp_postmeta` VALUES ('213', '38', '_achadinho_desconto', '58{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('214', '38', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=tripe+flexivel+celular');
INSERT INTO `wp_postmeta` VALUES ('215', '38', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('216', '38', '_achadinho_num_avaliacoes', '4560');
INSERT INTO `wp_postmeta` VALUES ('217', '38', '_achadinho_especificacoes', 'Pernas flexíveis articuláveis\nSuporte universal para celular\nBase antiderrapante\nPeso leve 200g');
INSERT INTO `wp_postmeta` VALUES ('218', '38', '_achadinho_tags', 'tripé, flexível, celular, vlog, foto');
INSERT INTO `wp_postmeta` VALUES ('219', '39', '_achadinho_preco', 'R$ 15,90');
INSERT INTO `wp_postmeta` VALUES ('220', '39', '_achadinho_preco_original', 'R$ 39,90');
INSERT INTO `wp_postmeta` VALUES ('221', '39', '_achadinho_desconto', '60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('222', '39', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=microfone+lapela');
INSERT INTO `wp_postmeta` VALUES ('223', '39', '_achadinho_avaliacao', '4.2');
INSERT INTO `wp_postmeta` VALUES ('224', '39', '_achadinho_num_avaliacoes', '2100');
INSERT INTO `wp_postmeta` VALUES ('225', '39', '_achadinho_especificacoes', 'Plug P2 3.5mm\nCabo 2m\nClipe de lapela\nEspuma antivento');
INSERT INTO `wp_postmeta` VALUES ('226', '39', '_achadinho_tags', 'microfone, lapela, áudio, gravacao, vlog');
INSERT INTO `wp_postmeta` VALUES ('227', '40', '_achadinho_preco', 'R$ 12,90');
INSERT INTO `wp_postmeta` VALUES ('228', '40', '_achadinho_preco_original', 'R$ 34,90');
INSERT INTO `wp_postmeta` VALUES ('229', '40', '_achadinho_desconto', '63{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('230', '40', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=lente+macro+celular');
INSERT INTO `wp_postmeta` VALUES ('231', '40', '_achadinho_avaliacao', '4.1');
INSERT INTO `wp_postmeta` VALUES ('232', '40', '_achadinho_num_avaliacoes', '1230');
INSERT INTO `wp_postmeta` VALUES ('233', '40', '_achadinho_especificacoes', 'Aumento 15x\nClip universal\nLente de vidro\n Estojo de transporte');
INSERT INTO `wp_postmeta` VALUES ('234', '40', '_achadinho_tags', 'lente, macro, celular, fotografia, acessório');
INSERT INTO `wp_postmeta` VALUES ('235', '41', '_achadinho_preco', 'R$ 26,90');
INSERT INTO `wp_postmeta` VALUES ('236', '41', '_achadinho_preco_original', 'R$ 59,90');
INSERT INTO `wp_postmeta` VALUES ('237', '41', '_achadinho_desconto', '55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('238', '41', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/suporte-articulado-celular');
INSERT INTO `wp_postmeta` VALUES ('239', '41', '_achadinho_avaliacao', '4.6');
INSERT INTO `wp_postmeta` VALUES ('240', '41', '_achadinho_num_avaliacoes', '6780');
INSERT INTO `wp_postmeta` VALUES ('241', '41', '_achadinho_especificacoes', 'Braço articulado 80cm\nBase de mesa com grampo\nGarra universal\nRotação 360°');
INSERT INTO `wp_postmeta` VALUES ('242', '41', '_achadinho_tags', 'suporte, celular, articulado, mesa, mãos livres');
INSERT INTO `wp_postmeta` VALUES ('243', '42', '_achadinho_preco', 'R$ 49,90');
INSERT INTO `wp_postmeta` VALUES ('244', '42', '_achadinho_preco_original', 'R$ 99,90');
INSERT INTO `wp_postmeta` VALUES ('245', '42', '_achadinho_desconto', '50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('246', '42', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=powerbank+slim+10000');
INSERT INTO `wp_postmeta` VALUES ('247', '42', '_achadinho_avaliacao', '4.4');
INSERT INTO `wp_postmeta` VALUES ('248', '42', '_achadinho_num_avaliacoes', '8900');
INSERT INTO `wp_postmeta` VALUES ('249', '42', '_achadinho_especificacoes', '10000mAh\nSaída 2.1A rápida\nEntrada USB-C\n2 saídas USB');
INSERT INTO `wp_postmeta` VALUES ('250', '42', '_achadinho_tags', 'powerbank, bateria, portátil, carregador, slim');
INSERT INTO `wp_postmeta` VALUES ('251', '43', '_achadinho_preco', 'R$ 32,90');
INSERT INTO `wp_postmeta` VALUES ('252', '43', '_achadinho_preco_original', 'R$ 74,90');
INSERT INTO `wp_postmeta` VALUES ('253', '43', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('254', '43', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/kit-chaves-precisao');
INSERT INTO `wp_postmeta` VALUES ('255', '43', '_achadinho_avaliacao', '4.8');
INSERT INTO `wp_postmeta` VALUES ('256', '43', '_achadinho_num_avaliacoes', '12300');
INSERT INTO `wp_postmeta` VALUES ('257', '43', '_achadinho_especificacoes', '24 peças\nPontas magnéticas\nEstojo organizador\nAço inoxidável');
INSERT INTO `wp_postmeta` VALUES ('258', '43', '_achadinho_tags', 'chaves, precisão, kit, manutenção, eletrônicos');
INSERT INTO `wp_postmeta` VALUES ('259', '44', '_achadinho_preco', 'R$ 38,90');
INSERT INTO `wp_postmeta` VALUES ('260', '44', '_achadinho_preco_original', 'R$ 89,90');
INSERT INTO `wp_postmeta` VALUES ('261', '44', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('262', '44', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=multimetro+digital');
INSERT INTO `wp_postmeta` VALUES ('263', '44', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('264', '44', '_achadinho_num_avaliacoes', '5670');
INSERT INTO `wp_postmeta` VALUES ('265', '44', '_achadinho_especificacoes', 'Tela LCD digital\nMede AC/DC\nTeste de continuidade\nCabo de prova incluso');
INSERT INTO `wp_postmeta` VALUES ('266', '44', '_achadinho_tags', 'multímetro, digital, voltagem, eletrônica, teste');
INSERT INTO `wp_postmeta` VALUES ('267', '45', '_achadinho_preco', 'R$ 9,90');
INSERT INTO `wp_postmeta` VALUES ('268', '45', '_achadinho_preco_original', 'R$ 24,90');
INSERT INTO `wp_postmeta` VALUES ('269', '45', '_achadinho_desconto', '60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('270', '45', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/pasta-termica-processador');
INSERT INTO `wp_postmeta` VALUES ('271', '45', '_achadinho_avaliacao', '4.3');
INSERT INTO `wp_postmeta` VALUES ('272', '45', '_achadinho_num_avaliacoes', '8900');
INSERT INTO `wp_postmeta` VALUES ('273', '45', '_achadinho_especificacoes', 'Condutividade 4.5 W/mK\nSeringa 3g\nNão condutiva\nAlta performance');
INSERT INTO `wp_postmeta` VALUES ('274', '45', '_achadinho_tags', 'pasta, térmica, processador, cooler, pc');
INSERT INTO `wp_postmeta` VALUES ('275', '46', '_achadinho_preco', 'R$ 14,90');
INSERT INTO `wp_postmeta` VALUES ('276', '46', '_achadinho_preco_original', 'R$ 34,90');
INSERT INTO `wp_postmeta` VALUES ('277', '46', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('278', '46', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=tapete+magnetico+parafusos');
INSERT INTO `wp_postmeta` VALUES ('279', '46', '_achadinho_avaliacao', '4.6');
INSERT INTO `wp_postmeta` VALUES ('280', '46', '_achadinho_num_avaliacoes', '3400');
INSERT INTO `wp_postmeta` VALUES ('281', '46', '_achadinho_especificacoes', 'Base magnética\nBorda elevada\nTamanho 30x20cm\nAntiderrapante');
INSERT INTO `wp_postmeta` VALUES ('282', '46', '_achadinho_tags', 'ímã, parafusos, organizador, ferramentas, oficina');
INSERT INTO `wp_postmeta` VALUES ('283', '47', '_achadinho_preco', 'R$ 21,90');
INSERT INTO `wp_postmeta` VALUES ('284', '47', '_achadinho_preco_original', 'R$ 49,90');
INSERT INTO `wp_postmeta` VALUES ('285', '47', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('286', '47', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/kit-limpeza-eletronicos');
INSERT INTO `wp_postmeta` VALUES ('287', '47', '_achadinho_avaliacao', '4.4');
INSERT INTO `wp_postmeta` VALUES ('288', '47', '_achadinho_num_avaliacoes', '2900');
INSERT INTO `wp_postmeta` VALUES ('289', '47', '_achadinho_especificacoes', 'Spray limpeza 100ml\nPincel antiestático\nFlanela microfibra\nHastes flexíveis');
INSERT INTO `wp_postmeta` VALUES ('290', '47', '_achadinho_tags', 'limpeza, kit, eletrônicos, teclado, câmera');
INSERT INTO `wp_postmeta` VALUES ('291', '48', '_achadinho_preco', 'R$ 89,90');
INSERT INTO `wp_postmeta` VALUES ('292', '48', '_achadinho_preco_original', 'R$ 199,90');
INSERT INTO `wp_postmeta` VALUES ('293', '48', '_achadinho_desconto', '55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('294', '48', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=mini+projetor+portatil');
INSERT INTO `wp_postmeta` VALUES ('295', '48', '_achadinho_avaliacao', '4.2');
INSERT INTO `wp_postmeta` VALUES ('296', '48', '_achadinho_num_avaliacoes', '4500');
INSERT INTO `wp_postmeta` VALUES ('297', '48', '_achadinho_especificacoes', 'Resolução nativa 480p\nSuporta Full HD\nConexão HDMI/USB/AV\nAlto-falante interno');
INSERT INTO `wp_postmeta` VALUES ('298', '48', '_achadinho_tags', 'projetor, portátil, mini, cinema, hdmi');
INSERT INTO `wp_postmeta` VALUES ('299', '49', '_achadinho_preco', 'R$ 18,90');
INSERT INTO `wp_postmeta` VALUES ('300', '49', '_achadinho_preco_original', 'R$ 44,90');
INSERT INTO `wp_postmeta` VALUES ('301', '49', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('302', '49', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/caneta-touch-tablet');
INSERT INTO `wp_postmeta` VALUES ('303', '49', '_achadinho_avaliacao', '4.1');
INSERT INTO `wp_postmeta` VALUES ('304', '49', '_achadinho_num_avaliacoes', '2300');
INSERT INTO `wp_postmeta` VALUES ('305', '49', '_achadinho_especificacoes', 'Ponta precisa 1.5mm\nPalm rejection\nBateria recarregável\nCompatível iOS/Android');
INSERT INTO `wp_postmeta` VALUES ('306', '49', '_achadinho_tags', 'caneta, touch, tablet, desenho, stylus');
INSERT INTO `wp_postmeta` VALUES ('307', '50', '_achadinho_preco', 'R$ 16,90');
INSERT INTO `wp_postmeta` VALUES ('308', '50', '_achadinho_preco_original', 'R$ 39,90');
INSERT INTO `wp_postmeta` VALUES ('309', '50', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('310', '50', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=sensor+presenca+usb');
INSERT INTO `wp_postmeta` VALUES ('311', '50', '_achadinho_avaliacao', '4.3');
INSERT INTO `wp_postmeta` VALUES ('312', '50', '_achadinho_num_avaliacoes', '1800');
INSERT INTO `wp_postmeta` VALUES ('313', '50', '_achadinho_especificacoes', 'Alimentação USB 5V\nAlcance 3m\nÂngulo 120°\nPlug and play');
INSERT INTO `wp_postmeta` VALUES ('314', '50', '_achadinho_tags', 'sensor, presença, usb, automação, led');
INSERT INTO `wp_postmeta` VALUES ('315', '51', '_achadinho_preco', 'R$ 42,90');
INSERT INTO `wp_postmeta` VALUES ('316', '51', '_achadinho_preco_original', 'R$ 89,90');
INSERT INTO `wp_postmeta` VALUES ('317', '51', '_achadinho_desconto', '52{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('318', '51', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/mini-teclado-wireless');
INSERT INTO `wp_postmeta` VALUES ('319', '51', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('320', '51', '_achadinho_num_avaliacoes', '6700');
INSERT INTO `wp_postmeta` VALUES ('321', '51', '_achadinho_especificacoes', 'Conexão 2.4GHz USB\nTouchpad integrado\nAlcance 10m\nBateria recarregável');
INSERT INTO `wp_postmeta` VALUES ('322', '51', '_achadinho_tags', 'teclado, wireless, mini, tv box, controle');
INSERT INTO `wp_postmeta` VALUES ('323', '52', '_achadinho_preco', 'R$ 28,90');
INSERT INTO `wp_postmeta` VALUES ('324', '52', '_achadinho_preco_original', 'R$ 64,90');
INSERT INTO `wp_postmeta` VALUES ('325', '52', '_achadinho_desconto', '55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('326', '52', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/luz-notificacao-rgb');
INSERT INTO `wp_postmeta` VALUES ('327', '52', '_achadinho_avaliacao', '4');
INSERT INTO `wp_postmeta` VALUES ('328', '52', '_achadinho_num_avaliacoes', '980');
INSERT INTO `wp_postmeta` VALUES ('329', '52', '_achadinho_especificacoes', 'Conexão Bluetooth\nApp para controle\nRGB personalizável\nAlimentação USB');
INSERT INTO `wp_postmeta` VALUES ('330', '52', '_achadinho_tags', 'luz, notificação, rgb, bluetooth, setup');
INSERT INTO `wp_postmeta` VALUES ('331', '56', '_achadinho_preco', 'R$ 29,90');
INSERT INTO `wp_postmeta` VALUES ('332', '56', '_achadinho_preco_original', 'R$ 59,90');
INSERT INTO `wp_postmeta` VALUES ('333', '56', '_achadinho_desconto', '50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('334', '56', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=mini+aspirador+usb');
INSERT INTO `wp_postmeta` VALUES ('335', '56', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('336', '56', '_achadinho_num_avaliacoes', '2340');
INSERT INTO `wp_postmeta` VALUES ('337', '56', '_achadinho_especificacoes', 'Alimentação USB 5V\nAcompanha escova e borracha\nTamanho compacto 15cm\nPortátil e leve');
INSERT INTO `wp_postmeta` VALUES ('338', '56', '_achadinho_tags', 'aspirador, limpeza, teclado, usb, portátil');
INSERT INTO `wp_postmeta` VALUES ('339', '56', '_achadinho_destaque', '1');
INSERT INTO `wp_postmeta` VALUES ('340', '57', '_achadinho_preco', 'R$ 19,90');
INSERT INTO `wp_postmeta` VALUES ('341', '57', '_achadinho_preco_original', 'R$ 49,90');
INSERT INTO `wp_postmeta` VALUES ('342', '57', '_achadinho_desconto', '60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('343', '57', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=cabo+magnetico+3+em+1');
INSERT INTO `wp_postmeta` VALUES ('344', '57', '_achadinho_avaliacao', '4.6');
INSERT INTO `wp_postmeta` VALUES ('345', '57', '_achadinho_num_avaliacoes', '5670');
INSERT INTO `wp_postmeta` VALUES ('346', '57', '_achadinho_especificacoes', '3 pontas: USB-C, Micro, Lightning\nCarregamento rápido 3A\nConexão magnética\nComprimento 1.2m');
INSERT INTO `wp_postmeta` VALUES ('347', '57', '_achadinho_tags', 'cabo, magnético, carregador, 3 em 1, USB');
INSERT INTO `wp_postmeta` VALUES ('348', '58', '_achadinho_preco', 'R$ 24,90');
INSERT INTO `wp_postmeta` VALUES ('349', '58', '_achadinho_preco_original', 'R$ 54,90');
INSERT INTO `wp_postmeta` VALUES ('350', '58', '_achadinho_desconto', '54{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('351', '58', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=mini+ventilador+usb');
INSERT INTO `wp_postmeta` VALUES ('352', '58', '_achadinho_avaliacao', '4.3');
INSERT INTO `wp_postmeta` VALUES ('353', '58', '_achadinho_num_avaliacoes', '1890');
INSERT INTO `wp_postmeta` VALUES ('354', '58', '_achadinho_especificacoes', 'Porta USB alimentação\nSilencioso < 30dB\nBase articulada\nHélice flexível');
INSERT INTO `wp_postmeta` VALUES ('355', '58', '_achadinho_tags', 'ventilador, usb, silencioso, portátil, escritório');
INSERT INTO `wp_postmeta` VALUES ('356', '59', '_achadinho_preco', 'R$ 34,90');
INSERT INTO `wp_postmeta` VALUES ('357', '59', '_achadinho_preco_original', 'R$ 79,90');
INSERT INTO `wp_postmeta` VALUES ('358', '59', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('359', '59', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=lampada+inteligente+wi+fi');
INSERT INTO `wp_postmeta` VALUES ('360', '59', '_achadinho_avaliacao', '4.4');
INSERT INTO `wp_postmeta` VALUES ('361', '59', '_achadinho_num_avaliacoes', '3210');
INSERT INTO `wp_postmeta` VALUES ('362', '59', '_achadinho_especificacoes', 'Wi-Fi 2.4GHz\nCompatível Alexa/Google\n16 milhões de cores\nBocal E27');
INSERT INTO `wp_postmeta` VALUES ('363', '59', '_achadinho_tags', 'lâmpada, inteligente, wi-fi, alexa, smart');
INSERT INTO `wp_postmeta` VALUES ('364', '60', '_achadinho_preco', 'R$ 18,90');
INSERT INTO `wp_postmeta` VALUES ('365', '60', '_achadinho_preco_original', 'R$ 44,90');
INSERT INTO `wp_postmeta` VALUES ('366', '60', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('367', '60', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=fita+led+rgb+setup');
INSERT INTO `wp_postmeta` VALUES ('368', '60', '_achadinho_avaliacao', '4.7');
INSERT INTO `wp_postmeta` VALUES ('369', '60', '_achadinho_num_avaliacoes', '8900');
INSERT INTO `wp_postmeta` VALUES ('370', '60', '_achadinho_especificacoes', 'Comprimento 2m/5m\nControle remoto incluso\nRGB 16 cores\nAutoadesiva');
INSERT INTO `wp_postmeta` VALUES ('371', '60', '_achadinho_tags', 'fita, led, rgb, setup, gamer');
INSERT INTO `wp_postmeta` VALUES ('372', '61', '_achadinho_preco', 'R$ 22,90');
INSERT INTO `wp_postmeta` VALUES ('373', '61', '_achadinho_preco_original', 'R$ 54,90');
INSERT INTO `wp_postmeta` VALUES ('374', '61', '_achadinho_desconto', '58{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('375', '61', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=tripe+flexivel+celular');
INSERT INTO `wp_postmeta` VALUES ('376', '61', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('377', '61', '_achadinho_num_avaliacoes', '4560');
INSERT INTO `wp_postmeta` VALUES ('378', '61', '_achadinho_especificacoes', 'Pernas flexíveis articuláveis\nSuporte universal para celular\nBase antiderrapante\nPeso leve 200g');
INSERT INTO `wp_postmeta` VALUES ('379', '61', '_achadinho_tags', 'tripé, flexível, celular, vlog, foto');
INSERT INTO `wp_postmeta` VALUES ('380', '62', '_achadinho_preco', 'R$ 15,90');
INSERT INTO `wp_postmeta` VALUES ('381', '62', '_achadinho_preco_original', 'R$ 39,90');
INSERT INTO `wp_postmeta` VALUES ('382', '62', '_achadinho_desconto', '60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('383', '62', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=microfone+lapela');
INSERT INTO `wp_postmeta` VALUES ('384', '62', '_achadinho_avaliacao', '4.2');
INSERT INTO `wp_postmeta` VALUES ('385', '62', '_achadinho_num_avaliacoes', '2100');
INSERT INTO `wp_postmeta` VALUES ('386', '62', '_achadinho_especificacoes', 'Plug P2 3.5mm\nCabo 2m\nClipe de lapela\nEspuma antivento');
INSERT INTO `wp_postmeta` VALUES ('387', '62', '_achadinho_tags', 'microfone, lapela, áudio, gravacao, vlog');
INSERT INTO `wp_postmeta` VALUES ('388', '63', '_achadinho_preco', 'R$ 12,90');
INSERT INTO `wp_postmeta` VALUES ('389', '63', '_achadinho_preco_original', 'R$ 34,90');
INSERT INTO `wp_postmeta` VALUES ('390', '63', '_achadinho_desconto', '63{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('391', '63', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=lente+macro+celular');
INSERT INTO `wp_postmeta` VALUES ('392', '63', '_achadinho_avaliacao', '4.1');
INSERT INTO `wp_postmeta` VALUES ('393', '63', '_achadinho_num_avaliacoes', '1230');
INSERT INTO `wp_postmeta` VALUES ('394', '63', '_achadinho_especificacoes', 'Aumento 15x\nClip universal\nLente de vidro\n Estojo de transporte');
INSERT INTO `wp_postmeta` VALUES ('395', '63', '_achadinho_tags', 'lente, macro, celular, fotografia, acessório');
INSERT INTO `wp_postmeta` VALUES ('396', '64', '_achadinho_preco', 'R$ 26,90');
INSERT INTO `wp_postmeta` VALUES ('397', '64', '_achadinho_preco_original', 'R$ 59,90');
INSERT INTO `wp_postmeta` VALUES ('398', '64', '_achadinho_desconto', '55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('399', '64', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/suporte-articulado-celular');
INSERT INTO `wp_postmeta` VALUES ('400', '64', '_achadinho_avaliacao', '4.6');
INSERT INTO `wp_postmeta` VALUES ('401', '64', '_achadinho_num_avaliacoes', '6780');
INSERT INTO `wp_postmeta` VALUES ('402', '64', '_achadinho_especificacoes', 'Braço articulado 80cm\nBase de mesa com grampo\nGarra universal\nRotação 360°');
INSERT INTO `wp_postmeta` VALUES ('403', '64', '_achadinho_tags', 'suporte, celular, articulado, mesa, mãos livres');
INSERT INTO `wp_postmeta` VALUES ('404', '65', '_achadinho_preco', 'R$ 49,90');
INSERT INTO `wp_postmeta` VALUES ('405', '65', '_achadinho_preco_original', 'R$ 99,90');
INSERT INTO `wp_postmeta` VALUES ('406', '65', '_achadinho_desconto', '50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('407', '65', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=powerbank+slim+10000');
INSERT INTO `wp_postmeta` VALUES ('408', '65', '_achadinho_avaliacao', '4.4');
INSERT INTO `wp_postmeta` VALUES ('409', '65', '_achadinho_num_avaliacoes', '8900');
INSERT INTO `wp_postmeta` VALUES ('410', '65', '_achadinho_especificacoes', '10000mAh\nSaída 2.1A rápida\nEntrada USB-C\n2 saídas USB');
INSERT INTO `wp_postmeta` VALUES ('411', '65', '_achadinho_tags', 'powerbank, bateria, portátil, carregador, slim');
INSERT INTO `wp_postmeta` VALUES ('412', '66', '_achadinho_preco', 'R$ 32,90');
INSERT INTO `wp_postmeta` VALUES ('413', '66', '_achadinho_preco_original', 'R$ 74,90');
INSERT INTO `wp_postmeta` VALUES ('414', '66', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('415', '66', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/kit-chaves-precisao');
INSERT INTO `wp_postmeta` VALUES ('416', '66', '_achadinho_avaliacao', '4.8');
INSERT INTO `wp_postmeta` VALUES ('417', '66', '_achadinho_num_avaliacoes', '12300');
INSERT INTO `wp_postmeta` VALUES ('418', '66', '_achadinho_especificacoes', '24 peças\nPontas magnéticas\nEstojo organizador\nAço inoxidável');
INSERT INTO `wp_postmeta` VALUES ('419', '66', '_achadinho_tags', 'chaves, precisão, kit, manutenção, eletrônicos');
INSERT INTO `wp_postmeta` VALUES ('420', '67', '_achadinho_preco', 'R$ 38,90');
INSERT INTO `wp_postmeta` VALUES ('421', '67', '_achadinho_preco_original', 'R$ 89,90');
INSERT INTO `wp_postmeta` VALUES ('422', '67', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('423', '67', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=multimetro+digital');
INSERT INTO `wp_postmeta` VALUES ('424', '67', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('425', '67', '_achadinho_num_avaliacoes', '5670');
INSERT INTO `wp_postmeta` VALUES ('426', '67', '_achadinho_especificacoes', 'Tela LCD digital\nMede AC/DC\nTeste de continuidade\nCabo de prova incluso');
INSERT INTO `wp_postmeta` VALUES ('427', '67', '_achadinho_tags', 'multímetro, digital, voltagem, eletrônica, teste');
INSERT INTO `wp_postmeta` VALUES ('428', '68', '_achadinho_preco', 'R$ 9,90');
INSERT INTO `wp_postmeta` VALUES ('429', '68', '_achadinho_preco_original', 'R$ 24,90');
INSERT INTO `wp_postmeta` VALUES ('430', '68', '_achadinho_desconto', '60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('431', '68', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/pasta-termica-processador');
INSERT INTO `wp_postmeta` VALUES ('432', '68', '_achadinho_avaliacao', '4.3');
INSERT INTO `wp_postmeta` VALUES ('433', '68', '_achadinho_num_avaliacoes', '8900');
INSERT INTO `wp_postmeta` VALUES ('434', '68', '_achadinho_especificacoes', 'Condutividade 4.5 W/mK\nSeringa 3g\nNão condutiva\nAlta performance');
INSERT INTO `wp_postmeta` VALUES ('435', '68', '_achadinho_tags', 'pasta, térmica, processador, cooler, pc');
INSERT INTO `wp_postmeta` VALUES ('436', '69', '_achadinho_preco', 'R$ 14,90');
INSERT INTO `wp_postmeta` VALUES ('437', '69', '_achadinho_preco_original', 'R$ 34,90');
INSERT INTO `wp_postmeta` VALUES ('438', '69', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('439', '69', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=tapete+magnetico+parafusos');
INSERT INTO `wp_postmeta` VALUES ('440', '69', '_achadinho_avaliacao', '4.6');
INSERT INTO `wp_postmeta` VALUES ('441', '69', '_achadinho_num_avaliacoes', '3400');
INSERT INTO `wp_postmeta` VALUES ('442', '69', '_achadinho_especificacoes', 'Base magnética\nBorda elevada\nTamanho 30x20cm\nAntiderrapante');
INSERT INTO `wp_postmeta` VALUES ('443', '69', '_achadinho_tags', 'ímã, parafusos, organizador, ferramentas, oficina');
INSERT INTO `wp_postmeta` VALUES ('444', '70', '_achadinho_preco', 'R$ 21,90');
INSERT INTO `wp_postmeta` VALUES ('445', '70', '_achadinho_preco_original', 'R$ 49,90');
INSERT INTO `wp_postmeta` VALUES ('446', '70', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('447', '70', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/kit-limpeza-eletronicos');
INSERT INTO `wp_postmeta` VALUES ('448', '70', '_achadinho_avaliacao', '4.4');
INSERT INTO `wp_postmeta` VALUES ('449', '70', '_achadinho_num_avaliacoes', '2900');
INSERT INTO `wp_postmeta` VALUES ('450', '70', '_achadinho_especificacoes', 'Spray limpeza 100ml\nPincel antiestático\nFlanela microfibra\nHastes flexíveis');
INSERT INTO `wp_postmeta` VALUES ('451', '70', '_achadinho_tags', 'limpeza, kit, eletrônicos, teclado, câmera');
INSERT INTO `wp_postmeta` VALUES ('452', '71', '_achadinho_preco', 'R$ 89,90');
INSERT INTO `wp_postmeta` VALUES ('453', '71', '_achadinho_preco_original', 'R$ 199,90');
INSERT INTO `wp_postmeta` VALUES ('454', '71', '_achadinho_desconto', '55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('455', '71', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=mini+projetor+portatil');
INSERT INTO `wp_postmeta` VALUES ('456', '71', '_achadinho_avaliacao', '4.2');
INSERT INTO `wp_postmeta` VALUES ('457', '71', '_achadinho_num_avaliacoes', '4500');
INSERT INTO `wp_postmeta` VALUES ('458', '71', '_achadinho_especificacoes', 'Resolução nativa 480p\nSuporta Full HD\nConexão HDMI/USB/AV\nAlto-falante interno');
INSERT INTO `wp_postmeta` VALUES ('459', '71', '_achadinho_tags', 'projetor, portátil, mini, cinema, hdmi');
INSERT INTO `wp_postmeta` VALUES ('460', '72', '_achadinho_preco', 'R$ 18,90');
INSERT INTO `wp_postmeta` VALUES ('461', '72', '_achadinho_preco_original', 'R$ 44,90');
INSERT INTO `wp_postmeta` VALUES ('462', '72', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('463', '72', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/caneta-touch-tablet');
INSERT INTO `wp_postmeta` VALUES ('464', '72', '_achadinho_avaliacao', '4.1');
INSERT INTO `wp_postmeta` VALUES ('465', '72', '_achadinho_num_avaliacoes', '2300');
INSERT INTO `wp_postmeta` VALUES ('466', '72', '_achadinho_especificacoes', 'Ponta precisa 1.5mm\nPalm rejection\nBateria recarregável\nCompatível iOS/Android');
INSERT INTO `wp_postmeta` VALUES ('467', '72', '_achadinho_tags', 'caneta, touch, tablet, desenho, stylus');
INSERT INTO `wp_postmeta` VALUES ('468', '73', '_achadinho_preco', 'R$ 16,90');
INSERT INTO `wp_postmeta` VALUES ('469', '73', '_achadinho_preco_original', 'R$ 39,90');
INSERT INTO `wp_postmeta` VALUES ('470', '73', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('471', '73', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=sensor+presenca+usb');
INSERT INTO `wp_postmeta` VALUES ('472', '73', '_achadinho_avaliacao', '4.3');
INSERT INTO `wp_postmeta` VALUES ('473', '73', '_achadinho_num_avaliacoes', '1800');
INSERT INTO `wp_postmeta` VALUES ('474', '73', '_achadinho_especificacoes', 'Alimentação USB 5V\nAlcance 3m\nÂngulo 120°\nPlug and play');
INSERT INTO `wp_postmeta` VALUES ('475', '73', '_achadinho_tags', 'sensor, presença, usb, automação, led');
INSERT INTO `wp_postmeta` VALUES ('476', '74', '_achadinho_preco', 'R$ 42,90');
INSERT INTO `wp_postmeta` VALUES ('477', '74', '_achadinho_preco_original', 'R$ 89,90');
INSERT INTO `wp_postmeta` VALUES ('478', '74', '_achadinho_desconto', '52{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('479', '74', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/mini-teclado-wireless');
INSERT INTO `wp_postmeta` VALUES ('480', '74', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('481', '74', '_achadinho_num_avaliacoes', '6700');
INSERT INTO `wp_postmeta` VALUES ('482', '74', '_achadinho_especificacoes', 'Conexão 2.4GHz USB\nTouchpad integrado\nAlcance 10m\nBateria recarregável');
INSERT INTO `wp_postmeta` VALUES ('483', '74', '_achadinho_tags', 'teclado, wireless, mini, tv box, controle');
INSERT INTO `wp_postmeta` VALUES ('484', '75', '_achadinho_preco', 'R$ 28,90');
INSERT INTO `wp_postmeta` VALUES ('485', '75', '_achadinho_preco_original', 'R$ 64,90');
INSERT INTO `wp_postmeta` VALUES ('486', '75', '_achadinho_desconto', '55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('487', '75', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/luz-notificacao-rgb');
INSERT INTO `wp_postmeta` VALUES ('488', '75', '_achadinho_avaliacao', '4');
INSERT INTO `wp_postmeta` VALUES ('489', '75', '_achadinho_num_avaliacoes', '980');
INSERT INTO `wp_postmeta` VALUES ('490', '75', '_achadinho_especificacoes', 'Conexão Bluetooth\nApp para controle\nRGB personalizável\nAlimentação USB');
INSERT INTO `wp_postmeta` VALUES ('491', '75', '_achadinho_tags', 'luz, notificação, rgb, bluetooth, setup');
INSERT INTO `wp_postmeta` VALUES ('492', '76', '_wp_attached_file', '2026/07/achadinho-9.jpg');
INSERT INTO `wp_postmeta` VALUES ('493', '76', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:23:\"2026/07/achadinho-9.jpg\";s:8:\"filesize\";i:43608;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 901\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 901\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('494', '9', '_thumbnail_id', '76');
INSERT INTO `wp_postmeta` VALUES ('495', '77', '_wp_attached_file', '2026/07/achadinho-33.jpg');
INSERT INTO `wp_postmeta` VALUES ('496', '77', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/07/achadinho-33.jpg\";s:8:\"filesize\";i:89445;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 966\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 966\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('497', '33', '_thumbnail_id', '77');
INSERT INTO `wp_postmeta` VALUES ('498', '78', '_wp_attached_file', '2026/07/achadinho-56.jpg');
INSERT INTO `wp_postmeta` VALUES ('499', '78', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/07/achadinho-56.jpg\";s:8:\"filesize\";i:131811;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 441\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 441\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('500', '56', '_thumbnail_id', '78');
INSERT INTO `wp_postmeta` VALUES ('501', '79', '_wp_attached_file', '2026/07/achadinho-10.jpg');
INSERT INTO `wp_postmeta` VALUES ('502', '79', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/07/achadinho-10.jpg\";s:8:\"filesize\";i:88424;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:15:\"Picsum ID: 1059\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:15:\"Picsum ID: 1059\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('503', '10', '_thumbnail_id', '79');
INSERT INTO `wp_postmeta` VALUES ('504', '80', '_wp_attached_file', '2026/07/achadinho-34.jpg');
INSERT INTO `wp_postmeta` VALUES ('505', '80', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/07/achadinho-34.jpg\";s:8:\"filesize\";i:77300;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 853\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 853\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('506', '34', '_thumbnail_id', '80');
INSERT INTO `wp_postmeta` VALUES ('507', '81', '_wp_attached_file', '2026/07/achadinho-57.jpg');
INSERT INTO `wp_postmeta` VALUES ('508', '81', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/07/achadinho-57.jpg\";s:8:\"filesize\";i:37352;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 928\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 928\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('509', '57', '_thumbnail_id', '81');
INSERT INTO `wp_postmeta` VALUES ('510', '82', '_wp_attached_file', '2026/07/achadinho-11.jpg');
INSERT INTO `wp_postmeta` VALUES ('511', '82', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/07/achadinho-11.jpg\";s:8:\"filesize\";i:38626;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 135\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 135\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('512', '11', '_thumbnail_id', '82');
INSERT INTO `wp_postmeta` VALUES ('513', '83', '_wp_attached_file', '2026/07/achadinho-35.jpg');
INSERT INTO `wp_postmeta` VALUES ('514', '83', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/07/achadinho-35.jpg\";s:8:\"filesize\";i:54496;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 556\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 556\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('515', '35', '_thumbnail_id', '83');
INSERT INTO `wp_postmeta` VALUES ('516', '84', '_wp_attached_file', '2026/07/achadinho-58.jpg');
INSERT INTO `wp_postmeta` VALUES ('517', '84', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/07/achadinho-58.jpg\";s:8:\"filesize\";i:56881;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 430\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 430\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('518', '58', '_thumbnail_id', '84');
INSERT INTO `wp_postmeta` VALUES ('519', '85', '_wp_attached_file', '2026/06/achadinho-12.jpg');
INSERT INTO `wp_postmeta` VALUES ('520', '85', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-12.jpg\";s:8:\"filesize\";i:86865;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 800\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 800\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('521', '12', '_thumbnail_id', '85');
INSERT INTO `wp_postmeta` VALUES ('522', '86', '_wp_attached_file', '2026/06/achadinho-36.jpg');
INSERT INTO `wp_postmeta` VALUES ('523', '86', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-36.jpg\";s:8:\"filesize\";i:44204;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 631\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 631\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('524', '36', '_thumbnail_id', '86');
INSERT INTO `wp_postmeta` VALUES ('525', '87', '_wp_attached_file', '2026/06/achadinho-59.jpg');
INSERT INTO `wp_postmeta` VALUES ('526', '87', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-59.jpg\";s:8:\"filesize\";i:29940;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 313\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 313\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('527', '59', '_thumbnail_id', '87');
INSERT INTO `wp_postmeta` VALUES ('528', '88', '_wp_attached_file', '2026/06/achadinho-13.jpg');
INSERT INTO `wp_postmeta` VALUES ('529', '88', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-13.jpg\";s:8:\"filesize\";i:43341;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 213\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 213\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('530', '13', '_thumbnail_id', '88');
INSERT INTO `wp_postmeta` VALUES ('531', '89', '_wp_attached_file', '2026/06/achadinho-37.jpg');
INSERT INTO `wp_postmeta` VALUES ('532', '89', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-37.jpg\";s:8:\"filesize\";i:119559;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 164\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 164\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('533', '37', '_thumbnail_id', '89');
INSERT INTO `wp_postmeta` VALUES ('534', '90', '_wp_attached_file', '2026/06/achadinho-60.jpg');
INSERT INTO `wp_postmeta` VALUES ('535', '90', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-60.jpg\";s:8:\"filesize\";i:75871;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 534\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 534\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('536', '60', '_thumbnail_id', '90');
INSERT INTO `wp_postmeta` VALUES ('537', '91', '_wp_attached_file', '2026/06/achadinho-14.jpg');
INSERT INTO `wp_postmeta` VALUES ('538', '91', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-14.jpg\";s:8:\"filesize\";i:67851;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 623\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 623\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('539', '14', '_thumbnail_id', '91');
INSERT INTO `wp_postmeta` VALUES ('540', '92', '_wp_attached_file', '2026/06/achadinho-38.jpg');
INSERT INTO `wp_postmeta` VALUES ('541', '92', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-38.jpg\";s:8:\"filesize\";i:98007;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:15:\"Picsum ID: 1050\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:15:\"Picsum ID: 1050\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('542', '38', '_thumbnail_id', '92');
INSERT INTO `wp_postmeta` VALUES ('543', '93', '_wp_attached_file', '2026/06/achadinho-61.jpg');
INSERT INTO `wp_postmeta` VALUES ('544', '93', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-61.jpg\";s:8:\"filesize\";i:42499;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 377\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 377\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('545', '61', '_thumbnail_id', '93');
INSERT INTO `wp_postmeta` VALUES ('546', '94', '_wp_attached_file', '2026/06/achadinho-15.jpg');
INSERT INTO `wp_postmeta` VALUES ('547', '94', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-15.jpg\";s:8:\"filesize\";i:87740;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 485\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 485\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('548', '15', '_thumbnail_id', '94');
INSERT INTO `wp_postmeta` VALUES ('549', '95', '_wp_attached_file', '2026/06/achadinho-39.jpg');
INSERT INTO `wp_postmeta` VALUES ('550', '95', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-39.jpg\";s:8:\"filesize\";i:34304;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 856\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 856\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('551', '39', '_thumbnail_id', '95');
INSERT INTO `wp_postmeta` VALUES ('552', '96', '_wp_attached_file', '2026/06/achadinho-62.jpg');
INSERT INTO `wp_postmeta` VALUES ('553', '96', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-62.jpg\";s:8:\"filesize\";i:28447;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:15:\"Picsum ID: 1014\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:15:\"Picsum ID: 1014\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('554', '62', '_thumbnail_id', '96');
INSERT INTO `wp_postmeta` VALUES ('555', '97', '_wp_attached_file', '2026/06/achadinho-16.jpg');
INSERT INTO `wp_postmeta` VALUES ('556', '97', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-16.jpg\";s:8:\"filesize\";i:108975;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 147\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 147\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('557', '16', '_thumbnail_id', '97');
INSERT INTO `wp_postmeta` VALUES ('558', '98', '_wp_attached_file', '2026/06/achadinho-40.jpg');
INSERT INTO `wp_postmeta` VALUES ('559', '98', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-40.jpg\";s:8:\"filesize\";i:12127;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 497\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 497\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('560', '40', '_thumbnail_id', '98');
INSERT INTO `wp_postmeta` VALUES ('561', '99', '_wp_attached_file', '2026/06/achadinho-63.jpg');
INSERT INTO `wp_postmeta` VALUES ('562', '99', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-63.jpg\";s:8:\"filesize\";i:47176;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 389\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 389\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('563', '63', '_thumbnail_id', '99');
INSERT INTO `wp_postmeta` VALUES ('564', '100', '_wp_attached_file', '2026/06/achadinho-17.jpg');
INSERT INTO `wp_postmeta` VALUES ('565', '100', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-17.jpg\";s:8:\"filesize\";i:87333;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:13:\"Picsum ID: 16\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:13:\"Picsum ID: 16\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('566', '17', '_thumbnail_id', '100');
INSERT INTO `wp_postmeta` VALUES ('567', '101', '_wp_attached_file', '2026/06/achadinho-41.jpg');
INSERT INTO `wp_postmeta` VALUES ('568', '101', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-41.jpg\";s:8:\"filesize\";i:99936;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 791\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 791\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('569', '41', '_thumbnail_id', '101');
INSERT INTO `wp_postmeta` VALUES ('570', '102', '_wp_attached_file', '2026/06/achadinho-64.jpg');
INSERT INTO `wp_postmeta` VALUES ('571', '102', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-64.jpg\";s:8:\"filesize\";i:77872;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:13:\"Picsum ID: 94\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:13:\"Picsum ID: 94\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('572', '64', '_thumbnail_id', '102');
INSERT INTO `wp_postmeta` VALUES ('573', '103', '_wp_attached_file', '2026/06/achadinho-18.jpg');
INSERT INTO `wp_postmeta` VALUES ('574', '103', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-18.jpg\";s:8:\"filesize\";i:71956;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 528\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 528\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('575', '18', '_thumbnail_id', '103');
INSERT INTO `wp_postmeta` VALUES ('576', '104', '_wp_attached_file', '2026/06/achadinho-42.jpg');
INSERT INTO `wp_postmeta` VALUES ('577', '104', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-42.jpg\";s:8:\"filesize\";i:84249;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 420\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 420\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('578', '42', '_thumbnail_id', '104');
INSERT INTO `wp_postmeta` VALUES ('579', '105', '_wp_attached_file', '2026/06/achadinho-65.jpg');
INSERT INTO `wp_postmeta` VALUES ('580', '105', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-65.jpg\";s:8:\"filesize\";i:85389;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 786\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 786\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('581', '65', '_thumbnail_id', '105');
INSERT INTO `wp_postmeta` VALUES ('582', '106', '_wp_attached_file', '2026/06/achadinho-19.jpg');
INSERT INTO `wp_postmeta` VALUES ('583', '106', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-19.jpg\";s:8:\"filesize\";i:12127;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 497\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 497\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('584', '19', '_thumbnail_id', '106');
INSERT INTO `wp_postmeta` VALUES ('585', '107', '_wp_attached_file', '2026/06/achadinho-43.jpg');
INSERT INTO `wp_postmeta` VALUES ('586', '107', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-43.jpg\";s:8:\"filesize\";i:52386;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 876\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 876\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('587', '43', '_thumbnail_id', '107');
INSERT INTO `wp_postmeta` VALUES ('588', '108', '_wp_attached_file', '2026/06/achadinho-66.jpg');
INSERT INTO `wp_postmeta` VALUES ('589', '108', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-66.jpg\";s:8:\"filesize\";i:96611;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 212\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 212\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('590', '66', '_thumbnail_id', '108');
INSERT INTO `wp_postmeta` VALUES ('591', '109', '_wp_attached_file', '2026/06/achadinho-20.jpg');
INSERT INTO `wp_postmeta` VALUES ('592', '109', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-20.jpg\";s:8:\"filesize\";i:107492;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 717\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 717\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('593', '20', '_thumbnail_id', '109');
INSERT INTO `wp_postmeta` VALUES ('594', '110', '_wp_attached_file', '2026/06/achadinho-44.jpg');
INSERT INTO `wp_postmeta` VALUES ('595', '110', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-44.jpg\";s:8:\"filesize\";i:57871;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:15:\"Picsum ID: 1028\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:15:\"Picsum ID: 1028\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('596', '44', '_thumbnail_id', '110');
INSERT INTO `wp_postmeta` VALUES ('597', '111', '_wp_attached_file', '2026/06/achadinho-67.jpg');
INSERT INTO `wp_postmeta` VALUES ('598', '111', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-67.jpg\";s:8:\"filesize\";i:164019;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:13:\"Picsum ID: 17\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:13:\"Picsum ID: 17\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('599', '67', '_thumbnail_id', '111');
INSERT INTO `wp_postmeta` VALUES ('600', '112', '_wp_attached_file', '2026/06/achadinho-21.jpg');
INSERT INTO `wp_postmeta` VALUES ('601', '112', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-21.jpg\";s:8:\"filesize\";i:34356;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 809\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 809\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('602', '21', '_thumbnail_id', '112');
INSERT INTO `wp_postmeta` VALUES ('603', '113', '_wp_attached_file', '2026/06/achadinho-45.jpg');
INSERT INTO `wp_postmeta` VALUES ('604', '113', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-45.jpg\";s:8:\"filesize\";i:43763;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:15:\"Picsum ID: 1049\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:15:\"Picsum ID: 1049\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('605', '45', '_thumbnail_id', '113');
INSERT INTO `wp_postmeta` VALUES ('606', '114', '_wp_attached_file', '2026/06/achadinho-68.jpg');
INSERT INTO `wp_postmeta` VALUES ('607', '114', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-68.jpg\";s:8:\"filesize\";i:103912;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 482\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 482\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('608', '68', '_thumbnail_id', '114');
INSERT INTO `wp_postmeta` VALUES ('609', '115', '_wp_attached_file', '2026/06/achadinho-22.jpg');
INSERT INTO `wp_postmeta` VALUES ('610', '115', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-22.jpg\";s:8:\"filesize\";i:74229;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 508\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 508\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('611', '22', '_thumbnail_id', '115');
INSERT INTO `wp_postmeta` VALUES ('612', '116', '_wp_attached_file', '2026/06/achadinho-46.jpg');
INSERT INTO `wp_postmeta` VALUES ('613', '116', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-46.jpg\";s:8:\"filesize\";i:19321;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 209\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 209\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('614', '46', '_thumbnail_id', '116');
INSERT INTO `wp_postmeta` VALUES ('615', '117', '_wp_attached_file', '2026/06/achadinho-69.jpg');
INSERT INTO `wp_postmeta` VALUES ('616', '117', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-69.jpg\";s:8:\"filesize\";i:48162;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 415\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 415\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('617', '69', '_thumbnail_id', '117');
INSERT INTO `wp_postmeta` VALUES ('618', '118', '_wp_attached_file', '2026/06/achadinho-23.jpg');
INSERT INTO `wp_postmeta` VALUES ('619', '118', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-23.jpg\";s:8:\"filesize\";i:19557;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 383\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 383\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('620', '23', '_thumbnail_id', '118');
INSERT INTO `wp_postmeta` VALUES ('621', '119', '_wp_attached_file', '2026/06/achadinho-47.jpg');
INSERT INTO `wp_postmeta` VALUES ('622', '119', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-47.jpg\";s:8:\"filesize\";i:138233;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 136\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 136\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('623', '47', '_thumbnail_id', '119');
INSERT INTO `wp_postmeta` VALUES ('624', '120', '_wp_attached_file', '2026/06/achadinho-70.jpg');
INSERT INTO `wp_postmeta` VALUES ('625', '120', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-70.jpg\";s:8:\"filesize\";i:65288;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 317\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 317\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('626', '70', '_thumbnail_id', '120');
INSERT INTO `wp_postmeta` VALUES ('627', '121', '_wp_attached_file', '2026/06/achadinho-24.jpg');
INSERT INTO `wp_postmeta` VALUES ('628', '121', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-24.jpg\";s:8:\"filesize\";i:52386;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 876\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 876\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('629', '24', '_thumbnail_id', '121');
INSERT INTO `wp_postmeta` VALUES ('630', '122', '_wp_attached_file', '2026/06/achadinho-48.jpg');
INSERT INTO `wp_postmeta` VALUES ('631', '122', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-48.jpg\";s:8:\"filesize\";i:59686;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 546\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 546\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('632', '48', '_thumbnail_id', '122');
INSERT INTO `wp_postmeta` VALUES ('633', '123', '_wp_attached_file', '2026/06/achadinho-71.jpg');
INSERT INTO `wp_postmeta` VALUES ('634', '123', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-71.jpg\";s:8:\"filesize\";i:121540;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 520\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 520\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('635', '71', '_thumbnail_id', '123');
INSERT INTO `wp_postmeta` VALUES ('636', '124', '_wp_attached_file', '2026/06/achadinho-25.jpg');
INSERT INTO `wp_postmeta` VALUES ('637', '124', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-25.jpg\";s:8:\"filesize\";i:46450;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 473\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 473\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('638', '25', '_thumbnail_id', '124');
INSERT INTO `wp_postmeta` VALUES ('639', '125', '_wp_attached_file', '2026/06/achadinho-49.jpg');
INSERT INTO `wp_postmeta` VALUES ('640', '125', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-49.jpg\";s:8:\"filesize\";i:96611;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 212\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 212\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('641', '49', '_thumbnail_id', '125');
INSERT INTO `wp_postmeta` VALUES ('642', '126', '_wp_attached_file', '2026/06/achadinho-72.jpg');
INSERT INTO `wp_postmeta` VALUES ('643', '126', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-72.jpg\";s:8:\"filesize\";i:45654;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 459\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 459\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('644', '72', '_thumbnail_id', '126');
INSERT INTO `wp_postmeta` VALUES ('645', '127', '_wp_attached_file', '2026/06/achadinho-26.jpg');
INSERT INTO `wp_postmeta` VALUES ('646', '127', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-26.jpg\";s:8:\"filesize\";i:19268;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 682\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 682\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('647', '26', '_thumbnail_id', '127');
INSERT INTO `wp_postmeta` VALUES ('648', '128', '_wp_attached_file', '2026/06/achadinho-50.jpg');
INSERT INTO `wp_postmeta` VALUES ('649', '128', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-50.jpg\";s:8:\"filesize\";i:74744;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:13:\"Picsum ID: 26\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:13:\"Picsum ID: 26\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('650', '50', '_thumbnail_id', '128');
INSERT INTO `wp_postmeta` VALUES ('651', '129', '_wp_attached_file', '2026/06/achadinho-73.jpg');
INSERT INTO `wp_postmeta` VALUES ('652', '129', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-73.jpg\";s:8:\"filesize\";i:76379;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:15:\"Picsum ID: 1068\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:15:\"Picsum ID: 1068\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('653', '73', '_thumbnail_id', '129');
INSERT INTO `wp_postmeta` VALUES ('654', '130', '_wp_attached_file', '2026/06/achadinho-27.jpg');
INSERT INTO `wp_postmeta` VALUES ('655', '130', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-27.jpg\";s:8:\"filesize\";i:19479;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 926\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 926\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('656', '27', '_thumbnail_id', '130');
INSERT INTO `wp_postmeta` VALUES ('657', '131', '_wp_attached_file', '2026/06/achadinho-51.jpg');
INSERT INTO `wp_postmeta` VALUES ('658', '131', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-51.jpg\";s:8:\"filesize\";i:60712;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 159\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 159\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('659', '51', '_thumbnail_id', '131');
INSERT INTO `wp_postmeta` VALUES ('660', '132', '_wp_attached_file', '2026/06/achadinho-74.jpg');
INSERT INTO `wp_postmeta` VALUES ('661', '132', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-74.jpg\";s:8:\"filesize\";i:104535;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 570\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 570\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('662', '74', '_thumbnail_id', '132');
INSERT INTO `wp_postmeta` VALUES ('663', '133', '_wp_attached_file', '2026/06/achadinho-28.jpg');
INSERT INTO `wp_postmeta` VALUES ('664', '133', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-28.jpg\";s:8:\"filesize\";i:170269;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 518\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 518\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('665', '28', '_thumbnail_id', '133');
INSERT INTO `wp_postmeta` VALUES ('666', '134', '_wp_attached_file', '2026/06/achadinho-52.jpg');
INSERT INTO `wp_postmeta` VALUES ('667', '134', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-52.jpg\";s:8:\"filesize\";i:110843;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 103\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 103\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('668', '52', '_thumbnail_id', '134');
INSERT INTO `wp_postmeta` VALUES ('669', '135', '_wp_attached_file', '2026/06/achadinho-75.jpg');
INSERT INTO `wp_postmeta` VALUES ('670', '135', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:24:\"2026/06/achadinho-75.jpg\";s:8:\"filesize\";i:120599;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 115\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 115\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('671', '75', '_thumbnail_id', '135');
INSERT INTO `wp_postmeta` VALUES ('672', '136', '_achadinho_preco', 'R$ 29,90');
INSERT INTO `wp_postmeta` VALUES ('673', '136', '_achadinho_preco_original', 'R$ 59,90');
INSERT INTO `wp_postmeta` VALUES ('674', '136', '_achadinho_desconto', '50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('675', '136', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=mini+aspirador+usb');
INSERT INTO `wp_postmeta` VALUES ('676', '136', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('677', '136', '_achadinho_num_avaliacoes', '2340');
INSERT INTO `wp_postmeta` VALUES ('678', '136', '_achadinho_especificacoes', 'Alimentação USB 5V\nAcompanha escova e borracha\nTamanho compacto 15cm\nPortátil e leve');
INSERT INTO `wp_postmeta` VALUES ('679', '136', '_achadinho_tags', 'aspirador, limpeza, teclado, usb, portátil');
INSERT INTO `wp_postmeta` VALUES ('680', '136', '_achadinho_destaque', '1');
INSERT INTO `wp_postmeta` VALUES ('681', '137', '_wp_attached_file', '2026/07/achadinho-136.jpg');
INSERT INTO `wp_postmeta` VALUES ('682', '137', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/07/achadinho-136.jpg\";s:8:\"filesize\";i:52558;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 638\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 638\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('683', '136', '_thumbnail_id', '137');
INSERT INTO `wp_postmeta` VALUES ('684', '138', '_achadinho_preco', 'R$ 19,90');
INSERT INTO `wp_postmeta` VALUES ('685', '138', '_achadinho_preco_original', 'R$ 49,90');
INSERT INTO `wp_postmeta` VALUES ('686', '138', '_achadinho_desconto', '60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('687', '138', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=cabo+magnetico+3+em+1');
INSERT INTO `wp_postmeta` VALUES ('688', '138', '_achadinho_avaliacao', '4.6');
INSERT INTO `wp_postmeta` VALUES ('689', '138', '_achadinho_num_avaliacoes', '5670');
INSERT INTO `wp_postmeta` VALUES ('690', '138', '_achadinho_especificacoes', '3 pontas: USB-C, Micro, Lightning\nCarregamento rápido 3A\nConexão magnética\nComprimento 1.2m');
INSERT INTO `wp_postmeta` VALUES ('691', '138', '_achadinho_tags', 'cabo, magnético, carregador, 3 em 1, USB');
INSERT INTO `wp_postmeta` VALUES ('692', '139', '_wp_attached_file', '2026/07/achadinho-138.jpg');
INSERT INTO `wp_postmeta` VALUES ('693', '139', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/07/achadinho-138.jpg\";s:8:\"filesize\";i:39064;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 137\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 137\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('694', '138', '_thumbnail_id', '139');
INSERT INTO `wp_postmeta` VALUES ('695', '140', '_achadinho_preco', 'R$ 24,90');
INSERT INTO `wp_postmeta` VALUES ('696', '140', '_achadinho_preco_original', 'R$ 54,90');
INSERT INTO `wp_postmeta` VALUES ('697', '140', '_achadinho_desconto', '54{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('698', '140', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=mini+ventilador+usb');
INSERT INTO `wp_postmeta` VALUES ('699', '140', '_achadinho_avaliacao', '4.3');
INSERT INTO `wp_postmeta` VALUES ('700', '140', '_achadinho_num_avaliacoes', '1890');
INSERT INTO `wp_postmeta` VALUES ('701', '140', '_achadinho_especificacoes', 'Porta USB alimentação\nSilencioso < 30dB\nBase articulada\nHélice flexível');
INSERT INTO `wp_postmeta` VALUES ('702', '140', '_achadinho_tags', 'ventilador, usb, silencioso, portátil, escritório');
INSERT INTO `wp_postmeta` VALUES ('703', '141', '_wp_attached_file', '2026/07/achadinho-140.jpg');
INSERT INTO `wp_postmeta` VALUES ('704', '141', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/07/achadinho-140.jpg\";s:8:\"filesize\";i:81011;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 320\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 320\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('705', '140', '_thumbnail_id', '141');
INSERT INTO `wp_postmeta` VALUES ('706', '142', '_achadinho_preco', 'R$ 34,90');
INSERT INTO `wp_postmeta` VALUES ('707', '142', '_achadinho_preco_original', 'R$ 79,90');
INSERT INTO `wp_postmeta` VALUES ('708', '142', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('709', '142', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=lampada+inteligente+wi+fi');
INSERT INTO `wp_postmeta` VALUES ('710', '142', '_achadinho_avaliacao', '4.4');
INSERT INTO `wp_postmeta` VALUES ('711', '142', '_achadinho_num_avaliacoes', '3210');
INSERT INTO `wp_postmeta` VALUES ('712', '142', '_achadinho_especificacoes', 'Wi-Fi 2.4GHz\nCompatível Alexa/Google\n16 milhões de cores\nBocal E27');
INSERT INTO `wp_postmeta` VALUES ('713', '142', '_achadinho_tags', 'lâmpada, inteligente, wi-fi, alexa, smart');
INSERT INTO `wp_postmeta` VALUES ('714', '143', '_wp_attached_file', '2026/06/achadinho-142.jpg');
INSERT INTO `wp_postmeta` VALUES ('715', '143', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-142.jpg\";s:8:\"filesize\";i:75405;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 694\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 694\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('716', '142', '_thumbnail_id', '143');
INSERT INTO `wp_postmeta` VALUES ('717', '144', '_achadinho_preco', 'R$ 18,90');
INSERT INTO `wp_postmeta` VALUES ('718', '144', '_achadinho_preco_original', 'R$ 44,90');
INSERT INTO `wp_postmeta` VALUES ('719', '144', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('720', '144', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=fita+led+rgb+setup');
INSERT INTO `wp_postmeta` VALUES ('721', '144', '_achadinho_avaliacao', '4.7');
INSERT INTO `wp_postmeta` VALUES ('722', '144', '_achadinho_num_avaliacoes', '8900');
INSERT INTO `wp_postmeta` VALUES ('723', '144', '_achadinho_especificacoes', 'Comprimento 2m/5m\nControle remoto incluso\nRGB 16 cores\nAutoadesiva');
INSERT INTO `wp_postmeta` VALUES ('724', '144', '_achadinho_tags', 'fita, led, rgb, setup, gamer');
INSERT INTO `wp_postmeta` VALUES ('725', '145', '_wp_attached_file', '2026/06/achadinho-144.jpg');
INSERT INTO `wp_postmeta` VALUES ('726', '145', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-144.jpg\";s:8:\"filesize\";i:69169;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 646\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 646\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('727', '144', '_thumbnail_id', '145');
INSERT INTO `wp_postmeta` VALUES ('728', '146', '_achadinho_preco', 'R$ 22,90');
INSERT INTO `wp_postmeta` VALUES ('729', '146', '_achadinho_preco_original', 'R$ 54,90');
INSERT INTO `wp_postmeta` VALUES ('730', '146', '_achadinho_desconto', '58{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('731', '146', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=tripe+flexivel+celular');
INSERT INTO `wp_postmeta` VALUES ('732', '146', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('733', '146', '_achadinho_num_avaliacoes', '4560');
INSERT INTO `wp_postmeta` VALUES ('734', '146', '_achadinho_especificacoes', 'Pernas flexíveis articuláveis\nSuporte universal para celular\nBase antiderrapante\nPeso leve 200g');
INSERT INTO `wp_postmeta` VALUES ('735', '146', '_achadinho_tags', 'tripé, flexível, celular, vlog, foto');
INSERT INTO `wp_postmeta` VALUES ('736', '147', '_wp_attached_file', '2026/06/achadinho-146.jpg');
INSERT INTO `wp_postmeta` VALUES ('737', '147', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-146.jpg\";s:8:\"filesize\";i:56881;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 430\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 430\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('738', '146', '_thumbnail_id', '147');
INSERT INTO `wp_postmeta` VALUES ('739', '148', '_achadinho_preco', 'R$ 15,90');
INSERT INTO `wp_postmeta` VALUES ('740', '148', '_achadinho_preco_original', 'R$ 39,90');
INSERT INTO `wp_postmeta` VALUES ('741', '148', '_achadinho_desconto', '60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('742', '148', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=microfone+lapela');
INSERT INTO `wp_postmeta` VALUES ('743', '148', '_achadinho_avaliacao', '4.2');
INSERT INTO `wp_postmeta` VALUES ('744', '148', '_achadinho_num_avaliacoes', '2100');
INSERT INTO `wp_postmeta` VALUES ('745', '148', '_achadinho_especificacoes', 'Plug P2 3.5mm\nCabo 2m\nClipe de lapela\nEspuma antivento');
INSERT INTO `wp_postmeta` VALUES ('746', '148', '_achadinho_tags', 'microfone, lapela, áudio, gravacao, vlog');
INSERT INTO `wp_postmeta` VALUES ('747', '149', '_wp_attached_file', '2026/06/achadinho-148.jpg');
INSERT INTO `wp_postmeta` VALUES ('748', '149', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-148.jpg\";s:8:\"filesize\";i:22603;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 954\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 954\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('749', '148', '_thumbnail_id', '149');
INSERT INTO `wp_postmeta` VALUES ('750', '150', '_achadinho_preco', 'R$ 12,90');
INSERT INTO `wp_postmeta` VALUES ('751', '150', '_achadinho_preco_original', 'R$ 34,90');
INSERT INTO `wp_postmeta` VALUES ('752', '150', '_achadinho_desconto', '63{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('753', '150', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=lente+macro+celular');
INSERT INTO `wp_postmeta` VALUES ('754', '150', '_achadinho_avaliacao', '4.1');
INSERT INTO `wp_postmeta` VALUES ('755', '150', '_achadinho_num_avaliacoes', '1230');
INSERT INTO `wp_postmeta` VALUES ('756', '150', '_achadinho_especificacoes', 'Aumento 15x\nClip universal\nLente de vidro\n Estojo de transporte');
INSERT INTO `wp_postmeta` VALUES ('757', '150', '_achadinho_tags', 'lente, macro, celular, fotografia, acessório');
INSERT INTO `wp_postmeta` VALUES ('758', '151', '_wp_attached_file', '2026/06/achadinho-150.jpg');
INSERT INTO `wp_postmeta` VALUES ('759', '151', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-150.jpg\";s:8:\"filesize\";i:53083;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 652\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 652\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('760', '150', '_thumbnail_id', '151');
INSERT INTO `wp_postmeta` VALUES ('761', '152', '_achadinho_preco', 'R$ 26,90');
INSERT INTO `wp_postmeta` VALUES ('762', '152', '_achadinho_preco_original', 'R$ 59,90');
INSERT INTO `wp_postmeta` VALUES ('763', '152', '_achadinho_desconto', '55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('764', '152', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/suporte-articulado-celular');
INSERT INTO `wp_postmeta` VALUES ('765', '152', '_achadinho_avaliacao', '4.6');
INSERT INTO `wp_postmeta` VALUES ('766', '152', '_achadinho_num_avaliacoes', '6780');
INSERT INTO `wp_postmeta` VALUES ('767', '152', '_achadinho_especificacoes', 'Braço articulado 80cm\nBase de mesa com grampo\nGarra universal\nRotação 360°');
INSERT INTO `wp_postmeta` VALUES ('768', '152', '_achadinho_tags', 'suporte, celular, articulado, mesa, mãos livres');
INSERT INTO `wp_postmeta` VALUES ('769', '153', '_wp_attached_file', '2026/06/achadinho-152.jpg');
INSERT INTO `wp_postmeta` VALUES ('770', '153', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-152.jpg\";s:8:\"filesize\";i:108910;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 162\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 162\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('771', '152', '_thumbnail_id', '153');
INSERT INTO `wp_postmeta` VALUES ('772', '154', '_achadinho_preco', 'R$ 49,90');
INSERT INTO `wp_postmeta` VALUES ('773', '154', '_achadinho_preco_original', 'R$ 99,90');
INSERT INTO `wp_postmeta` VALUES ('774', '154', '_achadinho_desconto', '50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('775', '154', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=powerbank+slim+10000');
INSERT INTO `wp_postmeta` VALUES ('776', '154', '_achadinho_avaliacao', '4.4');
INSERT INTO `wp_postmeta` VALUES ('777', '154', '_achadinho_num_avaliacoes', '8900');
INSERT INTO `wp_postmeta` VALUES ('778', '154', '_achadinho_especificacoes', '10000mAh\nSaída 2.1A rápida\nEntrada USB-C\n2 saídas USB');
INSERT INTO `wp_postmeta` VALUES ('779', '154', '_achadinho_tags', 'powerbank, bateria, portátil, carregador, slim');
INSERT INTO `wp_postmeta` VALUES ('780', '155', '_wp_attached_file', '2026/06/achadinho-154.jpg');
INSERT INTO `wp_postmeta` VALUES ('781', '155', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-154.jpg\";s:8:\"filesize\";i:36618;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 832\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 832\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('782', '154', '_thumbnail_id', '155');
INSERT INTO `wp_postmeta` VALUES ('783', '156', '_achadinho_preco', 'R$ 32,90');
INSERT INTO `wp_postmeta` VALUES ('784', '156', '_achadinho_preco_original', 'R$ 74,90');
INSERT INTO `wp_postmeta` VALUES ('785', '156', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('786', '156', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/kit-chaves-precisao');
INSERT INTO `wp_postmeta` VALUES ('787', '156', '_achadinho_avaliacao', '4.8');
INSERT INTO `wp_postmeta` VALUES ('788', '156', '_achadinho_num_avaliacoes', '12300');
INSERT INTO `wp_postmeta` VALUES ('789', '156', '_achadinho_especificacoes', '24 peças\nPontas magnéticas\nEstojo organizador\nAço inoxidável');
INSERT INTO `wp_postmeta` VALUES ('790', '156', '_achadinho_tags', 'chaves, precisão, kit, manutenção, eletrônicos');
INSERT INTO `wp_postmeta` VALUES ('791', '157', '_wp_attached_file', '2026/06/achadinho-156.jpg');
INSERT INTO `wp_postmeta` VALUES ('792', '157', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-156.jpg\";s:8:\"filesize\";i:89316;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 868\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 868\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('793', '156', '_thumbnail_id', '157');
INSERT INTO `wp_postmeta` VALUES ('794', '158', '_achadinho_preco', 'R$ 38,90');
INSERT INTO `wp_postmeta` VALUES ('795', '158', '_achadinho_preco_original', 'R$ 89,90');
INSERT INTO `wp_postmeta` VALUES ('796', '158', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('797', '158', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=multimetro+digital');
INSERT INTO `wp_postmeta` VALUES ('798', '158', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('799', '158', '_achadinho_num_avaliacoes', '5670');
INSERT INTO `wp_postmeta` VALUES ('800', '158', '_achadinho_especificacoes', 'Tela LCD digital\nMede AC/DC\nTeste de continuidade\nCabo de prova incluso');
INSERT INTO `wp_postmeta` VALUES ('801', '158', '_achadinho_tags', 'multímetro, digital, voltagem, eletrônica, teste');
INSERT INTO `wp_postmeta` VALUES ('802', '159', '_wp_attached_file', '2026/06/achadinho-158.jpg');
INSERT INTO `wp_postmeta` VALUES ('803', '159', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-158.jpg\";s:8:\"filesize\";i:29650;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:13:\"Picsum ID: 48\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:13:\"Picsum ID: 48\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('804', '158', '_thumbnail_id', '159');
INSERT INTO `wp_postmeta` VALUES ('805', '160', '_achadinho_preco', 'R$ 9,90');
INSERT INTO `wp_postmeta` VALUES ('806', '160', '_achadinho_preco_original', 'R$ 24,90');
INSERT INTO `wp_postmeta` VALUES ('807', '160', '_achadinho_desconto', '60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('808', '160', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/pasta-termica-processador');
INSERT INTO `wp_postmeta` VALUES ('809', '160', '_achadinho_avaliacao', '4.3');
INSERT INTO `wp_postmeta` VALUES ('810', '160', '_achadinho_num_avaliacoes', '8900');
INSERT INTO `wp_postmeta` VALUES ('811', '160', '_achadinho_especificacoes', 'Condutividade 4.5 W/mK\nSeringa 3g\nNão condutiva\nAlta performance');
INSERT INTO `wp_postmeta` VALUES ('812', '160', '_achadinho_tags', 'pasta, térmica, processador, cooler, pc');
INSERT INTO `wp_postmeta` VALUES ('813', '161', '_wp_attached_file', '2026/06/achadinho-160.jpg');
INSERT INTO `wp_postmeta` VALUES ('814', '161', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-160.jpg\";s:8:\"filesize\";i:139665;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:13:\"Picsum ID: 25\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:13:\"Picsum ID: 25\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('815', '160', '_thumbnail_id', '161');
INSERT INTO `wp_postmeta` VALUES ('816', '162', '_achadinho_preco', 'R$ 14,90');
INSERT INTO `wp_postmeta` VALUES ('817', '162', '_achadinho_preco_original', 'R$ 34,90');
INSERT INTO `wp_postmeta` VALUES ('818', '162', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('819', '162', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=tapete+magnetico+parafusos');
INSERT INTO `wp_postmeta` VALUES ('820', '162', '_achadinho_avaliacao', '4.6');
INSERT INTO `wp_postmeta` VALUES ('821', '162', '_achadinho_num_avaliacoes', '3400');
INSERT INTO `wp_postmeta` VALUES ('822', '162', '_achadinho_especificacoes', 'Base magnética\nBorda elevada\nTamanho 30x20cm\nAntiderrapante');
INSERT INTO `wp_postmeta` VALUES ('823', '162', '_achadinho_tags', 'ímã, parafusos, organizador, ferramentas, oficina');
INSERT INTO `wp_postmeta` VALUES ('824', '163', '_wp_attached_file', '2026/06/achadinho-162.jpg');
INSERT INTO `wp_postmeta` VALUES ('825', '163', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-162.jpg\";s:8:\"filesize\";i:62735;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:13:\"Picsum ID: 33\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:13:\"Picsum ID: 33\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('826', '162', '_thumbnail_id', '163');
INSERT INTO `wp_postmeta` VALUES ('827', '164', '_achadinho_preco', 'R$ 21,90');
INSERT INTO `wp_postmeta` VALUES ('828', '164', '_achadinho_preco_original', 'R$ 49,90');
INSERT INTO `wp_postmeta` VALUES ('829', '164', '_achadinho_desconto', '56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('830', '164', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/kit-limpeza-eletronicos');
INSERT INTO `wp_postmeta` VALUES ('831', '164', '_achadinho_avaliacao', '4.4');
INSERT INTO `wp_postmeta` VALUES ('832', '164', '_achadinho_num_avaliacoes', '2900');
INSERT INTO `wp_postmeta` VALUES ('833', '164', '_achadinho_especificacoes', 'Spray limpeza 100ml\nPincel antiestático\nFlanela microfibra\nHastes flexíveis');
INSERT INTO `wp_postmeta` VALUES ('834', '164', '_achadinho_tags', 'limpeza, kit, eletrônicos, teclado, câmera');
INSERT INTO `wp_postmeta` VALUES ('835', '165', '_wp_attached_file', '2026/06/achadinho-164.jpg');
INSERT INTO `wp_postmeta` VALUES ('836', '165', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-164.jpg\";s:8:\"filesize\";i:62735;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:13:\"Picsum ID: 33\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:13:\"Picsum ID: 33\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('837', '164', '_thumbnail_id', '165');
INSERT INTO `wp_postmeta` VALUES ('838', '166', '_achadinho_preco', 'R$ 89,90');
INSERT INTO `wp_postmeta` VALUES ('839', '166', '_achadinho_preco_original', 'R$ 199,90');
INSERT INTO `wp_postmeta` VALUES ('840', '166', '_achadinho_desconto', '55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('841', '166', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=mini+projetor+portatil');
INSERT INTO `wp_postmeta` VALUES ('842', '166', '_achadinho_avaliacao', '4.2');
INSERT INTO `wp_postmeta` VALUES ('843', '166', '_achadinho_num_avaliacoes', '4500');
INSERT INTO `wp_postmeta` VALUES ('844', '166', '_achadinho_especificacoes', 'Resolução nativa 480p\nSuporta Full HD\nConexão HDMI/USB/AV\nAlto-falante interno');
INSERT INTO `wp_postmeta` VALUES ('845', '166', '_achadinho_tags', 'projetor, portátil, mini, cinema, hdmi');
INSERT INTO `wp_postmeta` VALUES ('846', '167', '_wp_attached_file', '2026/06/achadinho-166.jpg');
INSERT INTO `wp_postmeta` VALUES ('847', '167', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-166.jpg\";s:8:\"filesize\";i:82728;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 758\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 758\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('848', '166', '_thumbnail_id', '167');
INSERT INTO `wp_postmeta` VALUES ('849', '168', '_achadinho_preco', 'R$ 18,90');
INSERT INTO `wp_postmeta` VALUES ('850', '168', '_achadinho_preco_original', 'R$ 44,90');
INSERT INTO `wp_postmeta` VALUES ('851', '168', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('852', '168', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/caneta-touch-tablet');
INSERT INTO `wp_postmeta` VALUES ('853', '168', '_achadinho_avaliacao', '4.1');
INSERT INTO `wp_postmeta` VALUES ('854', '168', '_achadinho_num_avaliacoes', '2300');
INSERT INTO `wp_postmeta` VALUES ('855', '168', '_achadinho_especificacoes', 'Ponta precisa 1.5mm\nPalm rejection\nBateria recarregável\nCompatível iOS/Android');
INSERT INTO `wp_postmeta` VALUES ('856', '168', '_achadinho_tags', 'caneta, touch, tablet, desenho, stylus');
INSERT INTO `wp_postmeta` VALUES ('857', '169', '_wp_attached_file', '2026/06/achadinho-168.jpg');
INSERT INTO `wp_postmeta` VALUES ('858', '169', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-168.jpg\";s:8:\"filesize\";i:45586;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:15:\"Picsum ID: 1075\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:15:\"Picsum ID: 1075\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('859', '168', '_thumbnail_id', '169');
INSERT INTO `wp_postmeta` VALUES ('860', '170', '_achadinho_preco', 'R$ 16,90');
INSERT INTO `wp_postmeta` VALUES ('861', '170', '_achadinho_preco_original', 'R$ 39,90');
INSERT INTO `wp_postmeta` VALUES ('862', '170', '_achadinho_desconto', '57{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('863', '170', '_achadinho_link_afiliado', 'https://shopee.com.br/search?keyword=sensor+presenca+usb');
INSERT INTO `wp_postmeta` VALUES ('864', '170', '_achadinho_avaliacao', '4.3');
INSERT INTO `wp_postmeta` VALUES ('865', '170', '_achadinho_num_avaliacoes', '1800');
INSERT INTO `wp_postmeta` VALUES ('866', '170', '_achadinho_especificacoes', 'Alimentação USB 5V\nAlcance 3m\nÂngulo 120°\nPlug and play');
INSERT INTO `wp_postmeta` VALUES ('867', '170', '_achadinho_tags', 'sensor, presença, usb, automação, led');
INSERT INTO `wp_postmeta` VALUES ('868', '171', '_wp_attached_file', '2026/06/achadinho-170.jpg');
INSERT INTO `wp_postmeta` VALUES ('869', '171', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-170.jpg\";s:8:\"filesize\";i:113463;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 553\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 553\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('870', '170', '_thumbnail_id', '171');
INSERT INTO `wp_postmeta` VALUES ('871', '172', '_achadinho_preco', 'R$ 42,90');
INSERT INTO `wp_postmeta` VALUES ('872', '172', '_achadinho_preco_original', 'R$ 89,90');
INSERT INTO `wp_postmeta` VALUES ('873', '172', '_achadinho_desconto', '52{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('874', '172', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/mini-teclado-wireless');
INSERT INTO `wp_postmeta` VALUES ('875', '172', '_achadinho_avaliacao', '4.5');
INSERT INTO `wp_postmeta` VALUES ('876', '172', '_achadinho_num_avaliacoes', '6700');
INSERT INTO `wp_postmeta` VALUES ('877', '172', '_achadinho_especificacoes', 'Conexão 2.4GHz USB\nTouchpad integrado\nAlcance 10m\nBateria recarregável');
INSERT INTO `wp_postmeta` VALUES ('878', '172', '_achadinho_tags', 'teclado, wireless, mini, tv box, controle');
INSERT INTO `wp_postmeta` VALUES ('879', '173', '_wp_attached_file', '2026/06/achadinho-172.jpg');
INSERT INTO `wp_postmeta` VALUES ('880', '173', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-172.jpg\";s:8:\"filesize\";i:28139;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:14:\"Picsum ID: 500\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:14:\"Picsum ID: 500\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('881', '172', '_thumbnail_id', '173');
INSERT INTO `wp_postmeta` VALUES ('882', '174', '_achadinho_preco', 'R$ 28,90');
INSERT INTO `wp_postmeta` VALUES ('883', '174', '_achadinho_preco_original', 'R$ 64,90');
INSERT INTO `wp_postmeta` VALUES ('884', '174', '_achadinho_desconto', '55{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} OFF');
INSERT INTO `wp_postmeta` VALUES ('885', '174', '_achadinho_link_afiliado', 'https://www.mercadolivre.com.br/luz-notificacao-rgb');
INSERT INTO `wp_postmeta` VALUES ('886', '174', '_achadinho_avaliacao', '4');
INSERT INTO `wp_postmeta` VALUES ('887', '174', '_achadinho_num_avaliacoes', '980');
INSERT INTO `wp_postmeta` VALUES ('888', '174', '_achadinho_especificacoes', 'Conexão Bluetooth\nApp para controle\nRGB personalizável\nAlimentação USB');
INSERT INTO `wp_postmeta` VALUES ('889', '174', '_achadinho_tags', 'luz, notificação, rgb, bluetooth, setup');
INSERT INTO `wp_postmeta` VALUES ('890', '175', '_wp_attached_file', '2026/06/achadinho-174.jpg');
INSERT INTO `wp_postmeta` VALUES ('891', '175', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:800;s:6:\"height\";i:800;s:4:\"file\";s:25:\"2026/06/achadinho-174.jpg\";s:8:\"filesize\";i:77872;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:13:\"Picsum ID: 94\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:13:\"Picsum ID: 94\";s:11:\"orientation\";s:1:\"1\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('892', '174', '_thumbnail_id', '175');
INSERT INTO `wp_postmeta` VALUES ('893', '53', '_wp_page_template', 'default');
INSERT INTO `wp_postmeta` VALUES ('894', '54', '_wp_page_template', 'default');
INSERT INTO `wp_postmeta` VALUES ('898', '177', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('899', '177', '_idmp_filename', '01_introducao_qualidade_software.md');
INSERT INTO `wp_postmeta` VALUES ('902', '178', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('903', '178', '_idmp_filename', '02_tendencias_qa_2025.md');
INSERT INTO `wp_postmeta` VALUES ('906', '179', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('907', '179', '_idmp_filename', '03_tipos_testes_software.md');
INSERT INTO `wp_postmeta` VALUES ('910', '180', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('911', '180', '_idmp_filename', '04_benchmark_frameworks.md');
INSERT INTO `wp_postmeta` VALUES ('914', '181', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('915', '181', '_idmp_filename', '05_inteligencia_artificial_qa.md');
INSERT INTO `wp_postmeta` VALUES ('918', '182', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('919', '182', '_idmp_filename', '06_conclusao.md');
INSERT INTO `wp_postmeta` VALUES ('922', '183', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('923', '183', '_idmp_filename', '07_automacao_testes.md');
INSERT INTO `wp_postmeta` VALUES ('926', '184', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('927', '184', '_idmp_filename', '08_testes_ageis.md');
INSERT INTO `wp_postmeta` VALUES ('930', '185', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('931', '185', '_idmp_filename', '09_testes_performance.md');
INSERT INTO `wp_postmeta` VALUES ('934', '186', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('935', '186', '_idmp_filename', '10_testes_seguranca.md');
INSERT INTO `wp_postmeta` VALUES ('938', '187', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('939', '187', '_idmp_filename', '11_devops_qa.md');
INSERT INTO `wp_postmeta` VALUES ('942', '188', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('943', '188', '_idmp_filename', '12_testes_mobile.md');
INSERT INTO `wp_postmeta` VALUES ('946', '189', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('947', '189', '_idmp_filename', '13_tdd.md');
INSERT INTO `wp_postmeta` VALUES ('950', '190', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('951', '190', '_idmp_filename', '14_bdd.md');
INSERT INTO `wp_postmeta` VALUES ('954', '191', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('955', '191', '_idmp_filename', '15_testes_api.md');
INSERT INTO `wp_postmeta` VALUES ('958', '192', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('959', '192', '_idmp_filename', '16_exploratory_testing.md');
INSERT INTO `wp_postmeta` VALUES ('962', '193', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('963', '193', '_idmp_filename', '17_testes_usabilidade.md');
INSERT INTO `wp_postmeta` VALUES ('966', '194', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('967', '194', '_idmp_filename', '18_testes_regressao.md');
INSERT INTO `wp_postmeta` VALUES ('970', '195', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('971', '195', '_idmp_filename', '19_agile_qa.md');
INSERT INTO `wp_postmeta` VALUES ('974', '196', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('975', '196', '_idmp_filename', '20_testes_banco_dados.md');
INSERT INTO `wp_postmeta` VALUES ('978', '197', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('979', '197', '_idmp_filename', '21_testes_integracao.md');
INSERT INTO `wp_postmeta` VALUES ('982', '198', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('983', '198', '_idmp_filename', '22_mutation_testing.md');
INSERT INTO `wp_postmeta` VALUES ('986', '199', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('987', '199', '_idmp_filename', '23_visual_testing.md');
INSERT INTO `wp_postmeta` VALUES ('990', '200', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('991', '200', '_idmp_filename', '24_selenium_webdriver.md');
INSERT INTO `wp_postmeta` VALUES ('994', '201', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('995', '201', '_idmp_filename', '25_api_rest.md');
INSERT INTO `wp_postmeta` VALUES ('998', '202', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('999', '202', '_idmp_filename', '26_cicd_qa.md');
INSERT INTO `wp_postmeta` VALUES ('1002', '203', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1003', '203', '_idmp_filename', '27_testes_load.md');
INSERT INTO `wp_postmeta` VALUES ('1006', '204', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1007', '204', '_idmp_filename', '28_kubernetes_qa.md');
INSERT INTO `wp_postmeta` VALUES ('1010', '205', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1011', '205', '_idmp_filename', '29_monitoramento_qualidade.md');
INSERT INTO `wp_postmeta` VALUES ('1014', '206', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1015', '206', '_idmp_filename', '30_gitops_qa.md');
INSERT INTO `wp_postmeta` VALUES ('1018', '207', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1019', '207', '_idmp_filename', '31_accessibility_testing.md');
INSERT INTO `wp_postmeta` VALUES ('1022', '208', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1023', '208', '_idmp_filename', '31_docker_qa.md');
INSERT INTO `wp_postmeta` VALUES ('1026', '209', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1027', '209', '_idmp_filename', '32_fakes_mocks.md');
INSERT INTO `wp_postmeta` VALUES ('1030', '210', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1031', '210', '_idmp_filename', '32_testes_acessibilidade.md');
INSERT INTO `wp_postmeta` VALUES ('1034', '211', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1035', '211', '_idmp_filename', '33_chaos_engineering.md');
INSERT INTO `wp_postmeta` VALUES ('1038', '212', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1039', '212', '_idmp_filename', '34_cucumber_gherkin.md');
INSERT INTO `wp_postmeta` VALUES ('1042', '213', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1043', '213', '_idmp_filename', '35_contract_testing.md');
INSERT INTO `wp_postmeta` VALUES ('1046', '214', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1047', '214', '_idmp_filename', '36_testcontainers.md');
INSERT INTO `wp_postmeta` VALUES ('1050', '215', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1051', '215', '_idmp_filename', '37_security_testing.md');
INSERT INTO `wp_postmeta` VALUES ('1054', '216', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1055', '216', '_idmp_filename', '38_e2e_testing.md');
INSERT INTO `wp_postmeta` VALUES ('1058', '217', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1059', '217', '_idmp_filename', '39_qa_metrics.md');
INSERT INTO `wp_postmeta` VALUES ('1062', '218', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1063', '218', '_idmp_filename', '40_continuous_testing.md');
INSERT INTO `wp_postmeta` VALUES ('1138', '231', '_wp_attached_file', '2026/07/featured-208.jpg');
INSERT INTO `wp_postmeta` VALUES ('1139', '231', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-208.jpg\";s:8:\"filesize\";i:120128;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-208-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13267;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-208-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:72934;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-208-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6442;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-208-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:50796;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1140', '208', '_thumbnail_id', '351');
INSERT INTO `wp_postmeta` VALUES ('1141', '232', '_wp_attached_file', '2026/07/featured-209.jpg');
INSERT INTO `wp_postmeta` VALUES ('1142', '232', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-209.jpg\";s:8:\"filesize\";i:139406;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-209-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12799;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-209-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:76249;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-209-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6631;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-209-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:53692;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1143', '209', '_thumbnail_id', '359');
INSERT INTO `wp_postmeta` VALUES ('1144', '233', '_wp_attached_file', '2026/07/featured-210.jpg');
INSERT INTO `wp_postmeta` VALUES ('1145', '233', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-210.jpg\";s:8:\"filesize\";i:140847;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-210-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13169;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-210-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:77329;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-210-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6628;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-210-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:53996;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1146', '210', '_thumbnail_id', '354');
INSERT INTO `wp_postmeta` VALUES ('1147', '234', '_wp_attached_file', '2026/07/featured-211.jpg');
INSERT INTO `wp_postmeta` VALUES ('1148', '234', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-211.jpg\";s:8:\"filesize\";i:139275;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-211-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12931;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-211-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:76152;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-211-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6555;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-211-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:54102;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1149', '211', '_thumbnail_id', '349');
INSERT INTO `wp_postmeta` VALUES ('1150', '235', '_wp_attached_file', '2026/07/featured-212.jpg');
INSERT INTO `wp_postmeta` VALUES ('1151', '235', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-212.jpg\";s:8:\"filesize\";i:137951;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-212-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12895;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-212-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:77296;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-212-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6523;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-212-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:54275;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1152', '212', '_thumbnail_id', '350');
INSERT INTO `wp_postmeta` VALUES ('1153', '236', '_wp_attached_file', '2026/07/featured-213.jpg');
INSERT INTO `wp_postmeta` VALUES ('1154', '236', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-213.jpg\";s:8:\"filesize\";i:129139;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-213-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12601;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-213-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:74246;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-213-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6308;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-213-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:52097;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1155', '213', '_thumbnail_id', '367');
INSERT INTO `wp_postmeta` VALUES ('1156', '237', '_wp_attached_file', '2026/07/featured-214.jpg');
INSERT INTO `wp_postmeta` VALUES ('1157', '237', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-214.jpg\";s:8:\"filesize\";i:145349;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-214-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13312;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-214-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:79434;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-214-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6774;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-214-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:56480;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1158', '214', '_thumbnail_id', '368');
INSERT INTO `wp_postmeta` VALUES ('1159', '238', '_wp_attached_file', '2026/07/featured-215.jpg');
INSERT INTO `wp_postmeta` VALUES ('1160', '238', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-215.jpg\";s:8:\"filesize\";i:147745;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-215-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13933;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-215-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:82080;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-215-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:7054;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-215-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:58300;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1161', '215', '_thumbnail_id', '352');
INSERT INTO `wp_postmeta` VALUES ('1162', '239', '_wp_attached_file', '2026/07/featured-216.jpg');
INSERT INTO `wp_postmeta` VALUES ('1163', '239', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-216.jpg\";s:8:\"filesize\";i:119100;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-216-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:11390;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-216-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:67808;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-216-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:5584;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-216-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:46570;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1164', '216', '_thumbnail_id', '353');
INSERT INTO `wp_postmeta` VALUES ('1165', '240', '_wp_attached_file', '2026/07/featured-217.jpg');
INSERT INTO `wp_postmeta` VALUES ('1166', '240', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-217.jpg\";s:8:\"filesize\";i:132365;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-217-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13251;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-217-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:77018;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-217-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6804;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-217-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:53679;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1167', '217', '_thumbnail_id', '363');
INSERT INTO `wp_postmeta` VALUES ('1168', '241', '_wp_attached_file', '2026/07/featured-218.jpg');
INSERT INTO `wp_postmeta` VALUES ('1169', '241', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-218.jpg\";s:8:\"filesize\";i:118841;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-218-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13155;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-218-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:72159;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-218-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6377;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-218-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:50347;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1170', '218', '_thumbnail_id', '357');
INSERT INTO `wp_postmeta` VALUES ('1171', '242', '_wp_attached_file', '2026/07/featured-191.jpg');
INSERT INTO `wp_postmeta` VALUES ('1172', '242', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-191.jpg\";s:8:\"filesize\";i:133082;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-191-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12565;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-191-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:73021;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-191-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6515;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-191-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:51804;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1173', '191', '_thumbnail_id', '364');
INSERT INTO `wp_postmeta` VALUES ('1174', '243', '_wp_attached_file', '2026/07/featured-207.jpg');
INSERT INTO `wp_postmeta` VALUES ('1175', '243', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-207.jpg\";s:8:\"filesize\";i:135456;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-207-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13495;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-207-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:78475;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-207-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6924;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-207-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:54578;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1176', '207', '_thumbnail_id', '354');
INSERT INTO `wp_postmeta` VALUES ('1177', '244', '_wp_attached_file', '2026/07/featured-192.jpg');
INSERT INTO `wp_postmeta` VALUES ('1178', '244', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-192.jpg\";s:8:\"filesize\";i:132810;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-192-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12483;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-192-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:74850;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-192-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6173;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-192-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:52601;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1179', '192', '_thumbnail_id', '346');
INSERT INTO `wp_postmeta` VALUES ('1180', '245', '_wp_attached_file', '2026/07/featured-193.jpg');
INSERT INTO `wp_postmeta` VALUES ('1181', '245', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-193.jpg\";s:8:\"filesize\";i:141296;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-193-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13682;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-193-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:80859;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-193-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6951;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-193-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:56185;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1182', '193', '_thumbnail_id', '369');
INSERT INTO `wp_postmeta` VALUES ('1183', '246', '_wp_attached_file', '2026/07/featured-194.jpg');
INSERT INTO `wp_postmeta` VALUES ('1184', '246', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-194.jpg\";s:8:\"filesize\";i:144399;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-194-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13188;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-194-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:78958;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-194-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6807;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-194-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:56149;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1185', '194', '_thumbnail_id', '366');
INSERT INTO `wp_postmeta` VALUES ('1186', '247', '_wp_attached_file', '2026/07/featured-195.jpg');
INSERT INTO `wp_postmeta` VALUES ('1187', '247', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-195.jpg\";s:8:\"filesize\";i:145810;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-195-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13818;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-195-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:80655;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-195-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:7116;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-195-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:57477;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1188', '195', '_thumbnail_id', '361');
INSERT INTO `wp_postmeta` VALUES ('1189', '248', '_wp_attached_file', '2026/07/featured-196.jpg');
INSERT INTO `wp_postmeta` VALUES ('1190', '248', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-196.jpg\";s:8:\"filesize\";i:131080;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-196-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12147;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-196-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:73225;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-196-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6105;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-196-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:50163;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1191', '196', '_thumbnail_id', '365');
INSERT INTO `wp_postmeta` VALUES ('1192', '249', '_wp_attached_file', '2026/07/featured-197.jpg');
INSERT INTO `wp_postmeta` VALUES ('1193', '249', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-197.jpg\";s:8:\"filesize\";i:127326;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-197-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12744;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-197-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:74034;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-197-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6459;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-197-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:51693;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1194', '197', '_thumbnail_id', '356');
INSERT INTO `wp_postmeta` VALUES ('1195', '250', '_wp_attached_file', '2026/07/featured-198.jpg');
INSERT INTO `wp_postmeta` VALUES ('1196', '250', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-198.jpg\";s:8:\"filesize\";i:120523;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-198-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13399;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-198-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:73133;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-198-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6796;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-198-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:50854;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1197', '198', '_thumbnail_id', '370');
INSERT INTO `wp_postmeta` VALUES ('1198', '251', '_wp_attached_file', '2026/07/featured-199.jpg');
INSERT INTO `wp_postmeta` VALUES ('1199', '251', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-199.jpg\";s:8:\"filesize\";i:139137;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-199-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12726;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-199-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:76358;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-199-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6480;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-199-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:53723;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1200', '199', '_thumbnail_id', '360');
INSERT INTO `wp_postmeta` VALUES ('1201', '252', '_wp_attached_file', '2026/07/featured-200.jpg');
INSERT INTO `wp_postmeta` VALUES ('1202', '252', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-200.jpg\";s:8:\"filesize\";i:144553;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-200-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13439;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-200-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:79276;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-200-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6790;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-200-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:55142;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1203', '200', '_thumbnail_id', '360');
INSERT INTO `wp_postmeta` VALUES ('1204', '253', '_wp_attached_file', '2026/07/featured-201.jpg');
INSERT INTO `wp_postmeta` VALUES ('1205', '253', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-201.jpg\";s:8:\"filesize\";i:131710;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-201-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12427;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-201-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:72254;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-201-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6213;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-201-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:51364;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1206', '201', '_thumbnail_id', '364');
INSERT INTO `wp_postmeta` VALUES ('1207', '254', '_wp_attached_file', '2026/07/featured-202.jpg');
INSERT INTO `wp_postmeta` VALUES ('1208', '254', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-202.jpg\";s:8:\"filesize\";i:133124;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-202-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12495;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-202-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:74604;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-202-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6132;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-202-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:52255;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1209', '202', '_thumbnail_id', '355');
INSERT INTO `wp_postmeta` VALUES ('1210', '255', '_wp_attached_file', '2026/07/featured-203.jpg');
INSERT INTO `wp_postmeta` VALUES ('1211', '255', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-203.jpg\";s:8:\"filesize\";i:134087;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-203-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13082;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-203-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:76584;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-203-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6800;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-203-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:53676;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1212', '203', '_thumbnail_id', '366');
INSERT INTO `wp_postmeta` VALUES ('1213', '256', '_wp_attached_file', '2026/07/featured-204.jpg');
INSERT INTO `wp_postmeta` VALUES ('1214', '256', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-204.jpg\";s:8:\"filesize\";i:145499;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-204-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13276;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-204-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:79479;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-204-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6744;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-204-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:56604;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1215', '204', '_thumbnail_id', '351');
INSERT INTO `wp_postmeta` VALUES ('1216', '257', '_wp_attached_file', '2026/07/featured-205.jpg');
INSERT INTO `wp_postmeta` VALUES ('1217', '257', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-205.jpg\";s:8:\"filesize\";i:145142;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-205-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13660;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-205-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:80452;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-205-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6712;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-205-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:57206;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1218', '205', '_thumbnail_id', '362');
INSERT INTO `wp_postmeta` VALUES ('1219', '258', '_wp_attached_file', '2026/07/featured-206.jpg');
INSERT INTO `wp_postmeta` VALUES ('1220', '258', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-206.jpg\";s:8:\"filesize\";i:132498;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-206-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12135;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-206-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:74001;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-206-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6132;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-206-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:50810;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1221', '206', '_thumbnail_id', '358');
INSERT INTO `wp_postmeta` VALUES ('1222', '259', '_wp_attached_file', '2026/07/featured-177.jpg');
INSERT INTO `wp_postmeta` VALUES ('1223', '259', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-177.jpg\";s:8:\"filesize\";i:148190;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-177-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:14488;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-177-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:87331;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-177-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:7195;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-177-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:59635;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1224', '177', '_thumbnail_id', '361');
INSERT INTO `wp_postmeta` VALUES ('1225', '260', '_wp_attached_file', '2026/07/featured-178.jpg');
INSERT INTO `wp_postmeta` VALUES ('1226', '260', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-178.jpg\";s:8:\"filesize\";i:134666;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-178-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:14482;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-178-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:82610;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-178-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:7018;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-178-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:56828;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1227', '178', '_thumbnail_id', '367');
INSERT INTO `wp_postmeta` VALUES ('1228', '261', '_wp_attached_file', '2026/07/featured-179.jpg');
INSERT INTO `wp_postmeta` VALUES ('1229', '261', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-179.jpg\";s:8:\"filesize\";i:143983;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-179-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13318;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-179-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:79391;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-179-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6773;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-179-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:55517;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1230', '179', '_thumbnail_id', '474');
INSERT INTO `wp_postmeta` VALUES ('1231', '262', '_wp_attached_file', '2026/07/featured-180.jpg');
INSERT INTO `wp_postmeta` VALUES ('1232', '262', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-180.jpg\";s:8:\"filesize\";i:152598;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-180-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:14217;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-180-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:84184;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-180-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6883;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-180-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:58279;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1233', '180', '_thumbnail_id', '360');
INSERT INTO `wp_postmeta` VALUES ('1234', '263', '_wp_attached_file', '2026/07/featured-181.jpg');
INSERT INTO `wp_postmeta` VALUES ('1235', '263', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-181.jpg\";s:8:\"filesize\";i:146548;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-181-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13739;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-181-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:82150;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-181-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6991;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-181-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:57260;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1236', '181', '_thumbnail_id', '476');
INSERT INTO `wp_postmeta` VALUES ('1237', '264', '_wp_attached_file', '2026/07/featured-182.jpg');
INSERT INTO `wp_postmeta` VALUES ('1238', '264', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-182.jpg\";s:8:\"filesize\";i:134508;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-182-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12601;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-182-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:75922;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-182-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6312;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-182-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:53153;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1239', '182', '_thumbnail_id', '346');
INSERT INTO `wp_postmeta` VALUES ('1240', '265', '_wp_attached_file', '2026/07/featured-183.jpg');
INSERT INTO `wp_postmeta` VALUES ('1241', '265', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-183.jpg\";s:8:\"filesize\";i:138936;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-183-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13420;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-183-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:79479;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-183-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6958;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-183-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:55359;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1242', '183', '_thumbnail_id', '353');
INSERT INTO `wp_postmeta` VALUES ('1243', '266', '_wp_attached_file', '2026/07/featured-184.jpg');
INSERT INTO `wp_postmeta` VALUES ('1244', '266', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-184.jpg\";s:8:\"filesize\";i:145617;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-184-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13251;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-184-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:79818;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-184-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6776;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-184-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:56856;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1245', '184', '_thumbnail_id', '347');
INSERT INTO `wp_postmeta` VALUES ('1246', '267', '_wp_attached_file', '2026/07/featured-185.jpg');
INSERT INTO `wp_postmeta` VALUES ('1247', '267', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-185.jpg\";s:8:\"filesize\";i:151833;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-185-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:14337;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-185-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:84563;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-185-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:7175;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-185-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:59824;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1248', '185', '_thumbnail_id', '366');
INSERT INTO `wp_postmeta` VALUES ('1249', '268', '_wp_attached_file', '2026/07/featured-186.jpg');
INSERT INTO `wp_postmeta` VALUES ('1250', '268', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-186.jpg\";s:8:\"filesize\";i:141694;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-186-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12985;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-186-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:80463;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-186-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6644;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-186-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:54286;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1251', '186', '_thumbnail_id', '364');
INSERT INTO `wp_postmeta` VALUES ('1252', '269', '_wp_attached_file', '2026/07/featured-187.jpg');
INSERT INTO `wp_postmeta` VALUES ('1253', '269', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-187.jpg\";s:8:\"filesize\";i:136606;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-187-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13553;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-187-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:78863;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-187-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6928;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-187-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:54842;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1254', '187', '_thumbnail_id', '358');
INSERT INTO `wp_postmeta` VALUES ('1255', '270', '_wp_attached_file', '2026/07/featured-188.jpg');
INSERT INTO `wp_postmeta` VALUES ('1256', '270', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-188.jpg\";s:8:\"filesize\";i:121005;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-188-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13423;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-188-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:73675;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-188-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6542;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-188-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:51370;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1257', '188', '_thumbnail_id', '353');
INSERT INTO `wp_postmeta` VALUES ('1258', '271', '_wp_attached_file', '2026/07/featured-189.jpg');
INSERT INTO `wp_postmeta` VALUES ('1259', '271', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-189.jpg\";s:8:\"filesize\";i:143688;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-189-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13157;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-189-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:78741;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-189-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6768;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-189-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:55176;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1260', '189', '_thumbnail_id', '348');
INSERT INTO `wp_postmeta` VALUES ('1261', '272', '_wp_attached_file', '2026/07/featured-190.jpg');
INSERT INTO `wp_postmeta` VALUES ('1262', '272', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:24:\"2026/07/featured-190.jpg\";s:8:\"filesize\";i:150171;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"featured-190-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13951;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"featured-190-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:82605;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"featured-190-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6915;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"featured-190-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:57360;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1263', '190', '_thumbnail_id', '348');
INSERT INTO `wp_postmeta` VALUES ('1264', '273', '_wp_attached_file', '2026/07/featured-1.jpg');
INSERT INTO `wp_postmeta` VALUES ('1265', '273', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1200;s:6:\"height\";i:675;s:4:\"file\";s:22:\"2026/07/featured-1.jpg\";s:8:\"filesize\";i:116854;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:22:\"featured-1-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:11342;}s:5:\"large\";a:5:{s:4:\"file\";s:23:\"featured-1-1024x576.jpg\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:65026;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:22:\"featured-1-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:5469;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:22:\"featured-1-768x432.jpg\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:46504;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1266', '1', '_thumbnail_id', '273');
INSERT INTO `wp_postmeta` VALUES ('1315', '280', '_elementor_edit_mode', 'builder');
INSERT INTO `wp_postmeta` VALUES ('1316', '280', '_elementor_template_type', 'kit');
INSERT INTO `wp_postmeta` VALUES ('1318', '281', '_menu_item_type', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1319', '281', '_menu_item_menu_item_parent', '0');
INSERT INTO `wp_postmeta` VALUES ('1320', '281', '_menu_item_object_id', '281');
INSERT INTO `wp_postmeta` VALUES ('1321', '281', '_menu_item_object', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1322', '281', '_menu_item_target', '');
INSERT INTO `wp_postmeta` VALUES ('1323', '281', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}');
INSERT INTO `wp_postmeta` VALUES ('1324', '281', '_menu_item_xfn', '');
INSERT INTO `wp_postmeta` VALUES ('1325', '281', '_menu_item_url', 'http://localhost:8082/ideiasti/sobre/');
INSERT INTO `wp_postmeta` VALUES ('1326', '282', '_menu_item_type', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1327', '282', '_menu_item_menu_item_parent', '0');
INSERT INTO `wp_postmeta` VALUES ('1328', '282', '_menu_item_object_id', '282');
INSERT INTO `wp_postmeta` VALUES ('1329', '282', '_menu_item_object', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1330', '282', '_menu_item_target', '');
INSERT INTO `wp_postmeta` VALUES ('1331', '282', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}');
INSERT INTO `wp_postmeta` VALUES ('1332', '282', '_menu_item_xfn', '');
INSERT INTO `wp_postmeta` VALUES ('1333', '282', '_menu_item_url', 'http://localhost:8082/ideiasti/politica-de-privacidade/');
INSERT INTO `wp_postmeta` VALUES ('1334', '283', '_menu_item_type', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1335', '283', '_menu_item_menu_item_parent', '0');
INSERT INTO `wp_postmeta` VALUES ('1336', '283', '_menu_item_object_id', '283');
INSERT INTO `wp_postmeta` VALUES ('1337', '283', '_menu_item_object', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1338', '283', '_menu_item_target', '');
INSERT INTO `wp_postmeta` VALUES ('1339', '283', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}');
INSERT INTO `wp_postmeta` VALUES ('1340', '283', '_menu_item_xfn', '');
INSERT INTO `wp_postmeta` VALUES ('1341', '283', '_menu_item_url', 'http://localhost:8082/ideiasti/termos/');
INSERT INTO `wp_postmeta` VALUES ('1342', '284', '_menu_item_type', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1343', '284', '_menu_item_menu_item_parent', '0');
INSERT INTO `wp_postmeta` VALUES ('1344', '284', '_menu_item_object_id', '284');
INSERT INTO `wp_postmeta` VALUES ('1345', '284', '_menu_item_object', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1346', '284', '_menu_item_target', '');
INSERT INTO `wp_postmeta` VALUES ('1347', '284', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}');
INSERT INTO `wp_postmeta` VALUES ('1348', '284', '_menu_item_xfn', '');
INSERT INTO `wp_postmeta` VALUES ('1349', '284', '_menu_item_url', 'http://localhost:8082/ideiasti/');
INSERT INTO `wp_postmeta` VALUES ('1350', '285', '_menu_item_type', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1351', '285', '_menu_item_menu_item_parent', '0');
INSERT INTO `wp_postmeta` VALUES ('1352', '285', '_menu_item_object_id', '285');
INSERT INTO `wp_postmeta` VALUES ('1353', '285', '_menu_item_object', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1354', '285', '_menu_item_target', '');
INSERT INTO `wp_postmeta` VALUES ('1355', '285', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}');
INSERT INTO `wp_postmeta` VALUES ('1356', '285', '_menu_item_xfn', '');
INSERT INTO `wp_postmeta` VALUES ('1357', '285', '_menu_item_url', 'http://localhost:8082/ideiasti/sobre/');
INSERT INTO `wp_postmeta` VALUES ('1358', '286', '_menu_item_type', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1359', '286', '_menu_item_menu_item_parent', '0');
INSERT INTO `wp_postmeta` VALUES ('1360', '286', '_menu_item_object_id', '286');
INSERT INTO `wp_postmeta` VALUES ('1361', '286', '_menu_item_object', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1362', '286', '_menu_item_target', '');
INSERT INTO `wp_postmeta` VALUES ('1363', '286', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}');
INSERT INTO `wp_postmeta` VALUES ('1364', '286', '_menu_item_xfn', '');
INSERT INTO `wp_postmeta` VALUES ('1365', '286', '_menu_item_url', 'http://localhost:8082/ideiasti/category/introducao-a-qualidade-de-software/');
INSERT INTO `wp_postmeta` VALUES ('1366', '287', '_menu_item_type', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1367', '287', '_menu_item_menu_item_parent', '0');
INSERT INTO `wp_postmeta` VALUES ('1368', '287', '_menu_item_object_id', '287');
INSERT INTO `wp_postmeta` VALUES ('1369', '287', '_menu_item_object', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1370', '287', '_menu_item_target', '');
INSERT INTO `wp_postmeta` VALUES ('1371', '287', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}');
INSERT INTO `wp_postmeta` VALUES ('1372', '287', '_menu_item_xfn', '');
INSERT INTO `wp_postmeta` VALUES ('1373', '287', '_menu_item_url', 'http://localhost:8082/ideiasti/category/testes-automatizados/');
INSERT INTO `wp_postmeta` VALUES ('1374', '288', '_menu_item_type', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1375', '288', '_menu_item_menu_item_parent', '0');
INSERT INTO `wp_postmeta` VALUES ('1376', '288', '_menu_item_object_id', '288');
INSERT INTO `wp_postmeta` VALUES ('1377', '288', '_menu_item_object', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1378', '288', '_menu_item_target', '');
INSERT INTO `wp_postmeta` VALUES ('1379', '288', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}');
INSERT INTO `wp_postmeta` VALUES ('1380', '288', '_menu_item_xfn', '');
INSERT INTO `wp_postmeta` VALUES ('1381', '288', '_menu_item_url', 'http://localhost:8082/ideiasti/politica-de-privacidade/');
INSERT INTO `wp_postmeta` VALUES ('1382', '289', '_menu_item_type', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1383', '289', '_menu_item_menu_item_parent', '0');
INSERT INTO `wp_postmeta` VALUES ('1384', '289', '_menu_item_object_id', '289');
INSERT INTO `wp_postmeta` VALUES ('1385', '289', '_menu_item_object', 'custom');
INSERT INTO `wp_postmeta` VALUES ('1386', '289', '_menu_item_target', '');
INSERT INTO `wp_postmeta` VALUES ('1387', '289', '_menu_item_classes', 'a:1:{i:0;s:0:\"\";}');
INSERT INTO `wp_postmeta` VALUES ('1388', '289', '_menu_item_xfn', '');
INSERT INTO `wp_postmeta` VALUES ('1389', '289', '_menu_item_url', 'http://localhost:8082/ideiasti/termos/');
INSERT INTO `wp_postmeta` VALUES ('1734', '336', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1735', '336', '_idmp_filename', '_teste_automacao.md');
INSERT INTO `wp_postmeta` VALUES ('1738', '337', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1739', '337', '_idmp_filename', 'exemplo.md');
INSERT INTO `wp_postmeta` VALUES ('1742', '338', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1743', '338', '_idmp_filename', 'termos-de-uso.md');
INSERT INTO `wp_postmeta` VALUES ('1744', '339', '_elementor_edit_mode', 'builder');
INSERT INTO `wp_postmeta` VALUES ('1745', '339', '_elementor_template_type', 'wp-post');
INSERT INTO `wp_postmeta` VALUES ('1746', '340', '_elementor_edit_mode', 'builder');
INSERT INTO `wp_postmeta` VALUES ('1747', '340', '_elementor_template_type', 'post');
INSERT INTO `wp_postmeta` VALUES ('1748', '339', '_elementor_version', '4.1.4');
INSERT INTO `wp_postmeta` VALUES ('1749', '339', '_elementor_global_class_usage_indexed', '1');
INSERT INTO `wp_postmeta` VALUES ('1750', '339', '_elementor_global_class_usage_indexed_preview', '1');
INSERT INTO `wp_postmeta` VALUES ('1751', '339', '_elementor_migrations_state_d2a1', '4.1.4:595e50d38ae27a4ec16e0e0a9df00b29');
INSERT INTO `wp_postmeta` VALUES ('1752', '339', '_edit_lock', '1783307710:1');
INSERT INTO `wp_postmeta` VALUES ('1754', '341', '_edit_lock', '1783291724:1');
INSERT INTO `wp_postmeta` VALUES ('1755', '341', '_customize_restore_dismissed', '1');
INSERT INTO `wp_postmeta` VALUES ('1756', '211', '_edit_lock', '1783308061:1');
INSERT INTO `wp_postmeta` VALUES ('1757', '343', '_wp_attached_file', '2026/07/Caos_enginering.png');
INSERT INTO `wp_postmeta` VALUES ('1758', '343', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1024;s:6:\"height\";i:1536;s:4:\"file\";s:27:\"2026/07/Caos_enginering.png\";s:8:\"filesize\";i:3118184;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1762', '187', '_edit_lock', '1783309759:1');
INSERT INTO `wp_postmeta` VALUES ('1763', '346', '_wp_attached_file', '2026/07/AI.png');
INSERT INTO `wp_postmeta` VALUES ('1764', '346', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:14:\"2026/07/AI.png\";s:8:\"filesize\";i:4049036;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:14:\"AI-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:93226;}s:5:\"large\";a:5:{s:4:\"file\";s:15:\"AI-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:722576;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:14:\"AI-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:46625;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:14:\"AI-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:456491;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:15:\"AI-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1376314;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:16:\"AI-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:2165592;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1765', '347', '_wp_attached_file', '2026/07/Agile.png');
INSERT INTO `wp_postmeta` VALUES ('1766', '347', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:17:\"2026/07/Agile.png\";s:8:\"filesize\";i:2707880;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:17:\"Agile-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:64914;}s:5:\"large\";a:5:{s:4:\"file\";s:18:\"Agile-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:473132;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:17:\"Agile-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:36710;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:17:\"Agile-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:304170;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:18:\"Agile-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:891331;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:19:\"Agile-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1395039;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1767', '348', '_wp_attached_file', '2026/07/BDD.png');
INSERT INTO `wp_postmeta` VALUES ('1768', '348', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:15:\"2026/07/BDD.png\";s:8:\"filesize\";i:3725978;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:15:\"BDD-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:81696;}s:5:\"large\";a:5:{s:4:\"file\";s:16:\"BDD-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:630741;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:15:\"BDD-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:33062;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:15:\"BDD-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:395262;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:16:\"BDD-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1206395;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:17:\"BDD-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1888410;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1769', '349', '_wp_attached_file', '2026/07/Caos_enginering-1.png');
INSERT INTO `wp_postmeta` VALUES ('1770', '349', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1024;s:6:\"height\";i:1536;s:4:\"file\";s:29:\"2026/07/Caos_enginering-1.png\";s:8:\"filesize\";i:3118184;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:29:\"Caos_enginering-1-200x300.png\";s:5:\"width\";i:200;s:6:\"height\";i:300;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:150481;}s:5:\"large\";a:5:{s:4:\"file\";s:30:\"Caos_enginering-1-683x1024.png\";s:5:\"width\";i:683;s:6:\"height\";i:1024;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1454044;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:29:\"Caos_enginering-1-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:61725;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:30:\"Caos_enginering-1-768x1152.png\";s:5:\"width\";i:768;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1800778;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1771', '350', '_wp_attached_file', '2026/07/Cucumber_e_-Gherkin.png');
INSERT INTO `wp_postmeta` VALUES ('1772', '350', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1024;s:6:\"height\";i:1536;s:4:\"file\";s:31:\"2026/07/Cucumber_e_-Gherkin.png\";s:8:\"filesize\";i:3037885;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:31:\"Cucumber_e_-Gherkin-200x300.png\";s:5:\"width\";i:200;s:6:\"height\";i:300;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:141530;}s:5:\"large\";a:5:{s:4:\"file\";s:32:\"Cucumber_e_-Gherkin-683x1024.png\";s:5:\"width\";i:683;s:6:\"height\";i:1024;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1362657;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:31:\"Cucumber_e_-Gherkin-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:58637;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:32:\"Cucumber_e_-Gherkin-768x1152.png\";s:5:\"width\";i:768;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1686985;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1773', '351', '_wp_attached_file', '2026/07/DockerParaQA.png');
INSERT INTO `wp_postmeta` VALUES ('1774', '351', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1024;s:6:\"height\";i:1536;s:4:\"file\";s:24:\"2026/07/DockerParaQA.png\";s:8:\"filesize\";i:2884917;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"DockerParaQA-200x300.png\";s:5:\"width\";i:200;s:6:\"height\";i:300;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:136350;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"DockerParaQA-683x1024.png\";s:5:\"width\";i:683;s:6:\"height\";i:1024;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1321623;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"DockerParaQA-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:56878;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:25:\"DockerParaQA-768x1152.png\";s:5:\"width\";i:768;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1639756;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1775', '352', '_wp_attached_file', '2026/07/Security_-Testing_-OWASP.png');
INSERT INTO `wp_postmeta` VALUES ('1776', '352', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1024;s:6:\"height\";i:1536;s:4:\"file\";s:36:\"2026/07/Security_-Testing_-OWASP.png\";s:8:\"filesize\";i:3030709;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:36:\"Security_-Testing_-OWASP-200x300.png\";s:5:\"width\";i:200;s:6:\"height\";i:300;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:146265;}s:5:\"large\";a:5:{s:4:\"file\";s:37:\"Security_-Testing_-OWASP-683x1024.png\";s:5:\"width\";i:683;s:6:\"height\";i:1024;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1435939;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:36:\"Security_-Testing_-OWASP-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:60367;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:37:\"Security_-Testing_-OWASP-768x1152.png\";s:5:\"width\";i:768;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1778620;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1777', '353', '_wp_attached_file', '2026/07/TesteE2E.png');
INSERT INTO `wp_postmeta` VALUES ('1778', '353', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1024;s:6:\"height\";i:1536;s:4:\"file\";s:20:\"2026/07/TesteE2E.png\";s:8:\"filesize\";i:2804836;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:20:\"TesteE2E-200x300.png\";s:5:\"width\";i:200;s:6:\"height\";i:300;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:138530;}s:5:\"large\";a:5:{s:4:\"file\";s:21:\"TesteE2E-683x1024.png\";s:5:\"width\";i:683;s:6:\"height\";i:1024;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1334841;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:20:\"TesteE2E-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:56487;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:21:\"TesteE2E-768x1152.png\";s:5:\"width\";i:768;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1654638;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1779', '354', '_wp_attached_file', '2026/07/acessebility.png');
INSERT INTO `wp_postmeta` VALUES ('1780', '354', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:24:\"2026/07/acessebility.png\";s:8:\"filesize\";i:4970318;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"acessebility-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:101940;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"acessebility-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:827168;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"acessebility-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:48462;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"acessebility-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:510535;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:25:\"acessebility-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1609369;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:26:\"acessebility-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:2549132;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1781', '355', '_wp_attached_file', '2026/07/automated-CI_CD-pipeline-visual.png');
INSERT INTO `wp_postmeta` VALUES ('1782', '355', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:43:\"2026/07/automated-CI_CD-pipeline-visual.png\";s:8:\"filesize\";i:1559548;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:43:\"automated-CI_CD-pipeline-visual-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:48269;}s:5:\"large\";a:5:{s:4:\"file\";s:44:\"automated-CI_CD-pipeline-visual-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:293057;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:43:\"automated-CI_CD-pipeline-visual-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:25229;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:43:\"automated-CI_CD-pipeline-visual-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:197732;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:44:\"automated-CI_CD-pipeline-visual-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:524001;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:45:\"automated-CI_CD-pipeline-visual-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:799385;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1783', '356', '_wp_attached_file', '2026/07/cenarios.png');
INSERT INTO `wp_postmeta` VALUES ('1784', '356', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:20:\"2026/07/cenarios.png\";s:8:\"filesize\";i:3160071;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:20:\"cenarios-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:68974;}s:5:\"large\";a:5:{s:4:\"file\";s:21:\"cenarios-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:538350;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:20:\"cenarios-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:31221;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:20:\"cenarios-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:342356;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:21:\"cenarios-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1016458;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:22:\"cenarios-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1592454;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1785', '357', '_wp_attached_file', '2026/07/continous_testes.png');
INSERT INTO `wp_postmeta` VALUES ('1786', '357', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1024;s:6:\"height\";i:1536;s:4:\"file\";s:28:\"2026/07/continous_testes.png\";s:8:\"filesize\";i:2895669;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:28:\"continous_testes-200x300.png\";s:5:\"width\";i:200;s:6:\"height\";i:300;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:139605;}s:5:\"large\";a:5:{s:4:\"file\";s:29:\"continous_testes-683x1024.png\";s:5:\"width\";i:683;s:6:\"height\";i:1024;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1354811;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:28:\"continous_testes-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:59188;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:29:\"continous_testes-768x1152.png\";s:5:\"width\";i:768;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1677023;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1787', '358', '_wp_attached_file', '2026/07/deploy.png');
INSERT INTO `wp_postmeta` VALUES ('1788', '358', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:18:\"2026/07/deploy.png\";s:8:\"filesize\";i:3792752;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:18:\"deploy-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:82812;}s:5:\"large\";a:5:{s:4:\"file\";s:19:\"deploy-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:669717;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:18:\"deploy-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:37839;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:18:\"deploy-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:420307;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:19:\"deploy-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1276079;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:20:\"deploy-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:2003804;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1789', '359', '_wp_attached_file', '2026/07/fakeServiceMoking.png');
INSERT INTO `wp_postmeta` VALUES ('1790', '359', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1536;s:6:\"height\";i:1024;s:4:\"file\";s:29:\"2026/07/fakeServiceMoking.png\";s:8:\"filesize\";i:248219;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:29:\"fakeServiceMoking-300x200.png\";s:5:\"width\";i:300;s:6:\"height\";i:200;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:20521;}s:5:\"large\";a:5:{s:4:\"file\";s:30:\"fakeServiceMoking-1024x683.png\";s:5:\"width\";i:1024;s:6:\"height\";i:683;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:130503;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:29:\"fakeServiceMoking-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:11858;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:29:\"fakeServiceMoking-768x512.png\";s:5:\"width\";i:768;s:6:\"height\";i:512;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:82287;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1791', '360', '_wp_attached_file', '2026/07/framework.png');
INSERT INTO `wp_postmeta` VALUES ('1792', '360', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:21:\"2026/07/framework.png\";s:8:\"filesize\";i:2392796;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:21:\"framework-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:61991;}s:5:\"large\";a:5:{s:4:\"file\";s:22:\"framework-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:415632;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:21:\"framework-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:28979;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:21:\"framework-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:274771;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:22:\"framework-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:756782;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:23:\"framework-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1170817;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1793', '361', '_wp_attached_file', '2026/07/kanban.png');
INSERT INTO `wp_postmeta` VALUES ('1794', '361', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:18:\"2026/07/kanban.png\";s:8:\"filesize\";i:4265902;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:18:\"kanban-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:94805;}s:5:\"large\";a:5:{s:4:\"file\";s:19:\"kanban-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:746055;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:18:\"kanban-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:42425;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:18:\"kanban-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:466981;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:19:\"kanban-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1427137;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:20:\"kanban-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:2237569;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1795', '362', '_wp_attached_file', '2026/07/metric.png');
INSERT INTO `wp_postmeta` VALUES ('1796', '362', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:18:\"2026/07/metric.png\";s:8:\"filesize\";i:2632555;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:18:\"metric-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:67257;}s:5:\"large\";a:5:{s:4:\"file\";s:19:\"metric-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:472053;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:18:\"metric-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:29438;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:18:\"metric-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:308571;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:19:\"metric-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:866532;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:20:\"metric-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1343352;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1797', '363', '_wp_attached_file', '2026/07/metricasQA.png');
INSERT INTO `wp_postmeta` VALUES ('1798', '363', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1536;s:6:\"height\";i:1024;s:4:\"file\";s:22:\"2026/07/metricasQA.png\";s:8:\"filesize\";i:255897;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:22:\"metricasQA-300x200.png\";s:5:\"width\";i:300;s:6:\"height\";i:200;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:21233;}s:5:\"large\";a:5:{s:4:\"file\";s:23:\"metricasQA-1024x683.png\";s:5:\"width\";i:1024;s:6:\"height\";i:683;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:137024;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:22:\"metricasQA-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:12329;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:22:\"metricasQA-768x512.png\";s:5:\"width\";i:768;s:6:\"height\";i:512;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:86840;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1799', '364', '_wp_attached_file', '2026/07/owasp.png');
INSERT INTO `wp_postmeta` VALUES ('1800', '364', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:17:\"2026/07/owasp.png\";s:8:\"filesize\";i:4863153;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:17:\"owasp-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:94188;}s:5:\"large\";a:5:{s:4:\"file\";s:18:\"owasp-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:813796;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:17:\"owasp-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:43420;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:17:\"owasp-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:500979;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:18:\"owasp-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1604595;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:19:\"owasp-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:2588119;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1801', '365', '_wp_attached_file', '2026/07/sql.png');
INSERT INTO `wp_postmeta` VALUES ('1802', '365', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:15:\"2026/07/sql.png\";s:8:\"filesize\";i:3532301;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:15:\"sql-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:75571;}s:5:\"large\";a:5:{s:4:\"file\";s:16:\"sql-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:597032;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:15:\"sql-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:35083;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:15:\"sql-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:375090;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:16:\"sql-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1149489;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:17:\"sql-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1831961;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1803', '366', '_wp_attached_file', '2026/07/testeRunning.png');
INSERT INTO `wp_postmeta` VALUES ('1804', '366', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:24:\"2026/07/testeRunning.png\";s:8:\"filesize\";i:4241045;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"testeRunning-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:85408;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"testeRunning-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:697270;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"testeRunning-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:41486;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"testeRunning-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:432988;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:25:\"testeRunning-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1360430;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:26:\"testeRunning-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:2169803;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1805', '367', '_wp_attached_file', '2026/07/testecontrato.png');
INSERT INTO `wp_postmeta` VALUES ('1806', '367', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1536;s:6:\"height\";i:1024;s:4:\"file\";s:25:\"2026/07/testecontrato.png\";s:8:\"filesize\";i:182425;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:25:\"testecontrato-300x200.png\";s:5:\"width\";i:300;s:6:\"height\";i:200;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:14435;}s:5:\"large\";a:5:{s:4:\"file\";s:26:\"testecontrato-1024x683.png\";s:5:\"width\";i:1024;s:6:\"height\";i:683;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:93329;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:25:\"testecontrato-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:9316;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:25:\"testecontrato-768x512.png\";s:5:\"width\";i:768;s:6:\"height\";i:512;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:59372;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1807', '368', '_wp_attached_file', '2026/07/testes_containers.png');
INSERT INTO `wp_postmeta` VALUES ('1808', '368', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1024;s:6:\"height\";i:1536;s:4:\"file\";s:29:\"2026/07/testes_containers.png\";s:8:\"filesize\";i:2738725;s:5:\"sizes\";a:4:{s:6:\"medium\";a:5:{s:4:\"file\";s:29:\"testes_containers-200x300.png\";s:5:\"width\";i:200;s:6:\"height\";i:300;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:134198;}s:5:\"large\";a:5:{s:4:\"file\";s:30:\"testes_containers-683x1024.png\";s:5:\"width\";i:683;s:6:\"height\";i:1024;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1270630;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:29:\"testes_containers-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:56341;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:30:\"testes_containers-768x1152.png\";s:5:\"width\";i:768;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1574221;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1809', '369', '_wp_attached_file', '2026/07/ux.png');
INSERT INTO `wp_postmeta` VALUES ('1810', '369', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:14:\"2026/07/ux.png\";s:8:\"filesize\";i:2744869;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:14:\"ux-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:66264;}s:5:\"large\";a:5:{s:4:\"file\";s:15:\"ux-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:476780;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:14:\"ux-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:32663;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:14:\"ux-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:307313;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:15:\"ux-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:885747;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:16:\"ux-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1368217;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1811', '370', '_wp_attached_file', '2026/07/vulnerabilit.png');
INSERT INTO `wp_postmeta` VALUES ('1812', '370', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:2560;s:6:\"height\";i:1440;s:4:\"file\";s:24:\"2026/07/vulnerabilit.png\";s:8:\"filesize\";i:3022526;s:5:\"sizes\";a:6:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"vulnerabilit-300x169.png\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:73728;}s:5:\"large\";a:5:{s:4:\"file\";s:25:\"vulnerabilit-1024x576.png\";s:5:\"width\";i:1024;s:6:\"height\";i:576;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:555937;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"vulnerabilit-150x150.png\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:35562;}s:12:\"medium_large\";a:5:{s:4:\"file\";s:24:\"vulnerabilit-768x432.png\";s:5:\"width\";i:768;s:6:\"height\";i:432;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:359398;}s:9:\"1536x1536\";a:5:{s:4:\"file\";s:25:\"vulnerabilit-1536x864.png\";s:5:\"width\";i:1536;s:6:\"height\";i:864;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1028518;}s:9:\"2048x2048\";a:5:{s:4:\"file\";s:26:\"vulnerabilit-2048x1152.png\";s:5:\"width\";i:2048;s:6:\"height\";i:1152;s:9:\"mime-type\";s:9:\"image/png\";s:8:\"filesize\";i:1597131;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1813', '371', '_wp_attached_file', '2026/07/continuous-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1814', '371', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:30:\"2026/07/continuous-testing.jpg\";s:8:\"filesize\";i:29244;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:30:\"continuous-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:10222;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:30:\"continuous-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:5171;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1815', '372', '_wp_attached_file', '2026/07/mock-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1816', '372', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:24:\"2026/07/mock-testing.jpg\";s:8:\"filesize\";i:32265;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"mock-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:11712;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"mock-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:5325;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1817', '373', '_wp_attached_file', '2026/07/security-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1818', '373', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:28:\"2026/07/security-testing.jpg\";s:8:\"filesize\";i:48870;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:28:\"security-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:17619;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:28:\"security-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:8661;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1819', '374', '_wp_attached_file', '2026/07/docker-containers.jpg');
INSERT INTO `wp_postmeta` VALUES ('1820', '374', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:29:\"2026/07/docker-containers.jpg\";s:8:\"filesize\";i:23985;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:29:\"docker-containers-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:7594;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:29:\"docker-containers-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:3583;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1821', '375', '_wp_attached_file', '2026/07/docker-qa.jpg');
INSERT INTO `wp_postmeta` VALUES ('1822', '375', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:21:\"2026/07/docker-qa.jpg\";s:8:\"filesize\";i:29166;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:21:\"docker-qa-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:11094;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:21:\"docker-qa-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:5646;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1823', '376', '_wp_attached_file', '2026/07/qa-metrics.jpg');
INSERT INTO `wp_postmeta` VALUES ('1824', '376', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:22:\"2026/07/qa-metrics.jpg\";s:8:\"filesize\";i:53903;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:22:\"qa-metrics-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:19921;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:22:\"qa-metrics-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:9552;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1825', '377', '_wp_attached_file', '2026/07/contract-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1826', '377', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:28:\"2026/07/contract-testing.jpg\";s:8:\"filesize\";i:28305;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:28:\"contract-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:11857;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:28:\"contract-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6235;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1827', '378', '_wp_attached_file', '2026/07/accessibility-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1828', '378', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:33:\"2026/07/accessibility-testing.jpg\";s:8:\"filesize\";i:33678;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:33:\"accessibility-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12326;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:33:\"accessibility-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:5856;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1829', '379', '_wp_attached_file', '2026/07/cucumber-bdd.jpg');
INSERT INTO `wp_postmeta` VALUES ('1830', '379', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:24:\"2026/07/cucumber-bdd.jpg\";s:8:\"filesize\";i:36897;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"cucumber-bdd-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13502;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"cucumber-bdd-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6100;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1831', '380', '_wp_attached_file', '2026/07/database-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1832', '380', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:28:\"2026/07/database-testing.jpg\";s:8:\"filesize\";i:41934;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:28:\"database-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:17651;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:28:\"database-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:7747;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1833', '381', '_wp_attached_file', '2026/07/integration-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1834', '381', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:31:\"2026/07/integration-testing.jpg\";s:8:\"filesize\";i:23031;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:31:\"integration-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:9090;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:31:\"integration-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:5562;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1835', '382', '_wp_attached_file', '2026/07/quality-monitoring.jpg');
INSERT INTO `wp_postmeta` VALUES ('1836', '382', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:30:\"2026/07/quality-monitoring.jpg\";s:8:\"filesize\";i:36287;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:30:\"quality-monitoring-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13679;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:30:\"quality-monitoring-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:7463;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1837', '383', '_wp_attached_file', '2026/07/mutation-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1838', '383', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:28:\"2026/07/mutation-testing.jpg\";s:8:\"filesize\";i:15334;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:28:\"mutation-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:7203;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:28:\"mutation-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:3474;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1839', '384', '_wp_attached_file', '2026/07/visual-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1840', '384', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:26:\"2026/07/visual-testing.jpg\";s:8:\"filesize\";i:33202;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:26:\"visual-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12178;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:26:\"visual-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:5848;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1841', '385', '_wp_attached_file', '2026/07/agile-methods.jpg');
INSERT INTO `wp_postmeta` VALUES ('1842', '385', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:25:\"2026/07/agile-methods.jpg\";s:8:\"filesize\";i:28983;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:25:\"agile-methods-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13340;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:25:\"agile-methods-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6384;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1843', '386', '_wp_attached_file', '2026/07/regression-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1844', '386', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:30:\"2026/07/regression-testing.jpg\";s:8:\"filesize\";i:19119;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:30:\"regression-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:7877;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:30:\"regression-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:3820;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1845', '387', '_wp_attached_file', '2026/07/usability-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1846', '387', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:29:\"2026/07/usability-testing.jpg\";s:8:\"filesize\";i:50866;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:29:\"usability-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:18380;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:29:\"usability-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:8941;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1847', '388', '_wp_attached_file', '2026/07/gitops-quality.jpg');
INSERT INTO `wp_postmeta` VALUES ('1848', '388', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:26:\"2026/07/gitops-quality.jpg\";s:8:\"filesize\";i:12542;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:26:\"gitops-quality-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:5636;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:26:\"gitops-quality-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:3038;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1849', '389', '_wp_attached_file', '2026/07/kubernetes-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1850', '389', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:30:\"2026/07/kubernetes-testing.jpg\";s:8:\"filesize\";i:25784;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:30:\"kubernetes-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:9658;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:30:\"kubernetes-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:4279;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1851', '390', '_wp_attached_file', '2026/07/api-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1852', '390', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:23:\"2026/07/api-testing.jpg\";s:8:\"filesize\";i:24591;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:23:\"api-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:9568;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:23:\"api-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:4705;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1853', '391', '_wp_attached_file', '2026/07/exploratory-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1854', '391', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:31:\"2026/07/exploratory-testing.jpg\";s:8:\"filesize\";i:19731;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:31:\"exploratory-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:7825;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:31:\"exploratory-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:4058;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1855', '392', '_wp_attached_file', '2026/07/tdd-development.jpg');
INSERT INTO `wp_postmeta` VALUES ('1856', '392', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:27:\"2026/07/tdd-development.jpg\";s:8:\"filesize\";i:29244;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:27:\"tdd-development-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:10222;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:27:\"tdd-development-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:5171;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1857', '393', '_wp_attached_file', '2026/07/mobile-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1858', '393', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:26:\"2026/07/mobile-testing.jpg\";s:8:\"filesize\";i:32753;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:26:\"mobile-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:11223;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:26:\"mobile-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:5625;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1859', '394', '_wp_attached_file', '2026/07/future-qa.jpg');
INSERT INTO `wp_postmeta` VALUES ('1860', '394', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:21:\"2026/07/future-qa.jpg\";s:8:\"filesize\";i:33779;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:21:\"future-qa-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12907;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:21:\"future-qa-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:6144;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1861', '395', '_wp_attached_file', '2026/07/agile-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1862', '395', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:25:\"2026/07/agile-testing.jpg\";s:8:\"filesize\";i:36427;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:25:\"agile-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:12572;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:25:\"agile-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:5944;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1863', '396', '_wp_attached_file', '2026/07/performance-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1864', '396', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:31:\"2026/07/performance-testing.jpg\";s:8:\"filesize\";i:80370;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:31:\"performance-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:28915;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:31:\"performance-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:13007;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1865', '397', '_wp_attached_file', '2026/07/security-vulnerability.jpg');
INSERT INTO `wp_postmeta` VALUES ('1866', '397', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:34:\"2026/07/security-vulnerability.jpg\";s:8:\"filesize\";i:25003;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:34:\"security-vulnerability-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:10071;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:34:\"security-vulnerability-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:4854;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1867', '398', '_wp_attached_file', '2026/07/load-testing.jpg');
INSERT INTO `wp_postmeta` VALUES ('1868', '398', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:338;s:4:\"file\";s:24:\"2026/07/load-testing.jpg\";s:8:\"filesize\";i:49162;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:24:\"load-testing-300x169.jpg\";s:5:\"width\";i:300;s:6:\"height\";i:169;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:20915;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:24:\"load-testing-150x150.jpg\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:10:\"image/jpeg\";s:8:\"filesize\";i:9919;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1874', '400', '_wp_attached_file', '2026/07/TestesIA.png');
INSERT INTO `wp_postmeta` VALUES ('1875', '400', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1536;s:6:\"height\";i:1024;s:4:\"file\";s:20:\"2026/07/TestesIA.png\";s:8:\"filesize\";i:2357291;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1881', '337', '_wp_old_date', '2026-07-05');
INSERT INTO `wp_postmeta` VALUES ('1884', '53', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('1885', '53', '_idmp_filename', 'sobre.md');
INSERT INTO `wp_postmeta` VALUES ('1888', '178', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1889', '407', '_wp_attached_file', '2026/07/giphy.gif');
INSERT INTO `wp_postmeta` VALUES ('1890', '407', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:320;s:6:\"height\";i:320;s:4:\"file\";s:17:\"2026/07/giphy.gif\";s:8:\"filesize\";i:1521565;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1893', '179', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1896', '180', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1897', '410', '_wp_attached_file', '2026/07/giphy-1.gif');
INSERT INTO `wp_postmeta` VALUES ('1898', '410', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:480;s:6:\"height\";i:320;s:4:\"file\";s:19:\"2026/07/giphy-1.gif\";s:8:\"filesize\";i:1101676;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('1901', '181', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1904', '182', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1907', '183', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1910', '184', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1913', '185', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1916', '186', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1919', '187', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1922', '188', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1925', '189', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1928', '190', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1931', '191', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1934', '193', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1937', '194', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1940', '195', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1943', '196', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1946', '197', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1949', '198', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1952', '199', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1955', '200', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1958', '202', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1961', '203', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1964', '204', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1967', '205', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1970', '206', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1973', '207', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1976', '208', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1979', '209', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1982', '210', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1985', '211', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1988', '212', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1991', '213', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1994', '214', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('1997', '215', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('2000', '216', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('2003', '217', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('2006', '218', '_wp_old_date', '2026-07-04');
INSERT INTO `wp_postmeta` VALUES ('2009', '447', '_wp_attached_file', '2026/07/1588cb664d636f50f5168aae2a232541.jpg');
INSERT INTO `wp_postmeta` VALUES ('2010', '447', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:600;s:6:\"height\";i:375;s:4:\"file\";s:44:\"2026/07/1588cb664d636f50f5168aae2a232541.jpg\";s:8:\"filesize\";i:35128;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('2015', '448', '_wp_attached_file', '2026/07/giphy-2.gif');
INSERT INTO `wp_postmeta` VALUES ('2016', '448', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:320;s:6:\"height\";i:320;s:4:\"file\";s:19:\"2026/07/giphy-2.gif\";s:8:\"filesize\";i:1521565;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('2021', '450', '_wp_attached_file', '2026/07/giphy-3.gif');
INSERT INTO `wp_postmeta` VALUES ('2022', '450', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:480;s:6:\"height\";i:320;s:4:\"file\";s:19:\"2026/07/giphy-3.gif\";s:8:\"filesize\";i:1101676;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('2097', '452', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('2098', '452', '_idmp_filename', 'politica-de-privacidade.md');
INSERT INTO `wp_postmeta` VALUES ('2101', '453', '_wp_attached_file', '2026/07/giphy-4.gif');
INSERT INTO `wp_postmeta` VALUES ('2102', '453', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:320;s:6:\"height\";i:320;s:4:\"file\";s:19:\"2026/07/giphy-4.gif\";s:8:\"filesize\";i:1521565;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('2107', '455', '_wp_attached_file', '2026/07/giphy-5.gif');
INSERT INTO `wp_postmeta` VALUES ('2108', '455', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:480;s:6:\"height\";i:320;s:4:\"file\";s:19:\"2026/07/giphy-5.gif\";s:8:\"filesize\";i:1101676;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('2181', '457', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('2182', '457', '_idmp_filename', '00_indice.md');
INSERT INTO `wp_postmeta` VALUES ('2185', '458', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('2186', '458', '_idmp_filename', 'Bem-vindo.md');
INSERT INTO `wp_postmeta` VALUES ('2189', '459', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('2190', '459', '_idmp_filename', 'indice.md');
INSERT INTO `wp_postmeta` VALUES ('2193', '460', '_wp_attached_file', '2026/07/giphy-6.gif');
INSERT INTO `wp_postmeta` VALUES ('2194', '460', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:320;s:6:\"height\";i:320;s:4:\"file\";s:19:\"2026/07/giphy-6.gif\";s:8:\"filesize\";i:1521565;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:19:\"giphy-6-300x300.gif\";s:5:\"width\";i:300;s:6:\"height\";i:300;s:9:\"mime-type\";s:9:\"image/gif\";s:8:\"filesize\";i:35594;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:19:\"giphy-6-150x150.gif\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/gif\";s:8:\"filesize\";i:11640;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('2195', '462', '_wp_attached_file', '2026/07/giphy-7.gif');
INSERT INTO `wp_postmeta` VALUES ('2196', '462', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:480;s:6:\"height\";i:320;s:4:\"file\";s:19:\"2026/07/giphy-7.gif\";s:8:\"filesize\";i:1101676;s:5:\"sizes\";a:2:{s:6:\"medium\";a:5:{s:4:\"file\";s:19:\"giphy-7-300x200.gif\";s:5:\"width\";i:300;s:6:\"height\";i:200;s:9:\"mime-type\";s:9:\"image/gif\";s:8:\"filesize\";i:41794;}s:9:\"thumbnail\";a:5:{s:4:\"file\";s:19:\"giphy-7-150x150.gif\";s:5:\"width\";i:150;s:6:\"height\";i:150;s:9:\"mime-type\";s:9:\"image/gif\";s:8:\"filesize\";i:17938;}}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('2214', '464', '_wp_attached_file', '2026/07/giphy-8.gif');
INSERT INTO `wp_postmeta` VALUES ('2215', '464', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:320;s:6:\"height\";i:320;s:4:\"file\";s:19:\"2026/07/giphy-8.gif\";s:8:\"filesize\";i:1521565;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('2217', '466', '_wp_attached_file', '2026/07/giphy-9.gif');
INSERT INTO `wp_postmeta` VALUES ('2218', '466', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:480;s:6:\"height\";i:320;s:4:\"file\";s:19:\"2026/07/giphy-9.gif\";s:8:\"filesize\";i:1101676;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('2242', '469', '_wp_attached_file', '2026/07/giphy-10.gif');
INSERT INTO `wp_postmeta` VALUES ('2243', '469', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:320;s:6:\"height\";i:320;s:4:\"file\";s:20:\"2026/07/giphy-10.gif\";s:8:\"filesize\";i:1521565;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('2248', '471', '_wp_attached_file', '2026/07/giphy-11.gif');
INSERT INTO `wp_postmeta` VALUES ('2249', '471', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:480;s:6:\"height\";i:320;s:4:\"file\";s:20:\"2026/07/giphy-11.gif\";s:8:\"filesize\";i:1101676;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('2328', '474', '_wp_attached_file', '2026/07/giphy-12.gif');
INSERT INTO `wp_postmeta` VALUES ('2329', '474', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:320;s:6:\"height\";i:320;s:4:\"file\";s:20:\"2026/07/giphy-12.gif\";s:8:\"filesize\";i:1521565;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('2334', '476', '_wp_attached_file', '2026/07/giphy-13.gif');
INSERT INTO `wp_postmeta` VALUES ('2335', '476', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:480;s:6:\"height\";i:320;s:4:\"file\";s:20:\"2026/07/giphy-13.gif\";s:8:\"filesize\";i:1101676;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('2410', '480', '_idmp_imported', '1');
INSERT INTO `wp_postmeta` VALUES ('2411', '480', '_idmp_filename', '41_testes_automatizados_com_implementacao_de_ia_a_nova_era_da_qualidade_de_software.md');
INSERT INTO `wp_postmeta` VALUES ('2414', '481', '_wp_attached_file', '2026/07/TestesIA-1.png');
INSERT INTO `wp_postmeta` VALUES ('2415', '481', '_wp_attachment_metadata', 'a:6:{s:5:\"width\";i:1536;s:6:\"height\";i:1024;s:4:\"file\";s:22:\"2026/07/TestesIA-1.png\";s:8:\"filesize\";i:2357291;s:5:\"sizes\";a:0:{}s:10:\"image_meta\";a:13:{s:8:\"aperture\";s:1:\"0\";s:6:\"credit\";s:0:\"\";s:6:\"camera\";s:0:\"\";s:7:\"caption\";s:0:\"\";s:17:\"created_timestamp\";s:1:\"0\";s:9:\"copyright\";s:0:\"\";s:12:\"focal_length\";s:1:\"0\";s:3:\"iso\";s:1:\"0\";s:13:\"shutter_speed\";s:1:\"0\";s:5:\"title\";s:0:\"\";s:11:\"orientation\";s:1:\"0\";s:8:\"keywords\";a:0:{}s:3:\"alt\";s:0:\"\";}}');
INSERT INTO `wp_postmeta` VALUES ('2416', '480', '_thumbnail_id', '481');

DROP TABLE IF EXISTS `wp_posts`;
CREATE TABLE `wp_posts` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `post_author` bigint(20) unsigned NOT NULL DEFAULT 0,
  `post_date` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
  `post_date_gmt` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
  `post_content` longtext NOT NULL,
  `post_title` text NOT NULL,
  `post_excerpt` text NOT NULL,
  `post_status` varchar(20) NOT NULL DEFAULT 'publish',
  `comment_status` varchar(20) NOT NULL DEFAULT 'open',
  `ping_status` varchar(20) NOT NULL DEFAULT 'open',
  `post_password` varchar(255) NOT NULL DEFAULT '',
  `post_name` varchar(200) NOT NULL DEFAULT '',
  `to_ping` text NOT NULL,
  `pinged` text NOT NULL,
  `post_modified` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
  `post_modified_gmt` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
  `post_content_filtered` longtext NOT NULL,
  `post_parent` bigint(20) unsigned NOT NULL DEFAULT 0,
  `guid` varchar(255) NOT NULL DEFAULT '',
  `menu_order` int(11) NOT NULL DEFAULT 0,
  `post_type` varchar(20) NOT NULL DEFAULT 'post',
  `post_mime_type` varchar(100) NOT NULL DEFAULT '',
  `comment_count` bigint(20) NOT NULL DEFAULT 0,
  PRIMARY KEY (`ID`),
  KEY `post_name` (`post_name`(191)),
  KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),
  KEY `post_parent` (`post_parent`),
  KEY `post_author` (`post_author`),
  KEY `type_status_author` (`post_type`,`post_status`,`post_author`)
) ENGINE=InnoDB AUTO_INCREMENT=482 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

INSERT INTO `wp_posts` VALUES ('1', '1', '2026-07-03 01:08:54', '2026-07-03 04:08:54', '<!-- wp:paragraph -->\n<p>Boas-vindas ao WordPress. Esse é o seu primeiro post. Edite-o ou exclua-o, e então comece a escrever!</p>\n<!-- /wp:paragraph -->', 'Olá, mundo!', '', 'publish', 'open', 'open', '', 'ola-mundo', '', '', '2026-07-03 01:08:54', '2026-07-03 04:08:54', '', '0', 'http://localhost/achadinhos/?p=1', '0', 'post', '', '1');
INSERT INTO `wp_posts` VALUES ('4', '0', '2026-07-03 01:08:56', '2026-07-03 04:08:56', '<!-- wp:page-list /-->', 'Navegação', '', 'publish', 'closed', 'closed', '', 'navigation', '', '', '2026-07-03 01:08:56', '2026-07-03 04:08:56', '', '0', 'http://localhost/achadinhos/2026/07/03/navigation/', '0', 'wp_navigation', '', '0');
INSERT INTO `wp_posts` VALUES ('5', '1', '2026-07-03 01:09:27', '0000-00-00 00:00:00', '', 'Rascunho automático', '', 'auto-draft', 'open', 'open', '', '', '', '', '2026-07-03 01:09:27', '0000-00-00 00:00:00', '', '0', 'http://localhost/achadinhos/?p=5', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('7', '1', '2026-07-03 01:11:53', '2026-07-03 04:11:53', '{\"version\": 3, \"isGlobalStylesUserThemeJSON\": true }', 'Custom Styles', '', 'publish', 'closed', 'closed', '', 'wp-global-styles-assets{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2f', '', '', '2026-07-03 01:11:53', '2026-07-03 04:11:53', '', '0', 'http://localhost/achadinhos/2026/07/03/wp-global-styles-assets{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}2f/', '0', 'wp_global_styles', '', '0');
INSERT INTO `wp_posts` VALUES ('9', '1', '2026-07-03 00:00:00', '2026-07-03 03:00:00', 'Perfeito para limpar teclado, notebook e mesa. Funciona via USB, super portátil e acompanha escova e borracha para limpeza profunda entre as teclas.', 'Mini Aspirador USB Portátil', 'Perfeito para limpar teclado, notebook e mesa. Funciona via USB, super portátil e acompanha escova e borracha para limpeza profunda entre as teclas.', 'publish', 'closed', 'closed', '', 'mini-aspirador-usb-portatil', '', '', '2026-07-03 00:00:00', '2026-07-03 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-aspirador-usb-portatil/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('10', '1', '2026-07-02 00:00:00', '2026-07-02 03:00:00', 'Carregamento rápido com conexão magnética. Compatível com USB-C, Micro USB e Lightning. Ideal para quem usa vários dispositivos.', 'Cabo Magnético 3 em 1', 'Carregamento rápido com conexão magnética. Compatível com USB-C, Micro USB e Lightning. Ideal para quem usa vários dispositivos.', 'publish', 'closed', 'closed', '', 'cabo-magnetico-3-em-1', '', '', '2026-07-02 00:00:00', '2026-07-02 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/cabo-magnetico-3-em-1/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('11', '1', '2026-07-01 00:00:00', '2026-07-01 03:00:00', 'Ventilador compacto e silencioso, perfeito para usar no PC, notebook ou escrivaninha. Ideal para dias quentes no home office.', 'Mini Ventilador USB Silencioso', 'Ventilador compacto e silencioso, perfeito para usar no PC, notebook ou escrivaninha. Ideal para dias quentes no home office.', 'publish', 'closed', 'closed', '', 'mini-ventilador-usb-silencioso', '', '', '2026-07-01 00:00:00', '2026-07-01 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-ventilador-usb-silencioso/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('12', '1', '2026-06-30 00:00:00', '2026-06-30 03:00:00', 'Controle por app, compatível com Alexa e Google Home. 16 milhões de cores, dimerizável e programável. Transforme seu ambiente.', 'Lâmpada Inteligente Wi-Fi', 'Controle por app, compatível com Alexa e Google Home. 16 milhões de cores, dimerizável e programável. Transforme seu ambiente.', 'publish', 'closed', 'closed', '', 'lampada-inteligente-wi-fi', '', '', '2026-06-30 00:00:00', '2026-06-30 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/lampada-inteligente-wi-fi/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('13', '1', '2026-06-29 00:00:00', '2026-06-29 03:00:00', 'Fita de LED RGB com controle remoto, perfeita para dar um visual gamer ao seu setup. Cola na parte de trás da mesa, monitor ou estante.', 'Fita LED RGB para Setup', 'Fita de LED RGB com controle remoto, perfeita para dar um visual gamer ao seu setup. Cola na parte de trás da mesa, monitor ou estante.', 'publish', 'closed', 'closed', '', 'fita-led-rgb-para-setup', '', '', '2026-06-29 00:00:00', '2026-06-29 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/fita-led-rgb-para-setup/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('14', '1', '2026-06-28 00:00:00', '2026-06-28 03:00:00', 'Tripé flexível com pernas articuláveis, ideal para gravar vídeos, lives, fotos e reuniões. Compatível com celular e câmeras compactas.', 'Tripé Flexível Universal', 'Tripé flexível com pernas articuláveis, ideal para gravar vídeos, lives, fotos e reuniões. Compatível com celular e câmeras compactas.', 'publish', 'closed', 'closed', '', 'tripe-flexivel-universal', '', '', '2026-06-28 00:00:00', '2026-06-28 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/tripe-flexivel-universal/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('15', '1', '2026-06-27 00:00:00', '2026-06-27 03:00:00', 'Microfone de lapela com áudio limpo e profissional. Plug P2, compatível com celular, PC e câmeras. Ótimo para gravar vídeos e reuniões.', 'Microfone Lapela Profissional', 'Microfone de lapela com áudio limpo e profissional. Plug P2, compatível com celular, PC e câmeras. Ótimo para gravar vídeos e reuniões.', 'publish', 'closed', 'closed', '', 'microfone-lapela-profissional', '', '', '2026-06-27 00:00:00', '2026-06-27 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/microfone-lapela-profissional/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('16', '1', '2026-06-26 00:00:00', '2026-06-26 03:00:00', 'Transforma seu celular em uma câmera profissional para fotos macro. Encoste a lente na câmera do celular e capture detalhes incríveis.', 'Lente Macro para Celular', 'Transforma seu celular em uma câmera profissional para fotos macro. Encoste a lente na câmera do celular e capture detalhes incríveis.', 'publish', 'closed', 'closed', '', 'lente-macro-para-celular', '', '', '2026-06-26 00:00:00', '2026-06-26 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/lente-macro-para-celular/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('17', '1', '2026-06-25 00:00:00', '2026-06-25 03:00:00', 'Suporte articulado com braço flexível, perfeito para assistir vídeos, fazer chamadas de vídeo ou trabalhar com as mãos livres.', 'Suporte Articulado para Celular', 'Suporte articulado com braço flexível, perfeito para assistir vídeos, fazer chamadas de vídeo ou trabalhar com as mãos livres.', 'publish', 'closed', 'closed', '', 'suporte-articulado-para-celular', '', '', '2026-06-25 00:00:00', '2026-06-25 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/suporte-articulado-para-celular/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('18', '1', '2026-06-24 00:00:00', '2026-06-24 03:00:00', 'Powerbank slim e leve, carregamento rápido 2.1A, entrada USB-C e dupla saída USB. Carregue dois dispositivos ao mesmo tempo.', 'Powerbank Slim 10000mAh', 'Powerbank slim e leve, carregamento rápido 2.1A, entrada USB-C e dupla saída USB. Carregue dois dispositivos ao mesmo tempo.', 'publish', 'closed', 'closed', '', 'powerbank-slim-10000mah', '', '', '2026-06-24 00:00:00', '2026-06-24 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/powerbank-slim-10000mah/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('19', '1', '2026-06-23 00:00:00', '2026-06-23 03:00:00', 'Kit com 24 chaves de precisão para manutenção de eletrônicos, celulares, notebooks, óculos e consoles. Estojo organizador incluso.', 'Kit Chaves de Precisão', 'Kit com 24 chaves de precisão para manutenção de eletrônicos, celulares, notebooks, óculos e consoles. Estojo organizador incluso.', 'publish', 'closed', 'closed', '', 'kit-chaves-de-precisao', '', '', '2026-06-23 00:00:00', '2026-06-23 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/kit-chaves-de-precisao/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('20', '1', '2026-06-22 00:00:00', '2026-06-22 03:00:00', 'Multímetro digital para medir tensão, corrente, resistência e continuidade. Essencial para quem trabalha com eletrônica e elétrica.', 'Multímetro Digital Portátil', 'Multímetro digital para medir tensão, corrente, resistência e continuidade. Essencial para quem trabalha com eletrônica e elétrica.', 'publish', 'closed', 'closed', '', 'multimetro-digital-portatil', '', '', '2026-06-22 00:00:00', '2026-06-22 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/multimetro-digital-portatil/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('21', '1', '2026-06-21 00:00:00', '2026-06-21 03:00:00', 'Pasta térmica de alta performance para melhorar a dissipação de calor em CPUs e GPUs. Reduz a temperatura do processador em até 10°C.', 'Pasta Térmica para Processador', 'Pasta térmica de alta performance para melhorar a dissipação de calor em CPUs e GPUs. Reduz a temperatura do processador em até 10°C.', 'publish', 'closed', 'closed', '', 'pasta-termica-para-processador', '', '', '2026-06-21 00:00:00', '2026-06-21 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/pasta-termica-para-processador/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('22', '1', '2026-06-20 00:00:00', '2026-06-20 03:00:00', 'Tapete magnético com borda elevada para organizar parafusos e peças pequenas durante reparos. Evita perder peças.', 'Suporte Magnético para Parafusos', 'Tapete magnético com borda elevada para organizar parafusos e peças pequenas durante reparos. Evita perder peças.', 'publish', 'closed', 'closed', '', 'suporte-magnetico-para-parafusos', '', '', '2026-06-20 00:00:00', '2026-06-20 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/suporte-magnetico-para-parafusos/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('23', '1', '2026-06-19 00:00:00', '2026-06-19 03:00:00', 'Kit completo com spray, pincel, flanela e hastes flexíveis para limpeza de teclados, câmeras, celulares e notebooks.', 'Kit Limpeza para Eletrônicos', 'Kit completo com spray, pincel, flanela e hastes flexíveis para limpeza de teclados, câmeras, celulares e notebooks.', 'publish', 'closed', 'closed', '', 'kit-limpeza-para-eletronicos', '', '', '2026-06-19 00:00:00', '2026-06-19 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/kit-limpeza-para-eletronicos/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('24', '1', '2026-06-18 00:00:00', '2026-06-18 03:00:00', 'Mini projetor portátil compatível com celular, notebook e TV Box. Transforme qualquer parede em uma tela gigante. Resolução HD suportada.', 'Mini Projetor Portátil LED', 'Mini projetor portátil compatível com celular, notebook e TV Box. Transforme qualquer parede em uma tela gigante. Resolução HD suportada.', 'publish', 'closed', 'closed', '', 'mini-projetor-portatil-led', '', '', '2026-06-18 00:00:00', '2026-06-18 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-projetor-portatil-led/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('25', '1', '2026-06-17 00:00:00', '2026-06-17 03:00:00', 'Caneta digital com ponta precisa para tablets e celulares. Ótima para anotações, desenhos e navegação. Palm rejection incluído.', 'Caneta Touch para Tablet', 'Caneta digital com ponta precisa para tablets e celulares. Ótima para anotações, desenhos e navegação. Palm rejection incluído.', 'publish', 'closed', 'closed', '', 'caneta-touch-para-tablet', '', '', '2026-06-17 00:00:00', '2026-06-17 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/caneta-touch-para-tablet/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('26', '1', '2026-06-16 00:00:00', '2026-06-16 03:00:00', 'Sensor de movimento USB que acende automaticamente ao detectar presença. Ideal para corredor, banheiro ou escada. Plug and play.', 'Sensor de Presença USB', 'Sensor de movimento USB que acende automaticamente ao detectar presença. Ideal para corredor, banheiro ou escada. Plug and play.', 'publish', 'closed', 'closed', '', 'sensor-de-presenca-usb', '', '', '2026-06-16 00:00:00', '2026-06-16 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/sensor-de-presenca-usb/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('27', '1', '2026-06-15 00:00:00', '2026-06-15 03:00:00', 'Mini teclado sem fio com touchpad, perfeito para Smart TVs, TV Box, PCs e projetores. Conexão 2.4GHz, alcance de 10m.', 'Mini Teclado Wireless', 'Mini teclado sem fio com touchpad, perfeito para Smart TVs, TV Box, PCs e projetores. Conexão 2.4GHz, alcance de 10m.', 'publish', 'closed', 'closed', '', 'mini-teclado-wireless', '', '', '2026-06-15 00:00:00', '2026-06-15 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-teclado-wireless/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('28', '1', '2026-06-14 00:00:00', '2026-06-14 03:00:00', 'Luz RGB que acende quando chega mensagem ou notificação no celular. Conecta via Bluetooth e personaliza as cores por app.', 'Luz de Notificação RGB USB', 'Luz RGB que acende quando chega mensagem ou notificação no celular. Conecta via Bluetooth e personaliza as cores por app.', 'publish', 'closed', 'closed', '', 'luz-de-notificacao-rgb-usb', '', '', '2026-06-14 00:00:00', '2026-06-14 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/luz-de-notificacao-rgb-usb/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('30', '1', '2026-07-03 01:34:29', '2026-07-03 04:34:29', '{\"version\": 3, \"isGlobalStylesUserThemeJSON\": true }', 'Custom Styles', '', 'publish', 'closed', 'closed', '', 'wp-global-styles-achadinhos-tech', '', '', '2026-07-03 01:34:29', '2026-07-03 04:34:29', '', '0', 'http://localhost/achadinhos/2026/07/03/wp-global-styles-achadinhos-tech/', '0', 'wp_global_styles', '', '0');
INSERT INTO `wp_posts` VALUES ('32', '1', '2026-07-03 01:38:29', '2026-07-03 04:38:29', '{\n    \"show_on_front\": {\n        \"value\": \"page\",\n        \"type\": \"option\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2026-07-03 04:38:29\"\n    },\n    \"page_on_front\": {\n        \"value\": \"6\",\n        \"type\": \"option\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2026-07-03 04:38:29\"\n    }\n}', '', '', 'trash', 'closed', 'closed', '', '1ceea149-98c3-4eba-9c01-412c6e592f5c', '', '', '2026-07-03 01:38:29', '2026-07-03 04:38:29', '', '0', 'http://localhost/achadinhos/2026/07/03/1ceea149-98c3-4eba-9c01-412c6e592f5c/', '0', 'customize_changeset', '', '0');
INSERT INTO `wp_posts` VALUES ('33', '1', '2026-07-03 00:00:00', '2026-07-03 03:00:00', 'Perfeito para limpar teclado, notebook e mesa. Funciona via USB, super portátil e acompanha escova e borracha para limpeza profunda entre as teclas.', 'Mini Aspirador USB Portátil', 'Perfeito para limpar teclado, notebook e mesa. Funciona via USB, super portátil e acompanha escova e borracha para limpeza profunda entre as teclas.', 'publish', 'closed', 'closed', '', 'mini-aspirador-usb-portatil-2', '', '', '2026-07-03 00:00:00', '2026-07-03 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-aspirador-usb-portatil-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('34', '1', '2026-07-02 00:00:00', '2026-07-02 03:00:00', 'Carregamento rápido com conexão magnética. Compatível com USB-C, Micro USB e Lightning. Ideal para quem usa vários dispositivos.', 'Cabo Magnético 3 em 1', 'Carregamento rápido com conexão magnética. Compatível com USB-C, Micro USB e Lightning. Ideal para quem usa vários dispositivos.', 'publish', 'closed', 'closed', '', 'cabo-magnetico-3-em-1-2', '', '', '2026-07-02 00:00:00', '2026-07-02 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/cabo-magnetico-3-em-1-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('35', '1', '2026-07-01 00:00:00', '2026-07-01 03:00:00', 'Ventilador compacto e silencioso, perfeito para usar no PC, notebook ou escrivaninha. Ideal para dias quentes no home office.', 'Mini Ventilador USB Silencioso', 'Ventilador compacto e silencioso, perfeito para usar no PC, notebook ou escrivaninha. Ideal para dias quentes no home office.', 'publish', 'closed', 'closed', '', 'mini-ventilador-usb-silencioso-2', '', '', '2026-07-01 00:00:00', '2026-07-01 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-ventilador-usb-silencioso-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('36', '1', '2026-06-30 00:00:00', '2026-06-30 03:00:00', 'Controle por app, compatível com Alexa e Google Home. 16 milhões de cores, dimerizável e programável. Transforme seu ambiente.', 'Lâmpada Inteligente Wi-Fi', 'Controle por app, compatível com Alexa e Google Home. 16 milhões de cores, dimerizável e programável. Transforme seu ambiente.', 'publish', 'closed', 'closed', '', 'lampada-inteligente-wi-fi-2', '', '', '2026-06-30 00:00:00', '2026-06-30 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/lampada-inteligente-wi-fi-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('37', '1', '2026-06-29 00:00:00', '2026-06-29 03:00:00', 'Fita de LED RGB com controle remoto, perfeita para dar um visual gamer ao seu setup. Cola na parte de trás da mesa, monitor ou estante.', 'Fita LED RGB para Setup', 'Fita de LED RGB com controle remoto, perfeita para dar um visual gamer ao seu setup. Cola na parte de trás da mesa, monitor ou estante.', 'publish', 'closed', 'closed', '', 'fita-led-rgb-para-setup-2', '', '', '2026-06-29 00:00:00', '2026-06-29 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/fita-led-rgb-para-setup-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('38', '1', '2026-06-28 00:00:00', '2026-06-28 03:00:00', 'Tripé flexível com pernas articuláveis, ideal para gravar vídeos, lives, fotos e reuniões. Compatível com celular e câmeras compactas.', 'Tripé Flexível Universal', 'Tripé flexível com pernas articuláveis, ideal para gravar vídeos, lives, fotos e reuniões. Compatível com celular e câmeras compactas.', 'publish', 'closed', 'closed', '', 'tripe-flexivel-universal-2', '', '', '2026-06-28 00:00:00', '2026-06-28 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/tripe-flexivel-universal-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('39', '1', '2026-06-27 00:00:00', '2026-06-27 03:00:00', 'Microfone de lapela com áudio limpo e profissional. Plug P2, compatível com celular, PC e câmeras. Ótimo para gravar vídeos e reuniões.', 'Microfone Lapela Profissional', 'Microfone de lapela com áudio limpo e profissional. Plug P2, compatível com celular, PC e câmeras. Ótimo para gravar vídeos e reuniões.', 'publish', 'closed', 'closed', '', 'microfone-lapela-profissional-2', '', '', '2026-06-27 00:00:00', '2026-06-27 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/microfone-lapela-profissional-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('40', '1', '2026-06-26 00:00:00', '2026-06-26 03:00:00', 'Transforma seu celular em uma câmera profissional para fotos macro. Encoste a lente na câmera do celular e capture detalhes incríveis.', 'Lente Macro para Celular', 'Transforma seu celular em uma câmera profissional para fotos macro. Encoste a lente na câmera do celular e capture detalhes incríveis.', 'publish', 'closed', 'closed', '', 'lente-macro-para-celular-2', '', '', '2026-06-26 00:00:00', '2026-06-26 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/lente-macro-para-celular-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('41', '1', '2026-06-25 00:00:00', '2026-06-25 03:00:00', 'Suporte articulado com braço flexível, perfeito para assistir vídeos, fazer chamadas de vídeo ou trabalhar com as mãos livres.', 'Suporte Articulado para Celular', 'Suporte articulado com braço flexível, perfeito para assistir vídeos, fazer chamadas de vídeo ou trabalhar com as mãos livres.', 'publish', 'closed', 'closed', '', 'suporte-articulado-para-celular-2', '', '', '2026-06-25 00:00:00', '2026-06-25 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/suporte-articulado-para-celular-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('42', '1', '2026-06-24 00:00:00', '2026-06-24 03:00:00', 'Powerbank slim e leve, carregamento rápido 2.1A, entrada USB-C e dupla saída USB. Carregue dois dispositivos ao mesmo tempo.', 'Powerbank Slim 10000mAh', 'Powerbank slim e leve, carregamento rápido 2.1A, entrada USB-C e dupla saída USB. Carregue dois dispositivos ao mesmo tempo.', 'publish', 'closed', 'closed', '', 'powerbank-slim-10000mah-2', '', '', '2026-06-24 00:00:00', '2026-06-24 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/powerbank-slim-10000mah-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('43', '1', '2026-06-23 00:00:00', '2026-06-23 03:00:00', 'Kit com 24 chaves de precisão para manutenção de eletrônicos, celulares, notebooks, óculos e consoles. Estojo organizador incluso.', 'Kit Chaves de Precisão', 'Kit com 24 chaves de precisão para manutenção de eletrônicos, celulares, notebooks, óculos e consoles. Estojo organizador incluso.', 'publish', 'closed', 'closed', '', 'kit-chaves-de-precisao-2', '', '', '2026-06-23 00:00:00', '2026-06-23 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/kit-chaves-de-precisao-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('44', '1', '2026-06-22 00:00:00', '2026-06-22 03:00:00', 'Multímetro digital para medir tensão, corrente, resistência e continuidade. Essencial para quem trabalha com eletrônica e elétrica.', 'Multímetro Digital Portátil', 'Multímetro digital para medir tensão, corrente, resistência e continuidade. Essencial para quem trabalha com eletrônica e elétrica.', 'publish', 'closed', 'closed', '', 'multimetro-digital-portatil-2', '', '', '2026-06-22 00:00:00', '2026-06-22 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/multimetro-digital-portatil-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('45', '1', '2026-06-21 00:00:00', '2026-06-21 03:00:00', 'Pasta térmica de alta performance para melhorar a dissipação de calor em CPUs e GPUs. Reduz a temperatura do processador em até 10°C.', 'Pasta Térmica para Processador', 'Pasta térmica de alta performance para melhorar a dissipação de calor em CPUs e GPUs. Reduz a temperatura do processador em até 10°C.', 'publish', 'closed', 'closed', '', 'pasta-termica-para-processador-2', '', '', '2026-06-21 00:00:00', '2026-06-21 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/pasta-termica-para-processador-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('46', '1', '2026-06-20 00:00:00', '2026-06-20 03:00:00', 'Tapete magnético com borda elevada para organizar parafusos e peças pequenas durante reparos. Evita perder peças.', 'Suporte Magnético para Parafusos', 'Tapete magnético com borda elevada para organizar parafusos e peças pequenas durante reparos. Evita perder peças.', 'publish', 'closed', 'closed', '', 'suporte-magnetico-para-parafusos-2', '', '', '2026-06-20 00:00:00', '2026-06-20 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/suporte-magnetico-para-parafusos-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('47', '1', '2026-06-19 00:00:00', '2026-06-19 03:00:00', 'Kit completo com spray, pincel, flanela e hastes flexíveis para limpeza de teclados, câmeras, celulares e notebooks.', 'Kit Limpeza para Eletrônicos', 'Kit completo com spray, pincel, flanela e hastes flexíveis para limpeza de teclados, câmeras, celulares e notebooks.', 'publish', 'closed', 'closed', '', 'kit-limpeza-para-eletronicos-2', '', '', '2026-06-19 00:00:00', '2026-06-19 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/kit-limpeza-para-eletronicos-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('48', '1', '2026-06-18 00:00:00', '2026-06-18 03:00:00', 'Mini projetor portátil compatível com celular, notebook e TV Box. Transforme qualquer parede em uma tela gigante. Resolução HD suportada.', 'Mini Projetor Portátil LED', 'Mini projetor portátil compatível com celular, notebook e TV Box. Transforme qualquer parede em uma tela gigante. Resolução HD suportada.', 'publish', 'closed', 'closed', '', 'mini-projetor-portatil-led-2', '', '', '2026-06-18 00:00:00', '2026-06-18 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-projetor-portatil-led-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('49', '1', '2026-06-17 00:00:00', '2026-06-17 03:00:00', 'Caneta digital com ponta precisa para tablets e celulares. Ótima para anotações, desenhos e navegação. Palm rejection incluído.', 'Caneta Touch para Tablet', 'Caneta digital com ponta precisa para tablets e celulares. Ótima para anotações, desenhos e navegação. Palm rejection incluído.', 'publish', 'closed', 'closed', '', 'caneta-touch-para-tablet-2', '', '', '2026-06-17 00:00:00', '2026-06-17 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/caneta-touch-para-tablet-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('50', '1', '2026-06-16 00:00:00', '2026-06-16 03:00:00', 'Sensor de movimento USB que acende automaticamente ao detectar presença. Ideal para corredor, banheiro ou escada. Plug and play.', 'Sensor de Presença USB', 'Sensor de movimento USB que acende automaticamente ao detectar presença. Ideal para corredor, banheiro ou escada. Plug and play.', 'publish', 'closed', 'closed', '', 'sensor-de-presenca-usb-2', '', '', '2026-06-16 00:00:00', '2026-06-16 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/sensor-de-presenca-usb-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('51', '1', '2026-06-15 00:00:00', '2026-06-15 03:00:00', 'Mini teclado sem fio com touchpad, perfeito para Smart TVs, TV Box, PCs e projetores. Conexão 2.4GHz, alcance de 10m.', 'Mini Teclado Wireless', 'Mini teclado sem fio com touchpad, perfeito para Smart TVs, TV Box, PCs e projetores. Conexão 2.4GHz, alcance de 10m.', 'publish', 'closed', 'closed', '', 'mini-teclado-wireless-2', '', '', '2026-06-15 00:00:00', '2026-06-15 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-teclado-wireless-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('52', '1', '2026-06-14 00:00:00', '2026-06-14 03:00:00', 'Luz RGB que acende quando chega mensagem ou notificação no celular. Conecta via Bluetooth e personaliza as cores por app.', 'Luz de Notificação RGB USB', 'Luz RGB que acende quando chega mensagem ou notificação no celular. Conecta via Bluetooth e personaliza as cores por app.', 'publish', 'closed', 'closed', '', 'luz-de-notificacao-rgb-usb-2', '', '', '2026-06-14 00:00:00', '2026-06-14 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/luz-de-notificacao-rgb-usb-2/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('53', '0', '2026-07-06 23:11:19', '2026-07-07 02:11:19', '<h2>Quem Somos</h2>\n\n<p>O <strong>Blog Ideiasti</strong> é uma plataforma educacional dedicada ao universo da Qualidade de Software e Testes de Software. Nascemos com o propósito de democratizar o conhecimento sobre QA, tornando acessível a profissionais, estudantes e empresas as melhores práticas e tendências do mercado.</p>\n\n<p>Nossa missão é <strong>transformar a forma como pensamos e praticamos a qualidade de software</strong>, contribuindo para a formação de profissionais mais capacitados e organizações mais competitivas.</p>\n\n<hr>\n<h2>Nossa História</h2>\n\n<h3>O Início</h3>\n\n<p>O Blog Ideiasti surgiu da necessidade de centralizar conteúdo de qualidade sobre Quality Assurance em português. Enquanto existiam diversos recursos em inglês, a comunidade brasileira carecia de uma fonte confiável e atualizada.</p>\n\n<h3>Nossa Evolução</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ano</th><th>Marco</th></tr>\n<tr><td><strong>2024</strong></td><td>Fundação do Blog Ideiasti</td></tr>\n<tr><td><strong>2024</strong></td><td>Primeiros 10 artigos publicados</td></tr>\n<tr><td><strong>2025</strong></td><td>Expansão para 40+ artigos especializados</td></tr>\n<tr><td><strong>2026</strong></td><td>Conteúdo contínuo e comunidade ativa</td></tr>\n</table></figure>\n\n<h3>Nossa Visão</h3>\n\n<p>Ser a <strong>principal referência em Qualidade de Software em português</strong>, abrangendo desde conceitos fundamentais até técnicas avançadas e emergentes.</p>\n\n<hr>\n<h2>O Que Oferecemos</h2>\n\n<h3>Conteúdo Especializado</h3>\n\n<p>Produzimos conteúdo educacional em diversas áreas:</p>\n\n<ul><li><strong>Fundamentos de QA</strong> — Conceitos, metodologias e padrões</li><ol><li><strong>Automação de Testes</strong> — Frameworks, ferramentas e estratégias</li>\n<li><strong>Testes Ágeis</strong> — Scrum, Kanban, XP e práticas DevOps</li>\n<li><strong>Testes de Performance</strong> — Load, stress e endurance testing</li>\n<li><strong>Testes de Segurança</strong> — OWASP, penetration testing</li>\n<li><strong>Tendências</strong> — IA, GenAI, continuous testing</li>\n</ol>\n<h3>Nossos Diferenciais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Diferencial</th><th>Descrição</th></tr>\n<tr><td><strong>Profundo</strong></td><td>Artigos técnicos detalhados e atualizados</td></tr>\n<tr><td><strong>Prático</strong></td><td>Exemplos reais e casos de uso</td></tr>\n<tr><td><strong>Atualizado</strong></td><td>Conteúdo alinhado com as tendências do mercado</td></tr>\n<tr><td><strong>Gratuito</strong></td><td>Todo conteúdo acessível sem custo</td></tr>\n<tr><td><strong>Em Português</strong></td><td>Linguagem nativa para brasileiros</td></tr>\n</table></figure>\n\n<hr>\n<h2>Metodologia de Conteúdo</h2>\n\n<h3>Como Criamos Artigos</h3>\n\n<p>Nosso processo editorial:<br><ol><li><strong>Pesquisa</strong> — Fontes confiáveis e atualizadas</li><br><li><strong>Estruturação</strong> — Organização lógica e didática</li><br><li><strong>Revisão</strong> — Verificação técnica e editorial</li><br><li><strong>Publicação</strong> — Formatação otimizada para SEO</li><br><li><strong>Atualização</strong> — Manutenção contínua do conteúdo</li><br></ol><br><h3>Nossas Fontes</h3></p>\n\n<p>Baseamos nosso conteúdo em:<br><ol><li><strong>Padrões Internacionais</strong> — ISO/IEC 25010, IEEE</li><br><li><strong>Frameworks Reconhecidos</strong> — ISTQB, CMMI</li><br><li><strong>Pesquisas de Mercado</strong> — Gartner, Forrester, World Quality Report</li><br><li><strong>Comunidade Técnica</strong> — Especialistas e profissionais do mercado</li><br><li><strong>Experiência Prática</strong> — Casos reais e melhores práticas</li><br></ol><br><hr><br><h2>Para Quem É o Blog</h2></p>\n\n<h3>Profissionais de TI</h3>\n\n<p>Se você é <strong>desenvolvedor, QA engineer, test analyst ou manager</strong>, encontrará:<br><ol><li>Estratégias avançadas de teste</li><br><li>Comparativos de ferramentas</li><br><li>Boas práticas de mercado</li><br><li>Preparação para certificações</li><br></ol><br><h3>Estudantes</h3></p>\n\n<p>Se você está <strong>aprendendo sobre QA</strong>, encontrará:<br><ol><li>Conceitos fundamentais explicados</li><br><li>Tutoriais passo a passo</li><br><li>Glossários e referências</li><br><li>Caminho de aprendizagem</li><br></ol><br><h3>Empresas</h3></p>\n\n<p>Se você representa uma <strong>empresa ou startup</strong>, encontrará:<br><ol><li>Cases de sucesso</li><br><li>ROI de qualidade de software</li><br><li>Estratégias de implementação</li><br><li>Métricas e KPIs</li></ol></ul></p>\n\n<hr>\n<h2>Entre em Contato</h2>\n\n<p>Estamos sempre abertos para ouvir você:</p>\n\n<p><strong>Blog Ideiasti</strong><br>E-mail: contato@ideiasti.com<br>Website: www.ideiasti.com</p>\n\n<hr>\n<h2>Junte-se a Nós</h2>\n\n<p>A qualidade de software é uma <strong>jornada, não um destino</strong>. Comece hoje mesmo a explorar nosso conteúdo e faça parte da nossa comunidade.</p>\n\n<p><strong>Obrigado por escolher o Blog Ideiasti como seu guia em Qualidade de Software!</strong></p>\n\n<hr>\n<em>Última atualização: Julho de 2026</em>', 'Sobre o Blog Ideiasti', '', 'publish', 'closed', 'closed', '', 'sobre', '', '', '2026-07-06 23:11:19', '2026-07-07 02:11:19', '', '0', 'http://localhost/achadinhos/sobre/', '0', 'page', '', '0');
INSERT INTO `wp_posts` VALUES ('54', '1', '2026-07-03 01:46:20', '2026-07-03 04:46:20', '<h2>Termos de Uso</h2>\n<p>Ao acessar o ideiasti, você concorda com os seguintes termos:</p>\n<h3>Uso do Conteúdo</h3>\n<p>Todo o conteúdo publicado neste blog é para fins informativos e educacionais. Os artigos refletem a opinião dos autores e não constituem aconselhamento profissional.</p>\n<h3>Propriedade Intelectual</h3>\n<p>O conteúdo deste site é protegido por direitos autorais. É permitido compartilhar links para nossos artigos, mas a reprodução total ou parcial sem autorização é proibida.</p>\n<h3>Links de Afiliados</h3>\n<p>Este site pode conter links de afiliados. Isso significa que podemos receber uma comissão se você adquirir produtos através destes links, sem custo adicional para você.</p>\n<h3>Precisão das Informações</h3>\n<p>Nos esforçamos para manter as informações atualizadas e precisas, mas não garantimos a completeza ou atualidade do conteúdo.</p>\n<h3>Limitação de Responsabilidade</h3>\n<p>O ideiasti não se responsabiliza por danos decorrentes do uso das informações publicadas neste site.</p>\n<h3>Alterações</h3>\n<p>Estes termos podem ser atualizados periodicamente. Recomendamos revisá-los regularmente.</p>\n<p><em>Última atualização: Julho 2026</em></p>', 'Termos de Uso', '', 'publish', 'closed', 'closed', '', 'termos', '', '', '2026-07-05 01:12:10', '2026-07-05 04:12:10', '', '0', 'http://localhost/achadinhos/termos/', '0', 'page', '', '0');
INSERT INTO `wp_posts` VALUES ('56', '1', '2026-07-03 00:00:00', '2026-07-03 03:00:00', 'Perfeito para limpar teclado, notebook e mesa. Funciona via USB, super portátil e acompanha escova e borracha para limpeza profunda entre as teclas.', 'Mini Aspirador USB Portátil', 'Perfeito para limpar teclado, notebook e mesa. Funciona via USB, super portátil e acompanha escova e borracha para limpeza profunda entre as teclas.', 'publish', 'closed', 'closed', '', 'mini-aspirador-usb-portatil-3', '', '', '2026-07-03 00:00:00', '2026-07-03 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-aspirador-usb-portatil-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('57', '1', '2026-07-02 00:00:00', '2026-07-02 03:00:00', 'Carregamento rápido com conexão magnética. Compatível com USB-C, Micro USB e Lightning. Ideal para quem usa vários dispositivos.', 'Cabo Magnético 3 em 1', 'Carregamento rápido com conexão magnética. Compatível com USB-C, Micro USB e Lightning. Ideal para quem usa vários dispositivos.', 'publish', 'closed', 'closed', '', 'cabo-magnetico-3-em-1-3', '', '', '2026-07-02 00:00:00', '2026-07-02 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/cabo-magnetico-3-em-1-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('58', '1', '2026-07-01 00:00:00', '2026-07-01 03:00:00', 'Ventilador compacto e silencioso, perfeito para usar no PC, notebook ou escrivaninha. Ideal para dias quentes no home office.', 'Mini Ventilador USB Silencioso', 'Ventilador compacto e silencioso, perfeito para usar no PC, notebook ou escrivaninha. Ideal para dias quentes no home office.', 'publish', 'closed', 'closed', '', 'mini-ventilador-usb-silencioso-3', '', '', '2026-07-01 00:00:00', '2026-07-01 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-ventilador-usb-silencioso-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('59', '1', '2026-06-30 00:00:00', '2026-06-30 03:00:00', 'Controle por app, compatível com Alexa e Google Home. 16 milhões de cores, dimerizável e programável. Transforme seu ambiente.', 'Lâmpada Inteligente Wi-Fi', 'Controle por app, compatível com Alexa e Google Home. 16 milhões de cores, dimerizável e programável. Transforme seu ambiente.', 'publish', 'closed', 'closed', '', 'lampada-inteligente-wi-fi-3', '', '', '2026-06-30 00:00:00', '2026-06-30 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/lampada-inteligente-wi-fi-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('60', '1', '2026-06-29 00:00:00', '2026-06-29 03:00:00', 'Fita de LED RGB com controle remoto, perfeita para dar um visual gamer ao seu setup. Cola na parte de trás da mesa, monitor ou estante.', 'Fita LED RGB para Setup', 'Fita de LED RGB com controle remoto, perfeita para dar um visual gamer ao seu setup. Cola na parte de trás da mesa, monitor ou estante.', 'publish', 'closed', 'closed', '', 'fita-led-rgb-para-setup-3', '', '', '2026-06-29 00:00:00', '2026-06-29 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/fita-led-rgb-para-setup-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('61', '1', '2026-06-28 00:00:00', '2026-06-28 03:00:00', 'Tripé flexível com pernas articuláveis, ideal para gravar vídeos, lives, fotos e reuniões. Compatível com celular e câmeras compactas.', 'Tripé Flexível Universal', 'Tripé flexível com pernas articuláveis, ideal para gravar vídeos, lives, fotos e reuniões. Compatível com celular e câmeras compactas.', 'publish', 'closed', 'closed', '', 'tripe-flexivel-universal-3', '', '', '2026-06-28 00:00:00', '2026-06-28 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/tripe-flexivel-universal-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('62', '1', '2026-06-27 00:00:00', '2026-06-27 03:00:00', 'Microfone de lapela com áudio limpo e profissional. Plug P2, compatível com celular, PC e câmeras. Ótimo para gravar vídeos e reuniões.', 'Microfone Lapela Profissional', 'Microfone de lapela com áudio limpo e profissional. Plug P2, compatível com celular, PC e câmeras. Ótimo para gravar vídeos e reuniões.', 'publish', 'closed', 'closed', '', 'microfone-lapela-profissional-3', '', '', '2026-06-27 00:00:00', '2026-06-27 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/microfone-lapela-profissional-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('63', '1', '2026-06-26 00:00:00', '2026-06-26 03:00:00', 'Transforma seu celular em uma câmera profissional para fotos macro. Encoste a lente na câmera do celular e capture detalhes incríveis.', 'Lente Macro para Celular', 'Transforma seu celular em uma câmera profissional para fotos macro. Encoste a lente na câmera do celular e capture detalhes incríveis.', 'publish', 'closed', 'closed', '', 'lente-macro-para-celular-3', '', '', '2026-06-26 00:00:00', '2026-06-26 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/lente-macro-para-celular-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('64', '1', '2026-06-25 00:00:00', '2026-06-25 03:00:00', 'Suporte articulado com braço flexível, perfeito para assistir vídeos, fazer chamadas de vídeo ou trabalhar com as mãos livres.', 'Suporte Articulado para Celular', 'Suporte articulado com braço flexível, perfeito para assistir vídeos, fazer chamadas de vídeo ou trabalhar com as mãos livres.', 'publish', 'closed', 'closed', '', 'suporte-articulado-para-celular-3', '', '', '2026-06-25 00:00:00', '2026-06-25 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/suporte-articulado-para-celular-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('65', '1', '2026-06-24 00:00:00', '2026-06-24 03:00:00', 'Powerbank slim e leve, carregamento rápido 2.1A, entrada USB-C e dupla saída USB. Carregue dois dispositivos ao mesmo tempo.', 'Powerbank Slim 10000mAh', 'Powerbank slim e leve, carregamento rápido 2.1A, entrada USB-C e dupla saída USB. Carregue dois dispositivos ao mesmo tempo.', 'publish', 'closed', 'closed', '', 'powerbank-slim-10000mah-3', '', '', '2026-06-24 00:00:00', '2026-06-24 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/powerbank-slim-10000mah-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('66', '1', '2026-06-23 00:00:00', '2026-06-23 03:00:00', 'Kit com 24 chaves de precisão para manutenção de eletrônicos, celulares, notebooks, óculos e consoles. Estojo organizador incluso.', 'Kit Chaves de Precisão', 'Kit com 24 chaves de precisão para manutenção de eletrônicos, celulares, notebooks, óculos e consoles. Estojo organizador incluso.', 'publish', 'closed', 'closed', '', 'kit-chaves-de-precisao-3', '', '', '2026-06-23 00:00:00', '2026-06-23 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/kit-chaves-de-precisao-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('67', '1', '2026-06-22 00:00:00', '2026-06-22 03:00:00', 'Multímetro digital para medir tensão, corrente, resistência e continuidade. Essencial para quem trabalha com eletrônica e elétrica.', 'Multímetro Digital Portátil', 'Multímetro digital para medir tensão, corrente, resistência e continuidade. Essencial para quem trabalha com eletrônica e elétrica.', 'publish', 'closed', 'closed', '', 'multimetro-digital-portatil-3', '', '', '2026-06-22 00:00:00', '2026-06-22 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/multimetro-digital-portatil-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('68', '1', '2026-06-21 00:00:00', '2026-06-21 03:00:00', 'Pasta térmica de alta performance para melhorar a dissipação de calor em CPUs e GPUs. Reduz a temperatura do processador em até 10°C.', 'Pasta Térmica para Processador', 'Pasta térmica de alta performance para melhorar a dissipação de calor em CPUs e GPUs. Reduz a temperatura do processador em até 10°C.', 'publish', 'closed', 'closed', '', 'pasta-termica-para-processador-3', '', '', '2026-06-21 00:00:00', '2026-06-21 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/pasta-termica-para-processador-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('69', '1', '2026-06-20 00:00:00', '2026-06-20 03:00:00', 'Tapete magnético com borda elevada para organizar parafusos e peças pequenas durante reparos. Evita perder peças.', 'Suporte Magnético para Parafusos', 'Tapete magnético com borda elevada para organizar parafusos e peças pequenas durante reparos. Evita perder peças.', 'publish', 'closed', 'closed', '', 'suporte-magnetico-para-parafusos-3', '', '', '2026-06-20 00:00:00', '2026-06-20 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/suporte-magnetico-para-parafusos-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('70', '1', '2026-06-19 00:00:00', '2026-06-19 03:00:00', 'Kit completo com spray, pincel, flanela e hastes flexíveis para limpeza de teclados, câmeras, celulares e notebooks.', 'Kit Limpeza para Eletrônicos', 'Kit completo com spray, pincel, flanela e hastes flexíveis para limpeza de teclados, câmeras, celulares e notebooks.', 'publish', 'closed', 'closed', '', 'kit-limpeza-para-eletronicos-3', '', '', '2026-06-19 00:00:00', '2026-06-19 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/kit-limpeza-para-eletronicos-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('71', '1', '2026-06-18 00:00:00', '2026-06-18 03:00:00', 'Mini projetor portátil compatível com celular, notebook e TV Box. Transforme qualquer parede em uma tela gigante. Resolução HD suportada.', 'Mini Projetor Portátil LED', 'Mini projetor portátil compatível com celular, notebook e TV Box. Transforme qualquer parede em uma tela gigante. Resolução HD suportada.', 'publish', 'closed', 'closed', '', 'mini-projetor-portatil-led-3', '', '', '2026-06-18 00:00:00', '2026-06-18 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-projetor-portatil-led-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('72', '1', '2026-06-17 00:00:00', '2026-06-17 03:00:00', 'Caneta digital com ponta precisa para tablets e celulares. Ótima para anotações, desenhos e navegação. Palm rejection incluído.', 'Caneta Touch para Tablet', 'Caneta digital com ponta precisa para tablets e celulares. Ótima para anotações, desenhos e navegação. Palm rejection incluído.', 'publish', 'closed', 'closed', '', 'caneta-touch-para-tablet-3', '', '', '2026-06-17 00:00:00', '2026-06-17 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/caneta-touch-para-tablet-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('73', '1', '2026-06-16 00:00:00', '2026-06-16 03:00:00', 'Sensor de movimento USB que acende automaticamente ao detectar presença. Ideal para corredor, banheiro ou escada. Plug and play.', 'Sensor de Presença USB', 'Sensor de movimento USB que acende automaticamente ao detectar presença. Ideal para corredor, banheiro ou escada. Plug and play.', 'publish', 'closed', 'closed', '', 'sensor-de-presenca-usb-3', '', '', '2026-06-16 00:00:00', '2026-06-16 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/sensor-de-presenca-usb-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('74', '1', '2026-06-15 00:00:00', '2026-06-15 03:00:00', 'Mini teclado sem fio com touchpad, perfeito para Smart TVs, TV Box, PCs e projetores. Conexão 2.4GHz, alcance de 10m.', 'Mini Teclado Wireless', 'Mini teclado sem fio com touchpad, perfeito para Smart TVs, TV Box, PCs e projetores. Conexão 2.4GHz, alcance de 10m.', 'publish', 'closed', 'closed', '', 'mini-teclado-wireless-3', '', '', '2026-06-15 00:00:00', '2026-06-15 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-teclado-wireless-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('75', '1', '2026-06-14 00:00:00', '2026-06-14 03:00:00', 'Luz RGB que acende quando chega mensagem ou notificação no celular. Conecta via Bluetooth e personaliza as cores por app.', 'Luz de Notificação RGB USB', 'Luz RGB que acende quando chega mensagem ou notificação no celular. Conecta via Bluetooth e personaliza as cores por app.', 'publish', 'closed', 'closed', '', 'luz-de-notificacao-rgb-usb-3', '', '', '2026-06-14 00:00:00', '2026-06-14 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/luz-de-notificacao-rgb-usb-3/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('76', '1', '2026-07-03 02:19:02', '2026-07-03 05:19:02', 'Picsum ID: 901', 'Picsum ID: 901', '', 'inherit', 'open', 'closed', '', 'picsum-id-901', '', '', '2026-07-03 02:19:02', '2026-07-03 05:19:02', '', '9', 'http://localhost/achadinhos/wp-content/uploads/2026/07/achadinho-9.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('77', '1', '2026-07-03 02:19:04', '2026-07-03 05:19:04', 'Picsum ID: 966', 'Picsum ID: 966', '', 'inherit', 'open', 'closed', '', 'picsum-id-966', '', '', '2026-07-03 02:19:04', '2026-07-03 05:19:04', '', '33', 'http://localhost/achadinhos/wp-content/uploads/2026/07/achadinho-33.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('78', '1', '2026-07-03 02:19:05', '2026-07-03 05:19:05', 'Picsum ID: 441', 'Picsum ID: 441', '', 'inherit', 'open', 'closed', '', 'picsum-id-441', '', '', '2026-07-03 02:19:05', '2026-07-03 05:19:05', '', '56', 'http://localhost/achadinhos/wp-content/uploads/2026/07/achadinho-56.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('79', '1', '2026-07-03 02:19:06', '2026-07-03 05:19:06', 'Picsum ID: 1059', 'Picsum ID: 1059', '', 'inherit', 'open', 'closed', '', 'picsum-id-1059', '', '', '2026-07-03 02:19:06', '2026-07-03 05:19:06', '', '10', 'http://localhost/achadinhos/wp-content/uploads/2026/07/achadinho-10.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('80', '1', '2026-07-03 02:19:08', '2026-07-03 05:19:08', 'Picsum ID: 853', 'Picsum ID: 853', '', 'inherit', 'open', 'closed', '', 'picsum-id-853', '', '', '2026-07-03 02:19:08', '2026-07-03 05:19:08', '', '34', 'http://localhost/achadinhos/wp-content/uploads/2026/07/achadinho-34.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('81', '1', '2026-07-03 02:19:09', '2026-07-03 05:19:09', 'Picsum ID: 928', 'Picsum ID: 928', '', 'inherit', 'open', 'closed', '', 'picsum-id-928', '', '', '2026-07-03 02:19:09', '2026-07-03 05:19:09', '', '57', 'http://localhost/achadinhos/wp-content/uploads/2026/07/achadinho-57.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('82', '1', '2026-07-03 02:19:10', '2026-07-03 05:19:10', 'Picsum ID: 135', 'Picsum ID: 135', '', 'inherit', 'open', 'closed', '', 'picsum-id-135', '', '', '2026-07-03 02:19:10', '2026-07-03 05:19:10', '', '11', 'http://localhost/achadinhos/wp-content/uploads/2026/07/achadinho-11.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('83', '1', '2026-07-03 02:19:11', '2026-07-03 05:19:11', 'Picsum ID: 556', 'Picsum ID: 556', '', 'inherit', 'open', 'closed', '', 'picsum-id-556', '', '', '2026-07-03 02:19:11', '2026-07-03 05:19:11', '', '35', 'http://localhost/achadinhos/wp-content/uploads/2026/07/achadinho-35.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('84', '1', '2026-07-03 02:19:13', '2026-07-03 05:19:13', 'Picsum ID: 430', 'Picsum ID: 430', '', 'inherit', 'open', 'closed', '', 'picsum-id-430', '', '', '2026-07-03 02:19:13', '2026-07-03 05:19:13', '', '58', 'http://localhost/achadinhos/wp-content/uploads/2026/07/achadinho-58.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('85', '1', '2026-07-03 02:19:14', '2026-07-03 05:19:14', 'Picsum ID: 800', 'Picsum ID: 800', '', 'inherit', 'open', 'closed', '', 'picsum-id-800', '', '', '2026-07-03 02:19:14', '2026-07-03 05:19:14', '', '12', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-12.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('86', '1', '2026-07-03 02:19:15', '2026-07-03 05:19:15', 'Picsum ID: 631', 'Picsum ID: 631', '', 'inherit', 'open', 'closed', '', 'picsum-id-631', '', '', '2026-07-03 02:19:15', '2026-07-03 05:19:15', '', '36', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-36.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('87', '1', '2026-07-03 02:19:17', '2026-07-03 05:19:17', 'Picsum ID: 313', 'Picsum ID: 313', '', 'inherit', 'open', 'closed', '', 'picsum-id-313', '', '', '2026-07-03 02:19:17', '2026-07-03 05:19:17', '', '59', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-59.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('88', '1', '2026-07-03 02:19:18', '2026-07-03 05:19:18', 'Picsum ID: 213', 'Picsum ID: 213', '', 'inherit', 'open', 'closed', '', 'picsum-id-213', '', '', '2026-07-03 02:19:18', '2026-07-03 05:19:18', '', '13', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-13.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('89', '1', '2026-07-03 02:19:20', '2026-07-03 05:19:20', 'Picsum ID: 164', 'Picsum ID: 164', '', 'inherit', 'open', 'closed', '', 'picsum-id-164', '', '', '2026-07-03 02:19:20', '2026-07-03 05:19:20', '', '37', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-37.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('90', '1', '2026-07-03 02:19:21', '2026-07-03 05:19:21', 'Picsum ID: 534', 'Picsum ID: 534', '', 'inherit', 'open', 'closed', '', 'picsum-id-534', '', '', '2026-07-03 02:19:21', '2026-07-03 05:19:21', '', '60', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-60.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('91', '1', '2026-07-03 02:19:23', '2026-07-03 05:19:23', 'Picsum ID: 623', 'Picsum ID: 623', '', 'inherit', 'open', 'closed', '', 'picsum-id-623', '', '', '2026-07-03 02:19:23', '2026-07-03 05:19:23', '', '14', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-14.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('92', '1', '2026-07-03 02:19:24', '2026-07-03 05:19:24', 'Picsum ID: 1050', 'Picsum ID: 1050', '', 'inherit', 'open', 'closed', '', 'picsum-id-1050', '', '', '2026-07-03 02:19:24', '2026-07-03 05:19:24', '', '38', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-38.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('93', '1', '2026-07-03 02:19:25', '2026-07-03 05:19:25', 'Picsum ID: 377', 'Picsum ID: 377', '', 'inherit', 'open', 'closed', '', 'picsum-id-377', '', '', '2026-07-03 02:19:25', '2026-07-03 05:19:25', '', '61', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-61.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('94', '1', '2026-07-03 02:19:27', '2026-07-03 05:19:27', 'Picsum ID: 485', 'Picsum ID: 485', '', 'inherit', 'open', 'closed', '', 'picsum-id-485', '', '', '2026-07-03 02:19:27', '2026-07-03 05:19:27', '', '15', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-15.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('95', '1', '2026-07-03 02:19:28', '2026-07-03 05:19:28', 'Picsum ID: 856', 'Picsum ID: 856', '', 'inherit', 'open', 'closed', '', 'picsum-id-856', '', '', '2026-07-03 02:19:28', '2026-07-03 05:19:28', '', '39', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-39.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('96', '1', '2026-07-03 02:19:29', '2026-07-03 05:19:29', 'Picsum ID: 1014', 'Picsum ID: 1014', '', 'inherit', 'open', 'closed', '', 'picsum-id-1014', '', '', '2026-07-03 02:19:29', '2026-07-03 05:19:29', '', '62', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-62.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('97', '1', '2026-07-03 02:19:31', '2026-07-03 05:19:31', 'Picsum ID: 147', 'Picsum ID: 147', '', 'inherit', 'open', 'closed', '', 'picsum-id-147', '', '', '2026-07-03 02:19:31', '2026-07-03 05:19:31', '', '16', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-16.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('98', '1', '2026-07-03 02:19:32', '2026-07-03 05:19:32', 'Picsum ID: 497', 'Picsum ID: 497', '', 'inherit', 'open', 'closed', '', 'picsum-id-497', '', '', '2026-07-03 02:19:32', '2026-07-03 05:19:32', '', '40', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-40.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('99', '1', '2026-07-03 02:19:34', '2026-07-03 05:19:34', 'Picsum ID: 389', 'Picsum ID: 389', '', 'inherit', 'open', 'closed', '', 'picsum-id-389', '', '', '2026-07-03 02:19:34', '2026-07-03 05:19:34', '', '63', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-63.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('100', '1', '2026-07-03 02:19:35', '2026-07-03 05:19:35', 'Picsum ID: 16', 'Picsum ID: 16', '', 'inherit', 'open', 'closed', '', 'picsum-id-16', '', '', '2026-07-03 02:19:35', '2026-07-03 05:19:35', '', '17', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-17.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('101', '1', '2026-07-03 02:19:37', '2026-07-03 05:19:37', 'Picsum ID: 791', 'Picsum ID: 791', '', 'inherit', 'open', 'closed', '', 'picsum-id-791', '', '', '2026-07-03 02:19:37', '2026-07-03 05:19:37', '', '41', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-41.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('102', '1', '2026-07-03 02:19:38', '2026-07-03 05:19:38', 'Picsum ID: 94', 'Picsum ID: 94', '', 'inherit', 'open', 'closed', '', 'picsum-id-94', '', '', '2026-07-03 02:19:38', '2026-07-03 05:19:38', '', '64', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-64.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('103', '1', '2026-07-03 02:19:40', '2026-07-03 05:19:40', 'Picsum ID: 528', 'Picsum ID: 528', '', 'inherit', 'open', 'closed', '', 'picsum-id-528', '', '', '2026-07-03 02:19:40', '2026-07-03 05:19:40', '', '18', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-18.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('104', '1', '2026-07-03 02:19:41', '2026-07-03 05:19:41', 'Picsum ID: 420', 'Picsum ID: 420', '', 'inherit', 'open', 'closed', '', 'picsum-id-420', '', '', '2026-07-03 02:19:41', '2026-07-03 05:19:41', '', '42', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-42.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('105', '1', '2026-07-03 02:19:42', '2026-07-03 05:19:42', 'Picsum ID: 786', 'Picsum ID: 786', '', 'inherit', 'open', 'closed', '', 'picsum-id-786', '', '', '2026-07-03 02:19:42', '2026-07-03 05:19:42', '', '65', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-65.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('106', '1', '2026-07-03 02:19:44', '2026-07-03 05:19:44', 'Picsum ID: 497', 'Picsum ID: 497', '', 'inherit', 'open', 'closed', '', 'picsum-id-497-2', '', '', '2026-07-03 02:19:44', '2026-07-03 05:19:44', '', '19', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-19.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('107', '1', '2026-07-03 02:19:45', '2026-07-03 05:19:45', 'Picsum ID: 876', 'Picsum ID: 876', '', 'inherit', 'open', 'closed', '', 'picsum-id-876', '', '', '2026-07-03 02:19:45', '2026-07-03 05:19:45', '', '43', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-43.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('108', '1', '2026-07-03 02:19:46', '2026-07-03 05:19:46', 'Picsum ID: 212', 'Picsum ID: 212', '', 'inherit', 'open', 'closed', '', 'picsum-id-212', '', '', '2026-07-03 02:19:46', '2026-07-03 05:19:46', '', '66', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-66.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('109', '1', '2026-07-03 02:19:48', '2026-07-03 05:19:48', 'Picsum ID: 717', 'Picsum ID: 717', '', 'inherit', 'open', 'closed', '', 'picsum-id-717', '', '', '2026-07-03 02:19:48', '2026-07-03 05:19:48', '', '20', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-20.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('110', '1', '2026-07-03 02:19:49', '2026-07-03 05:19:49', 'Picsum ID: 1028', 'Picsum ID: 1028', '', 'inherit', 'open', 'closed', '', 'picsum-id-1028', '', '', '2026-07-03 02:19:49', '2026-07-03 05:19:49', '', '44', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-44.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('111', '1', '2026-07-03 02:19:50', '2026-07-03 05:19:50', 'Picsum ID: 17', 'Picsum ID: 17', '', 'inherit', 'open', 'closed', '', 'picsum-id-17', '', '', '2026-07-03 02:19:50', '2026-07-03 05:19:50', '', '67', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-67.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('112', '1', '2026-07-03 02:19:52', '2026-07-03 05:19:52', 'Picsum ID: 809', 'Picsum ID: 809', '', 'inherit', 'open', 'closed', '', 'picsum-id-809', '', '', '2026-07-03 02:19:52', '2026-07-03 05:19:52', '', '21', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-21.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('113', '1', '2026-07-03 02:19:53', '2026-07-03 05:19:53', 'Picsum ID: 1049', 'Picsum ID: 1049', '', 'inherit', 'open', 'closed', '', 'picsum-id-1049', '', '', '2026-07-03 02:19:53', '2026-07-03 05:19:53', '', '45', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-45.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('114', '1', '2026-07-03 02:19:54', '2026-07-03 05:19:54', 'Picsum ID: 482', 'Picsum ID: 482', '', 'inherit', 'open', 'closed', '', 'picsum-id-482', '', '', '2026-07-03 02:19:54', '2026-07-03 05:19:54', '', '68', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-68.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('115', '1', '2026-07-03 02:19:56', '2026-07-03 05:19:56', 'Picsum ID: 508', 'Picsum ID: 508', '', 'inherit', 'open', 'closed', '', 'picsum-id-508', '', '', '2026-07-03 02:19:56', '2026-07-03 05:19:56', '', '22', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-22.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('116', '1', '2026-07-03 02:19:57', '2026-07-03 05:19:57', 'Picsum ID: 209', 'Picsum ID: 209', '', 'inherit', 'open', 'closed', '', 'picsum-id-209', '', '', '2026-07-03 02:19:57', '2026-07-03 05:19:57', '', '46', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-46.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('117', '1', '2026-07-03 02:19:58', '2026-07-03 05:19:58', 'Picsum ID: 415', 'Picsum ID: 415', '', 'inherit', 'open', 'closed', '', 'picsum-id-415', '', '', '2026-07-03 02:19:58', '2026-07-03 05:19:58', '', '69', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-69.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('118', '1', '2026-07-03 02:20:00', '2026-07-03 05:20:00', 'Picsum ID: 383', 'Picsum ID: 383', '', 'inherit', 'open', 'closed', '', 'picsum-id-383', '', '', '2026-07-03 02:20:00', '2026-07-03 05:20:00', '', '23', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-23.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('119', '1', '2026-07-03 02:20:01', '2026-07-03 05:20:01', 'Picsum ID: 136', 'Picsum ID: 136', '', 'inherit', 'open', 'closed', '', 'picsum-id-136', '', '', '2026-07-03 02:20:01', '2026-07-03 05:20:01', '', '47', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-47.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('120', '1', '2026-07-03 02:20:02', '2026-07-03 05:20:02', 'Picsum ID: 317', 'Picsum ID: 317', '', 'inherit', 'open', 'closed', '', 'picsum-id-317', '', '', '2026-07-03 02:20:02', '2026-07-03 05:20:02', '', '70', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-70.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('121', '1', '2026-07-03 02:20:04', '2026-07-03 05:20:04', 'Picsum ID: 876', 'Picsum ID: 876', '', 'inherit', 'open', 'closed', '', 'picsum-id-876-2', '', '', '2026-07-03 02:20:04', '2026-07-03 05:20:04', '', '24', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-24.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('122', '1', '2026-07-03 02:20:05', '2026-07-03 05:20:05', 'Picsum ID: 546', 'Picsum ID: 546', '', 'inherit', 'open', 'closed', '', 'picsum-id-546', '', '', '2026-07-03 02:20:05', '2026-07-03 05:20:05', '', '48', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-48.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('123', '1', '2026-07-03 02:20:06', '2026-07-03 05:20:06', 'Picsum ID: 520', 'Picsum ID: 520', '', 'inherit', 'open', 'closed', '', 'picsum-id-520', '', '', '2026-07-03 02:20:06', '2026-07-03 05:20:06', '', '71', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-71.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('124', '1', '2026-07-03 02:20:08', '2026-07-03 05:20:08', 'Picsum ID: 473', 'Picsum ID: 473', '', 'inherit', 'open', 'closed', '', 'picsum-id-473', '', '', '2026-07-03 02:20:08', '2026-07-03 05:20:08', '', '25', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-25.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('125', '1', '2026-07-03 02:20:09', '2026-07-03 05:20:09', 'Picsum ID: 212', 'Picsum ID: 212', '', 'inherit', 'open', 'closed', '', 'picsum-id-212-2', '', '', '2026-07-03 02:20:09', '2026-07-03 05:20:09', '', '49', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-49.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('126', '1', '2026-07-03 02:20:10', '2026-07-03 05:20:10', 'Picsum ID: 459', 'Picsum ID: 459', '', 'inherit', 'open', 'closed', '', 'picsum-id-459', '', '', '2026-07-03 02:20:10', '2026-07-03 05:20:10', '', '72', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-72.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('127', '1', '2026-07-03 02:20:12', '2026-07-03 05:20:12', 'Picsum ID: 682', 'Picsum ID: 682', '', 'inherit', 'open', 'closed', '', 'picsum-id-682', '', '', '2026-07-03 02:20:12', '2026-07-03 05:20:12', '', '26', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-26.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('128', '1', '2026-07-03 02:20:13', '2026-07-03 05:20:13', 'Picsum ID: 26', 'Picsum ID: 26', '', 'inherit', 'open', 'closed', '', 'picsum-id-26', '', '', '2026-07-03 02:20:13', '2026-07-03 05:20:13', '', '50', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-50.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('129', '1', '2026-07-03 02:20:14', '2026-07-03 05:20:14', 'Picsum ID: 1068', 'Picsum ID: 1068', '', 'inherit', 'open', 'closed', '', 'picsum-id-1068', '', '', '2026-07-03 02:20:14', '2026-07-03 05:20:14', '', '73', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-73.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('130', '1', '2026-07-03 02:20:16', '2026-07-03 05:20:16', 'Picsum ID: 926', 'Picsum ID: 926', '', 'inherit', 'open', 'closed', '', 'picsum-id-926', '', '', '2026-07-03 02:20:16', '2026-07-03 05:20:16', '', '27', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-27.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('131', '1', '2026-07-03 02:20:17', '2026-07-03 05:20:17', 'Picsum ID: 159', 'Picsum ID: 159', '', 'inherit', 'open', 'closed', '', 'picsum-id-159', '', '', '2026-07-03 02:20:17', '2026-07-03 05:20:17', '', '51', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-51.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('132', '1', '2026-07-03 02:20:18', '2026-07-03 05:20:18', 'Picsum ID: 570', 'Picsum ID: 570', '', 'inherit', 'open', 'closed', '', 'picsum-id-570', '', '', '2026-07-03 02:20:18', '2026-07-03 05:20:18', '', '74', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-74.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('133', '1', '2026-07-03 02:20:20', '2026-07-03 05:20:20', 'Picsum ID: 518', 'Picsum ID: 518', '', 'inherit', 'open', 'closed', '', 'picsum-id-518', '', '', '2026-07-03 02:20:20', '2026-07-03 05:20:20', '', '28', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-28.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('134', '1', '2026-07-03 02:20:21', '2026-07-03 05:20:21', 'Picsum ID: 103', 'Picsum ID: 103', '', 'inherit', 'open', 'closed', '', 'picsum-id-103', '', '', '2026-07-03 02:20:21', '2026-07-03 05:20:21', '', '52', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-52.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('135', '1', '2026-07-03 02:20:22', '2026-07-03 05:20:22', 'Picsum ID: 115', 'Picsum ID: 115', '', 'inherit', 'open', 'closed', '', 'picsum-id-115', '', '', '2026-07-03 02:20:22', '2026-07-03 05:20:22', '', '75', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-75.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('136', '1', '2026-07-03 00:00:00', '2026-07-03 03:00:00', 'Perfeito para limpar teclado, notebook e mesa. Funciona via USB, super portátil e acompanha escova e borracha para limpeza profunda entre as teclas.', 'Mini Aspirador USB Portátil', 'Perfeito para limpar teclado, notebook e mesa. Funciona via USB, super portátil e acompanha escova e borracha para limpeza profunda entre as teclas.', 'publish', 'closed', 'closed', '', 'mini-aspirador-usb-portatil-4', '', '', '2026-07-03 00:00:00', '2026-07-03 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-aspirador-usb-portatil-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('137', '1', '2026-07-03 02:20:31', '2026-07-03 05:20:31', 'Picsum ID: 638', 'Picsum ID: 638', '', 'inherit', 'open', 'closed', '', 'picsum-id-638', '', '', '2026-07-03 02:20:31', '2026-07-03 05:20:31', '', '136', 'http://localhost/achadinhos/wp-content/uploads/2026/07/achadinho-136.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('138', '1', '2026-07-02 00:00:00', '2026-07-02 03:00:00', 'Carregamento rápido com conexão magnética. Compatível com USB-C, Micro USB e Lightning. Ideal para quem usa vários dispositivos.', 'Cabo Magnético 3 em 1', 'Carregamento rápido com conexão magnética. Compatível com USB-C, Micro USB e Lightning. Ideal para quem usa vários dispositivos.', 'publish', 'closed', 'closed', '', 'cabo-magnetico-3-em-1-4', '', '', '2026-07-02 00:00:00', '2026-07-02 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/cabo-magnetico-3-em-1-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('139', '1', '2026-07-03 02:20:32', '2026-07-03 05:20:32', 'Picsum ID: 137', 'Picsum ID: 137', '', 'inherit', 'open', 'closed', '', 'picsum-id-137', '', '', '2026-07-03 02:20:32', '2026-07-03 05:20:32', '', '138', 'http://localhost/achadinhos/wp-content/uploads/2026/07/achadinho-138.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('140', '1', '2026-07-01 00:00:00', '2026-07-01 03:00:00', 'Ventilador compacto e silencioso, perfeito para usar no PC, notebook ou escrivaninha. Ideal para dias quentes no home office.', 'Mini Ventilador USB Silencioso', 'Ventilador compacto e silencioso, perfeito para usar no PC, notebook ou escrivaninha. Ideal para dias quentes no home office.', 'publish', 'closed', 'closed', '', 'mini-ventilador-usb-silencioso-4', '', '', '2026-07-01 00:00:00', '2026-07-01 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-ventilador-usb-silencioso-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('141', '1', '2026-07-03 02:20:34', '2026-07-03 05:20:34', 'Picsum ID: 320', 'Picsum ID: 320', '', 'inherit', 'open', 'closed', '', 'picsum-id-320', '', '', '2026-07-03 02:20:34', '2026-07-03 05:20:34', '', '140', 'http://localhost/achadinhos/wp-content/uploads/2026/07/achadinho-140.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('142', '1', '2026-06-30 00:00:00', '2026-06-30 03:00:00', 'Controle por app, compatível com Alexa e Google Home. 16 milhões de cores, dimerizável e programável. Transforme seu ambiente.', 'Lâmpada Inteligente Wi-Fi', 'Controle por app, compatível com Alexa e Google Home. 16 milhões de cores, dimerizável e programável. Transforme seu ambiente.', 'publish', 'closed', 'closed', '', 'lampada-inteligente-wi-fi-4', '', '', '2026-06-30 00:00:00', '2026-06-30 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/lampada-inteligente-wi-fi-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('143', '1', '2026-07-03 02:20:35', '2026-07-03 05:20:35', 'Picsum ID: 694', 'Picsum ID: 694', '', 'inherit', 'open', 'closed', '', 'picsum-id-694', '', '', '2026-07-03 02:20:35', '2026-07-03 05:20:35', '', '142', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-142.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('144', '1', '2026-06-29 00:00:00', '2026-06-29 03:00:00', 'Fita de LED RGB com controle remoto, perfeita para dar um visual gamer ao seu setup. Cola na parte de trás da mesa, monitor ou estante.', 'Fita LED RGB para Setup', 'Fita de LED RGB com controle remoto, perfeita para dar um visual gamer ao seu setup. Cola na parte de trás da mesa, monitor ou estante.', 'publish', 'closed', 'closed', '', 'fita-led-rgb-para-setup-4', '', '', '2026-06-29 00:00:00', '2026-06-29 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/fita-led-rgb-para-setup-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('145', '1', '2026-07-03 02:20:36', '2026-07-03 05:20:36', 'Picsum ID: 646', 'Picsum ID: 646', '', 'inherit', 'open', 'closed', '', 'picsum-id-646', '', '', '2026-07-03 02:20:36', '2026-07-03 05:20:36', '', '144', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-144.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('146', '1', '2026-06-28 00:00:00', '2026-06-28 03:00:00', 'Tripé flexível com pernas articuláveis, ideal para gravar vídeos, lives, fotos e reuniões. Compatível com celular e câmeras compactas.', 'Tripé Flexível Universal', 'Tripé flexível com pernas articuláveis, ideal para gravar vídeos, lives, fotos e reuniões. Compatível com celular e câmeras compactas.', 'publish', 'closed', 'closed', '', 'tripe-flexivel-universal-4', '', '', '2026-06-28 00:00:00', '2026-06-28 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/tripe-flexivel-universal-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('147', '1', '2026-07-03 02:20:38', '2026-07-03 05:20:38', 'Picsum ID: 430', 'Picsum ID: 430', '', 'inherit', 'open', 'closed', '', 'picsum-id-430-2', '', '', '2026-07-03 02:20:38', '2026-07-03 05:20:38', '', '146', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-146.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('148', '1', '2026-06-27 00:00:00', '2026-06-27 03:00:00', 'Microfone de lapela com áudio limpo e profissional. Plug P2, compatível com celular, PC e câmeras. Ótimo para gravar vídeos e reuniões.', 'Microfone Lapela Profissional', 'Microfone de lapela com áudio limpo e profissional. Plug P2, compatível com celular, PC e câmeras. Ótimo para gravar vídeos e reuniões.', 'publish', 'closed', 'closed', '', 'microfone-lapela-profissional-4', '', '', '2026-06-27 00:00:00', '2026-06-27 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/microfone-lapela-profissional-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('149', '1', '2026-07-03 02:20:39', '2026-07-03 05:20:39', 'Picsum ID: 954', 'Picsum ID: 954', '', 'inherit', 'open', 'closed', '', 'picsum-id-954', '', '', '2026-07-03 02:20:39', '2026-07-03 05:20:39', '', '148', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-148.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('150', '1', '2026-06-26 00:00:00', '2026-06-26 03:00:00', 'Transforma seu celular em uma câmera profissional para fotos macro. Encoste a lente na câmera do celular e capture detalhes incríveis.', 'Lente Macro para Celular', 'Transforma seu celular em uma câmera profissional para fotos macro. Encoste a lente na câmera do celular e capture detalhes incríveis.', 'publish', 'closed', 'closed', '', 'lente-macro-para-celular-4', '', '', '2026-06-26 00:00:00', '2026-06-26 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/lente-macro-para-celular-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('151', '1', '2026-07-03 02:20:41', '2026-07-03 05:20:41', 'Picsum ID: 652', 'Picsum ID: 652', '', 'inherit', 'open', 'closed', '', 'picsum-id-652', '', '', '2026-07-03 02:20:41', '2026-07-03 05:20:41', '', '150', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-150.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('152', '1', '2026-06-25 00:00:00', '2026-06-25 03:00:00', 'Suporte articulado com braço flexível, perfeito para assistir vídeos, fazer chamadas de vídeo ou trabalhar com as mãos livres.', 'Suporte Articulado para Celular', 'Suporte articulado com braço flexível, perfeito para assistir vídeos, fazer chamadas de vídeo ou trabalhar com as mãos livres.', 'publish', 'closed', 'closed', '', 'suporte-articulado-para-celular-4', '', '', '2026-06-25 00:00:00', '2026-06-25 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/suporte-articulado-para-celular-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('153', '1', '2026-07-03 02:20:42', '2026-07-03 05:20:42', 'Picsum ID: 162', 'Picsum ID: 162', '', 'inherit', 'open', 'closed', '', 'picsum-id-162', '', '', '2026-07-03 02:20:42', '2026-07-03 05:20:42', '', '152', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-152.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('154', '1', '2026-06-24 00:00:00', '2026-06-24 03:00:00', 'Powerbank slim e leve, carregamento rápido 2.1A, entrada USB-C e dupla saída USB. Carregue dois dispositivos ao mesmo tempo.', 'Powerbank Slim 10000mAh', 'Powerbank slim e leve, carregamento rápido 2.1A, entrada USB-C e dupla saída USB. Carregue dois dispositivos ao mesmo tempo.', 'publish', 'closed', 'closed', '', 'powerbank-slim-10000mah-4', '', '', '2026-06-24 00:00:00', '2026-06-24 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/powerbank-slim-10000mah-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('155', '1', '2026-07-03 02:20:44', '2026-07-03 05:20:44', 'Picsum ID: 832', 'Picsum ID: 832', '', 'inherit', 'open', 'closed', '', 'picsum-id-832', '', '', '2026-07-03 02:20:44', '2026-07-03 05:20:44', '', '154', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-154.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('156', '1', '2026-06-23 00:00:00', '2026-06-23 03:00:00', 'Kit com 24 chaves de precisão para manutenção de eletrônicos, celulares, notebooks, óculos e consoles. Estojo organizador incluso.', 'Kit Chaves de Precisão', 'Kit com 24 chaves de precisão para manutenção de eletrônicos, celulares, notebooks, óculos e consoles. Estojo organizador incluso.', 'publish', 'closed', 'closed', '', 'kit-chaves-de-precisao-4', '', '', '2026-06-23 00:00:00', '2026-06-23 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/kit-chaves-de-precisao-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('157', '1', '2026-07-03 02:20:45', '2026-07-03 05:20:45', 'Picsum ID: 868', 'Picsum ID: 868', '', 'inherit', 'open', 'closed', '', 'picsum-id-868', '', '', '2026-07-03 02:20:45', '2026-07-03 05:20:45', '', '156', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-156.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('158', '1', '2026-06-22 00:00:00', '2026-06-22 03:00:00', 'Multímetro digital para medir tensão, corrente, resistência e continuidade. Essencial para quem trabalha com eletrônica e elétrica.', 'Multímetro Digital Portátil', 'Multímetro digital para medir tensão, corrente, resistência e continuidade. Essencial para quem trabalha com eletrônica e elétrica.', 'publish', 'closed', 'closed', '', 'multimetro-digital-portatil-4', '', '', '2026-06-22 00:00:00', '2026-06-22 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/multimetro-digital-portatil-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('159', '1', '2026-07-03 02:20:48', '2026-07-03 05:20:48', 'Picsum ID: 48', 'Picsum ID: 48', '', 'inherit', 'open', 'closed', '', 'picsum-id-48', '', '', '2026-07-03 02:20:48', '2026-07-03 05:20:48', '', '158', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-158.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('160', '1', '2026-06-21 00:00:00', '2026-06-21 03:00:00', 'Pasta térmica de alta performance para melhorar a dissipação de calor em CPUs e GPUs. Reduz a temperatura do processador em até 10°C.', 'Pasta Térmica para Processador', 'Pasta térmica de alta performance para melhorar a dissipação de calor em CPUs e GPUs. Reduz a temperatura do processador em até 10°C.', 'publish', 'closed', 'closed', '', 'pasta-termica-para-processador-4', '', '', '2026-06-21 00:00:00', '2026-06-21 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/pasta-termica-para-processador-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('161', '1', '2026-07-03 02:20:49', '2026-07-03 05:20:49', 'Picsum ID: 25', 'Picsum ID: 25', '', 'inherit', 'open', 'closed', '', 'picsum-id-25', '', '', '2026-07-03 02:20:49', '2026-07-03 05:20:49', '', '160', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-160.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('162', '1', '2026-06-20 00:00:00', '2026-06-20 03:00:00', 'Tapete magnético com borda elevada para organizar parafusos e peças pequenas durante reparos. Evita perder peças.', 'Suporte Magnético para Parafusos', 'Tapete magnético com borda elevada para organizar parafusos e peças pequenas durante reparos. Evita perder peças.', 'publish', 'closed', 'closed', '', 'suporte-magnetico-para-parafusos-4', '', '', '2026-06-20 00:00:00', '2026-06-20 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/suporte-magnetico-para-parafusos-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('163', '1', '2026-07-03 02:20:52', '2026-07-03 05:20:52', 'Picsum ID: 33', 'Picsum ID: 33', '', 'inherit', 'open', 'closed', '', 'picsum-id-33', '', '', '2026-07-03 02:20:52', '2026-07-03 05:20:52', '', '162', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-162.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('164', '1', '2026-06-19 00:00:00', '2026-06-19 03:00:00', 'Kit completo com spray, pincel, flanela e hastes flexíveis para limpeza de teclados, câmeras, celulares e notebooks.', 'Kit Limpeza para Eletrônicos', 'Kit completo com spray, pincel, flanela e hastes flexíveis para limpeza de teclados, câmeras, celulares e notebooks.', 'publish', 'closed', 'closed', '', 'kit-limpeza-para-eletronicos-4', '', '', '2026-06-19 00:00:00', '2026-06-19 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/kit-limpeza-para-eletronicos-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('165', '1', '2026-07-03 02:20:54', '2026-07-03 05:20:54', 'Picsum ID: 33', 'Picsum ID: 33', '', 'inherit', 'open', 'closed', '', 'picsum-id-33-2', '', '', '2026-07-03 02:20:54', '2026-07-03 05:20:54', '', '164', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-164.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('166', '1', '2026-06-18 00:00:00', '2026-06-18 03:00:00', 'Mini projetor portátil compatível com celular, notebook e TV Box. Transforme qualquer parede em uma tela gigante. Resolução HD suportada.', 'Mini Projetor Portátil LED', 'Mini projetor portátil compatível com celular, notebook e TV Box. Transforme qualquer parede em uma tela gigante. Resolução HD suportada.', 'publish', 'closed', 'closed', '', 'mini-projetor-portatil-led-4', '', '', '2026-06-18 00:00:00', '2026-06-18 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-projetor-portatil-led-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('167', '1', '2026-07-03 02:20:55', '2026-07-03 05:20:55', 'Picsum ID: 758', 'Picsum ID: 758', '', 'inherit', 'open', 'closed', '', 'picsum-id-758', '', '', '2026-07-03 02:20:55', '2026-07-03 05:20:55', '', '166', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-166.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('168', '1', '2026-06-17 00:00:00', '2026-06-17 03:00:00', 'Caneta digital com ponta precisa para tablets e celulares. Ótima para anotações, desenhos e navegação. Palm rejection incluído.', 'Caneta Touch para Tablet', 'Caneta digital com ponta precisa para tablets e celulares. Ótima para anotações, desenhos e navegação. Palm rejection incluído.', 'publish', 'closed', 'closed', '', 'caneta-touch-para-tablet-4', '', '', '2026-06-17 00:00:00', '2026-06-17 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/caneta-touch-para-tablet-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('169', '1', '2026-07-03 02:20:57', '2026-07-03 05:20:57', 'Picsum ID: 1075', 'Picsum ID: 1075', '', 'inherit', 'open', 'closed', '', 'picsum-id-1075', '', '', '2026-07-03 02:20:57', '2026-07-03 05:20:57', '', '168', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-168.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('170', '1', '2026-06-16 00:00:00', '2026-06-16 03:00:00', 'Sensor de movimento USB que acende automaticamente ao detectar presença. Ideal para corredor, banheiro ou escada. Plug and play.', 'Sensor de Presença USB', 'Sensor de movimento USB que acende automaticamente ao detectar presença. Ideal para corredor, banheiro ou escada. Plug and play.', 'publish', 'closed', 'closed', '', 'sensor-de-presenca-usb-4', '', '', '2026-06-16 00:00:00', '2026-06-16 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/sensor-de-presenca-usb-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('171', '1', '2026-07-03 02:20:59', '2026-07-03 05:20:59', 'Picsum ID: 553', 'Picsum ID: 553', '', 'inherit', 'open', 'closed', '', 'picsum-id-553', '', '', '2026-07-03 02:20:59', '2026-07-03 05:20:59', '', '170', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-170.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('172', '1', '2026-06-15 00:00:00', '2026-06-15 03:00:00', 'Mini teclado sem fio com touchpad, perfeito para Smart TVs, TV Box, PCs e projetores. Conexão 2.4GHz, alcance de 10m.', 'Mini Teclado Wireless', 'Mini teclado sem fio com touchpad, perfeito para Smart TVs, TV Box, PCs e projetores. Conexão 2.4GHz, alcance de 10m.', 'publish', 'closed', 'closed', '', 'mini-teclado-wireless-4', '', '', '2026-06-15 00:00:00', '2026-06-15 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/mini-teclado-wireless-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('173', '1', '2026-07-03 02:21:00', '2026-07-03 05:21:00', 'Picsum ID: 500', 'Picsum ID: 500', '', 'inherit', 'open', 'closed', '', 'picsum-id-500', '', '', '2026-07-03 02:21:00', '2026-07-03 05:21:00', '', '172', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-172.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('174', '1', '2026-06-14 00:00:00', '2026-06-14 03:00:00', 'Luz RGB que acende quando chega mensagem ou notificação no celular. Conecta via Bluetooth e personaliza as cores por app.', 'Luz de Notificação RGB USB', 'Luz RGB que acende quando chega mensagem ou notificação no celular. Conecta via Bluetooth e personaliza as cores por app.', 'publish', 'closed', 'closed', '', 'luz-de-notificacao-rgb-usb-4', '', '', '2026-06-14 00:00:00', '2026-06-14 03:00:00', '', '0', 'http://localhost/achadinhos/achadinho/luz-de-notificacao-rgb-usb-4/', '0', 'achadinho', '', '0');
INSERT INTO `wp_posts` VALUES ('175', '1', '2026-07-03 02:21:02', '2026-07-03 05:21:02', 'Picsum ID: 94', 'Picsum ID: 94', '', 'inherit', 'open', 'closed', '', 'picsum-id-94-2', '', '', '2026-07-03 02:21:02', '2026-07-03 05:21:02', '', '174', 'http://localhost/achadinhos/wp-content/uploads/2026/06/achadinho-174.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('177', '0', '2026-07-04 23:07:28', '2026-07-05 02:07:28', '<p><strong>Meta Description:</strong> Descubra tudo sobre qualidade de software, suas metodologias, boas práticas e como implementar um programa de QA eficiente. Guia completo para profissionais e empresas de tecnologia.</p>\n\n<hr>\n<h2>O Que é Qualidade de Software e Por Que Ela É Essencial?</h2>\n\n<p>A <strong>qualidade de software</strong> representa um dos pilares fundamentais no desenvolvimento de sistemas informatizados modernos. Em um mundo cada vez mais digitalizado, onde empresas de todos os portes dependem de aplicações tecnológicas para suas operações diárias, garantir que esses sistemas funcionem de maneira eficiente, segura e confiável tornou-se uma prioridade estratégica absoluta.</p>\n\n<p>A crescente complexidade dos sistemas digitais torna a gestão de qualidade de software essencial para assegurar desempenho, segurança e conformidade com padrões internacionais. Estudos conduzidos por organizações como o IEEE e a ISO demonstram que empresas que implementam práticas estruturadas de qualidade experimentam reduções significativas em custos de manutenção, prevenção de falhas e otimização de recursos.</p>\n\n<p>Processo de QA em ação - Garantia de Qualidade de Software</p>\n\n<h3>Por Que a Qualidade de Software Importa para Sua Empresa?</h3>\n\n<p>A resposta é simples: <strong>defeitos de software custam caro</strong>. Segundo pesquisas da Carnegie Mellon University, o custo de corrigir um bug aumenta exponencialmente dependendo da fase em que ele é descoberto:</p>\n\n<ul><li><strong>Fase de desenvolvimento:</strong> $100 - $1.000 por defeito</li><ol><li><strong>Fase de teste:</strong> $1.000 - $10.000 por defeito  </li>\n<li><strong>Fase de produção:</strong> $10.000 - $100.000+ por defeito</li>\n</ol>\nIsso significa que quanto mais cedo você detectar e corrigir problemas, menor será o impacto financeiro no seu projeto.\n\n<hr>\n<h2>Impacto da Qualidade de Software nos Negócios</h2>\n\n<p>A gestão de qualidade eleva o desempenho e segurança no software. Organizações worldwide estão navegando por um mar de possibilidades tecnológicas, e a <strong>Quality Assurance (QA)</strong> juega um papel cada vez mais crítico neste cenário competitivo.</p>\n\n<h3>Benefícios Tangíveis da Implementação de QA</h3>\n<ol><li><strong>Redução de Custos de Manutenção</strong></li>\n</ol>   - Menos correções emergenciais\n   - Menor tempo gasto com suporte técnico\n   - Redução de chamadas ao helpdesk\n<ol><li><strong>Maior Satisfação do Cliente</strong></li>\n</ol>   - Produtos mais stables e confiáveis\n   - Menor tempo de inatividade (downtime)\n   - Experiência do usuário aprimorada\n<ol><li><strong>Menor Tempo de Mercado (Time-to-Market)</strong></li>\n</ol>   - Processos de teste mais eficientes\n   - Identificação precoce de problemas\n   - Ciclos de desenvolvimento otimizados\n<ol><li><strong>Conformidade com Regulamentações</strong></li>\n</ol>   - Adequação à LGPD (Brasil)\n   - Conformidade com GDPR (Europa)\n   - Padrões ISO/IEC 25010\n<ol><li><strong>Redução de Riscos de Segurança</strong></li>\n</ol>   - Identificação proativa de vulnerabilidades\n   - Proteção de dados sensíveis\n   - Conformidade com requisitos regulatórios\n\n<hr>\n<h2>Objetivos Fundamentais da Quality Assurance (QA)</h2>\n\n<p>O objetivo principal da Quality Assurance é garantir que o software atenda aos requisitos de qualidade estabelecidos, proporcionando uma experiência excelente ao usuário final. Esses objetivos são medidos através de indicadores específicos e alinhados com os padrões internacionais de qualidade.</p>\n\n<h3>Os 6 Pilares da Qualidade de Software</h3>\n\n<h4>1. Funcionalidade</h4>\n\n<p>O software deve funcionar conforme especificado, executando todas as operações para as quais foi projetado. Isso inclui:<br><ol><li>Execução correta de todas as funções</li><br><li>Precisão dos resultados</li><br><li>Conformidade com requisitos funcionais</li><br><li>Integração adequada com outros sistemas</li><br></ol><br><h4>2. Confiabilidade (Reliability)</h4></p>\n\n<p>O software deve operar sem falhas, mesmo sob condições adversas. Métricas importantes incluem:<br><ol><li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li><br><li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li><br><li><strong>Disponibilidade:</strong> Porcentagem de tempo em que o sistema está operacional</li><br></ol><br><h4>3. Usabilidade (Usability)</h4></p>\n\n<p>O software deve ser fácil de usar, proporcionando uma experiência intuitiva ao usuário. Considera-se:<br><ol><li>Curva de aprendizado mínima</li><br><li>Interface intuitiva e amigável</li><br><li>Acessibilidade para diferentes perfis de usuários</li><br><li>Documentação clara e completa</li><br></ol><br><h4>4. Eficiência (Performance)</h4></p>\n\n<p>O software deve executar tarefas de forma otimizada, utilizando recursos computacionais de maneira inteligente:<br><ol><li>Tempo de resposta adequado</li><br><li>Uso eficiente de memória e processamento</li><br><li>Escalabilidade para diferentes volumes de dados</li><br><li>Otimização de queries e algoritmos</li><br></ol><br><h4>5. Manutenibilidade (Maintainability)</h4></p>\n\n<p>O software deve ser fácil de modificar e evoluir ao longo do tempo:<br><ol><li>Código bem documentado e estruturado</li><br><li>Arquitetura modular e flexível</li><br><li>Facilidade para adicionar novas funcionalidades</li><br><li>Baito acoplamento entre componentes</li><br></ol><br><h4>6. Segurança (Security)</h4></p>\n\n<p>O software deve proteger dados e informações contra acessos não autorizados:<br><ol><li>Criptografia de dados sensíveis</li><br><li>Autenticação e autorização adequadas</li><br><li>Proteção contra ataques comuns (SQL Injection, XSS, CSRF)</li><br><li>Auditoria e logging de atividades</li><br></ol><br><hr><br><h2>Evolução Histórica da Qualidade de Software</h2></p>\n\n<p>O campo de QA tem passado por transformações radicais ao longo das últimas décadas, acompanhando a evolução tecnológica e as demandas crescentes do mercado.</p>\n\n<h3>Linha do Tempo da Qualidade de Software</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Período</th><th>Foco Principal</th><th>Metodologias</th></tr>\n<tr><td><strong>1970s</strong></td><td>Verificação de Software</td><td>Revisão manual, testes estruturados</td></tr>\n<tr><td><strong>1980s</strong></td><td>Garantia de Qualidade</td><td>Metodologias Waterfall, padrões de processo</td></tr>\n<tr><td><strong>1990s</strong></td><td>Melhoria de Processos</td><td>CMM/CMMI, ISO 9000</td></tr>\n<tr><td><strong>2000s</strong></td><td>Automação de Testes</td><td>Agile, testes automatizados</td></tr>\n<tr><td><strong>2010s</strong></td><td>DevOps e CI/CD</td><td>Integração contínua, entrega contínua</td></tr>\n<tr><td><strong>2020s</strong></td><td>IA em QA</td><td>Testes inteligentes, automação avançada</td></tr>\n<tr><td><strong>2024-2026</strong></td><td>GenAI e Hiperautomação</td><td>Testes autônomos, manutenção preditiva</td></tr>\n</table></figure>\n\n<h3>Metodologias Ágeis e Seu Impacto na Qualidade</h3>\n\n<p>A adoção de metodologias ágeis como Scrum, Kanban e XP revolucionou a forma como equipes de desenvolvimento abordam a qualidade. Essas metodologias promovem:<br><ol><li><strong>Feedback contínuo:</strong> Ciclos curtos de desenvolvimento permitem ajustes frequentes</li><br><li><strong>Colaboração:</strong> Times multifuncionais trabalham juntos para garantir qualidade</li><br><li><strong>Adaptabilidade:</strong> Mudanças de requisitos são incorporadas de forma mais fluida</li><br><li><strong>Entrega incremental:</strong> Funcionalidades são liberadas progressivamente</li><br></ol><br><hr><br><h2>Como Implementar um Programa de Qualidade de Software</h2></p>\n\n<p>A implementação de um programa eficaz de qualidade de software requer planejamento estratégico e comprometimento organizacional. Abaixo, apresentamos um framework passo a passo:</p>\n\n<h3>Passo 1: Defina sua Estratégia de Qualidade</h3>\n<ol><li>Estabeleça objetivos claros e mensuráveis</li>\n<li>Identifique os indicadores-chave de performance (KPIs)</li>\n<li>Alinhe a estratégia de QA com os objetivos de negócio</li>\n<li>Defina papéis e responsabilidades</li>\n</ol>\n<h3>Passo 2: Escolha as Metodologias Adequadas</h3>\n<ol><li><strong>Para projetos tradicionais:</strong> Waterfall com fases definidas</li>\n<li><strong>Para projetos ágeis:</strong> Scrum, Kanban ou SAFe</li>\n<li><strong>Para DevOps:</strong> CI/CD com automação completa</li>\n</ol>\n<h3>Passo 3: Implemente Processos de Teste</h3>\n<ol><li>Testes unitários</li>\n<li>Testes de integração</li>\n<li>Testes de sistema</li>\n<li>Testes de aceitação</li>\n<li>Testes de regressão</li>\n</ol>\n<h3>Passo 4: Invista em Automação</h3>\n\n<p>A automação de testes é essencial para escalar a qualidade em projetos modernos. Ferramentas como Selenium, Playwright, Cypress, JUnit e pytest devem fazer parte do seu arsenal.</p>\n\n<h3>Passo 5: Monitore e Melhore Continuamente</h3>\n<ol><li>Colete métricas de qualidade</li>\n<li>Realize análises de causa raiz</li>\n<li>Implemente ações corretivas</li>\n<li>Revise e otimize processos</li></ol></ul>\n\n<hr>\n<h2>Tendências Atuais em Qualidade de Software</h2>\n\n<p>O futuro da QA está sendo moldado por tecnologias emergentes e novas abordagens metodológicas:<br><ol><li><strong>Testes Contínuos:</strong> Automação integrada ao pipeline de CI/CD</li><br><li><strong>IA e Machine Learning:</strong> Geração automática de casos de teste</li><br><li><strong>Testes em Nuvem:</strong> Escalabilidade e flexibilidade</li><br><li><strong>Shift-Left Testing:</strong> Testes realizados mais cedo no ciclo de desenvolvimento</li><br><li><strong>QA como Código:</strong> Definição de testes como código versionável</li><br></ol><br><hr><br><h2>Conclusão</h2></p>\n\n<p>A qualidade de software não é mais um luxo ou uma opção — é uma necessidade estratégica para qualquer organização que deseja se manter competitiva no mercado atual. Investir em práticas robustas de QA resulta em:</p>\n\n<p>✅ Produtos mais confiáveis e seguros  <br>✅ Clientes mais satisfeitos  <br>✅ Redução significativa de custos  <br>✅ Maior velocidade de entrega  <br>✅ Vantagem competitiva sustentável</p>\n\n<p><strong>Pronto para transformar a qualidade do seu software?</strong> Comece hoje mesmo implementando práticas de teste contínuo e automação em seus projetos.</p>\n\n<hr>\n<h3>FAQ - Perguntas Frequentes sobre Qualidade de Software</h3>\n\n<p><strong>P: Qual é a diferença entre QA, QC e Teste de Software?</strong>  <br>R: QA (Quality Assurance) foca na prevenção de defeitos através de processos. QC (Quality Control) verifica se o produto atende aos padrões. Teste de Software é a atividade técnica de executar o software para encontrar defeitos.</p>\n\n<p><strong>P: Quanto devo investir em testes de software?</strong>  <br>R: A média da indústria é de 15-25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} do orçamento total de desenvolvimento. Projetos críticos (saúde, finanças, aeroespacial) podem investir até 40-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}.</p>\n\n<p><strong>P: É possível garantir 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de qualidade em um software?</strong>  <br>R: Não é possível garantir qualidade absoluta devido à impossibilidade de testar todas as combinações possíveis (paradoxo do teste). O objetivo é reduzir riscos a níveis aceitáveis.</p>\n\n<p><strong>P: Quais certificações são importantes para profissionais de QA?</strong>  <br>R: ISTQB, CSTE, CSQA,ICAgile e certificações específicas de ferramentas (Selenium, JMeter, etc.) são altamente valorizadas.</p>\n\n<p><strong>P: Automação de testes substitui testes manuais?</strong>  <br>R: Não. A automação é excelente para tarefas repetitivas e regressão, mas testes manuais são essenciais para usabilidade, UX e cenários complexos que exigem julgamento humano.</p>\n\n<hr>\n<em>Fonte: Pesquisas sobre Software Quality Assurance 2024-2026, IEEE Software, ISO/IEC 25010</em>', 'Introdução à Qualidade de Software: Guia Completo para Garantir Excelência em Projetos de TI', '', 'publish', 'open', 'open', '', '01introducaoqualidadesoftware', '', '', '2026-07-04 23:07:28', '2026-07-05 02:07:28', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/01introducaoqualidadesoftware/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('178', '0', '2026-07-06 23:05:49', '2026-07-07 02:05:49', '<p><strong>Meta Description:</strong> Descubra as principais tendências de QA para 2025: IA em testes, automação avançada, Shift-Left, testes em nuvem e mais. Guia atualizado para profissionais de qualidade de software.</p>\n\n<hr>\n<h2>Visão Geral: A Transformação Digital da Qualidade de Software</h2>\n\n<p>O desenvolvimento de software está mudando em níveis sem precedentes, e a Garantia de Qualidade está avançando no mesmo ritmo. Em 2025 e 2026, os testes de software assumirão uma forma inteiramente diferente com tecnologias emergentes, evolução de metodologias e necessidades crescentes de eficiência.</p>\n\n<figure><img src=\"https://media.giphy.com/media/g9582wUmvNrrK/giphy.gif\" alt=\"Inteligência Artificial em QA - Automação Inteligente\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O cenário tecnológico atual exige que profissionais e organizações se mantenham atualizados com as tendências mais impactantes. segundo o World Quality Report 2025, quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão buscando ativamente GenAI</strong> em práticas de Quality Engineering, embora apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} tenham alcançado implementação em escala empresarial.</p>\n\n<hr>\n<h2>As 10 Principais Tendências de QA para 2025 e 2026</h2>\n\n<h3>1. Testes de API para Microsserviços</h3>\n\n<p>Os testes de API tornaram-se cruciais com a adoção massiva de arquiteturas de microsserviços. Esta tendência permite validação rápida e eficiente de funcionalidades distribuídas.</p>\n\n<h4>Por Que os Testes de API São Essenciais?</h4>\n\n<ul><li><strong>Comunicação entre serviços:</strong> Microsserviços se comunicam principalmente via APIs REST e GraphQL</li><ol><li><strong>Isolamento de falhas:</strong> Facilita a identificação de problemas específicos</li>\n<li><strong>Velocidade de execução:</strong> Testes de API são significativamente mais rápidos que testes de interface</li>\n<li><strong>Integração contínua:</strong> Essenciais para pipelines de CI/CD</li>\n</ol>\n<h4>Ferramentas Populares para Testes de API</h4>\n<ol><li><strong>Postman</strong> - Interface intuitiva para criação e execução de testes</li>\n<li><strong>Insomnia</strong> - Alternativa moderna com suporte a GraphQL</li>\n<li><strong>JMeter</strong> - Poderoso para testes de carga em APIs</li>\n<li><strong>SoapUI</strong> - Especializado em APIs SOAP e REST</li>\n<li><strong>Katalon</strong> - Plataforma integrada para API e UI</li>\n</ol>\n<hr>\n<h3>2. Testes em Nuvem: Escalabilidade Sem Limites</h3>\n\n<figure><img src=\"https://media.giphy.com/media/ICOg3nKHUwO0I/giphy.gif\" alt=\"Cloud Testing - Testes Escaláveis na Nuvem\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>A testing baseada em nuvem oferece escalabilidade e flexibilidade sem precedentes. Organizações podem executar testes em múltiplos ambientes simultaneamente, reduzindo significativamente o tempo de ciclo.</p>\n\n<h4>Benefícios dos Testes em Nuvem</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Benefício</th><th>Descrição</th><th>Impacto</th></tr>\n<tr><td><strong>Escalabilidade</strong></td><td>Recursos sob demanda</td><td>Redução de custos de infraestrutura</td></tr>\n<tr><td><strong>Disponibilidade</strong></td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} uptime</td><td>Testes 24/7</td></tr>\n<tr><td><strong>Cobertura</strong></td><td>Múltiplos dispositivos</td><td>Melhor qualidade de teste</td></tr>\n<tr><td><strong>Velocidade</strong></td><td>Paralelização massiva</td><td>Time-to-market reduzido</td></tr>\n</table></figure>\n\n<h4>Provedores Líderes</h4>\n<ol><li><strong>AWS Device Farm</strong> - Amplocobertura de dispositivos</li>\n<li><strong>BrowserStack</strong> - Testes cross-browser e mobile</li>\n<li><strong>Sauce Labs</strong> - Plataforma completa de testes</li>\n<li><strong>CrossBrowserTesting</strong> - Testes visuais e funcionais</li>\n</ol>\n<hr>\n<h3>3. Ferramentas Low-Code e No-Code para Testes</h3>\n\n<p>A aumento de ferramentas de teste low-code e no-code está democratizando o acesso à automação de testes, permitindo que equipes com menos conhecimento técnico participem ativamente da QA.</p>\n\n<h4>Principais Ferramentas No-Code</h4>\n<ol><li><strong>Katalon Studio</strong> - Plataforma completa com录制 de testes</li>\n<li><strong>TestComplete</strong> - Automação de testes sem código</li>\n<li><strong>Cypress Component Testing</strong> - Para desenvolvedores</li>\n<li><strong>Playwright</strong> - API simples e intuitiva</li>\n<li><strong>Ranorex</strong> - Testes desktop, web e mobile</li>\n</ol>\n<h4>Vantagens das Abordagens Low-Code</h4>\n\n<p>✅ Redução da curva de aprendizado  <br>✅ Democratização da automação  <br>✅ Agilidade na criação de testes  <br>✅ Menor dependência de programadores  <br>✅ Time-to-market acelerado</p>\n\n<hr>\n<h3>4. Testes para IoT e Wearables</h3>\n\n<p>Com a proliferação de dispositivos IoT e wearables, surge a necessidade de estratégias de teste específicas para estes ambientes, considerando restrições de hardware e conectividade.</p>\n\n<h4>Desafios Únicos dos Testes IoT</h4>\n<ol><li><strong>Heterogeneidade:</strong> Milhares de dispositivos diferentes</li>\n<li><strong>Conectividade:</strong> Wi-Fi, Bluetooth, Zigbee, LoRa</li>\n<li><strong>Segurança:</strong> Superfície de ataque expandida</li>\n<li><strong>Consumo de energia:</strong> Bateria limitada</li>\n<li><strong>Latência:</strong> Tempo real vs. não-tempo real</li>\n</ol>\n<h4>Estratégias de Teste IoT</h4>\n<ol><li><strong>Testes de Integração:</strong> Verificar comunicação entre dispositivos</li>\n<li><strong>Testes de Segurança:</strong> Pentest em dispositivos conectados</li>\n<li><strong>Testes de Performance:</strong> Latência e throughput</li>\n<li><strong>Testes de Compatibilidade:</strong> Interoperabilidade entre fabricantes</li>\n<li><strong>Testes de Confiabilidade:</strong> Resiliência a falhas de rede</li>\n</ol>\n<hr>\n<h3>5. Foco em Testes de Experiência do Usuário (UX)</h3>\n\n<p>A experiência do usuário tornou-se diferenciador competitivo. Testes de usabilidade e UX são agora prioridade nas estratégias de QA, incluindo testes A/B, análise heurística e testes com usuários reais.</p>\n\n<h4>Componentes do Teste de UX</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo de Teste</th><th>Foco</th><th>Metodologia</th></tr>\n<tr><td><strong>Teste de Usabilidade</strong></td><td>Facilidade de uso</td><td>Sessões com usuários</td></tr>\n<tr><td><strong>Teste A/B</strong></td><td>Conversão</td><td>Variações simultâneas</td></tr>\n<tr><td><strong>Análise Heurística</strong></td><td>Conformidade</td><td>Especialistas avaliam</td></tr>\n<tr><td><strong>Teste de Acessibilidade</strong></td><td>Inclusão</td><td>WCAG 2.1</td></tr>\n<tr><td><strong>Heatmaps</strong></td><td>Comportamento</td><td>Registros visuais</td></tr>\n</table></figure>\n\n<h4>Ferramentas para Testes de UX</h4>\n<ol><li><strong>Hotjar</strong> - Heatmaps e gravação de sessões</li>\n<li><strong>UserTesting</strong> - Painel de participantes</li>\n<li><strong>Optimizely</strong> - Testes A/B enterprise</li>\n<li><strong>Crazy Egg</strong> - Análise visual de cliques</li>\n</ol>\n<hr>\n<h3>6. Segurança como Imperativo de Negócios</h3>\n\n<p>A importância crescente de security testing faz parte das prioridades estratégicas das organizações. O teste de penetração e análise de vulnerabilidades são essenciais.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n<ol><li><strong>Penetration Testing (Pentest)</strong></li>\n</ol>   - Simulação de ataques reais\n   - Identificação de vulnerabilidades\n   - Teste de controles de segurança\n<ol><li><strong>Varredura de Vulnerabilidade</strong></li>\n</ol>   - Scanning automatizado\n   - Identificação de CVEs conhecidos\n   - Análise de configurações\n<ol><li><strong>Teste de Firewall e WAF</strong></li>\n</ol>   - Verificação de regras\n   - Teste de bypass\n   - Validação de logs\n<ol><li><strong>Análise de Código Estático (SAST)</strong></li>\n</ol>   - Detecção precoce de vulnerabilidades\n   - Integração no IDE\n   - Zero falsos positivos (com Tuning)\n<ol><li><strong>Análise de Componentes (SCA)</strong></li>\n</ol>   - Identificação de bibliotecas vulneráveis\n   - Licenciamento de software\n   - Atualizações de segurança\n\n<h4>Ferramentas de Segurança Essenciais</h4>\n<ol><li><strong>OWASP ZAP</strong> -Scanner de vulnerabilidades gratuito</li>\n<li><strong>Burp Suite</strong> - Plataforma completa de pentest</li>\n<li><strong>SonarQube</strong> - Análise de código</li>\n<li><strong>Snyk</strong> - SCA para desenvolvedores</li>\n<li><strong>Nessus</strong> -Scanner empresarial</li>\n</ol>\n<hr>\n<h3>7. Shift-Left Testing: Detectando Defeitos Mais Cedo</h3>\n\n<p>O modelo shift-left visa mover os testes para fases mais iniciais do ciclo de desenvolvimento, detectando defeitos mais cedo e reduzindo drasticamente custos de correção.</p>\n\n<h4>Benefícios do Shift-Left</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Fase Tradicional</th><th>Fase com Shift-Left</th><th>Economia</th></tr>\n<tr><td>$100 - $1.000</td><td>-</td><td>Custo por defeito</td></tr>\n<tr><td>$1.000 - $10.000</td><td>-</td><td>Teste</td></tr>\n<tr><td>$10.000 - $100.000</td><td>-</td><td>Produção</td></tr>\n</table></figure>\n\n<h4>Implementando Shift-Left</h4>\n<ol><li><strong>Testes Unitários</strong> - Desenvolvedores escrevem testes primeiro</li>\n<li><strong>Análise Estática</strong> - Verificação durante a codificação</li>\n<li><strong>Revisões de Código</strong> - Pair programming e code review</li>\n<li><strong>BDD (Behavior-Driven Development)</strong> - Testes definidos por requisitos</li>\n<li><strong>Testes de Contrato</strong> - Validação de APIs antes da implementação</li>\n</ol>\n<h4>Ferramentas para Shift-Left</h4>\n<ol><li><strong>Jest</strong> - Testes unitários JavaScript</li>\n<li><strong>JUnit 5</strong> - Framework de testes Java</li>\n<li><strong>pytest</strong> - Testes Python</li>\n<li><strong>ESLint</strong> - Linting e análise estática</li>\n<li><strong>Prettier</strong> - Formatação de código</li>\n</ol>\n<hr>\n<h3>8. Hiperautomação: O Futuro da Automação</h3>\n\n<figure><img src=\"https://media.giphy.com/media/LmNwrBhejkK9E12Mms/giphy.gif\" alt=\"Automação Avançada - Robôs e IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>A hiperautomação combina múltiplas tecnologias (IA, RPA, machine learning) para otimizar processos de teste e garantir maior cobertura.</p>\n\n<h4>Componentes da Hiperautomação em QA</h4>\n<ol><li><strong>RPA (Robotic Process Automation)</strong></li>\n</ol>   - Automação de tarefas repetitivas\n   - Geração de dados de teste\n   - Execução de suites de teste\n<ol><li><strong>Inteligência Artificial</strong></li>\n</ol>   - Geração automática de casos de teste\n   - Detecção de anomalias\n   - Manutenção inteligente de testes\n<ol><li><strong>Machine Learning</strong></li>\n</ol>   - Predição de áreas de risco\n   - Otimização de cobertura\n   - Identificação de testes flaky\n<ol><li><strong>Analytics Avançado</strong></li>\n</ol>   - Dashboard em tempo real\n   - Análise preditiva\n   - Relatórios inteligentes\n\n<h4>ROI da Hiperautomação</h4>\n\n<p>Organizações que implementam hiperautomação reportam:<br><ol><li><strong>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</strong> de redução em tempo de teste</li><br><li><strong>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</strong> de redução em custos de QA</li><br><li><strong>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</strong> de melhoria na cobertura de teste</li><br><li><strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</strong> de redução em testes flaky</li><br></ol><br><hr><br><h3>9. IA e Machine Learning em QA: A Revolução Silenciosa</h3></p>\n\n<p>Quase 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão buscando ativamente GenAI em práticas de quality engineering. A IA está transformando fundamentalmente como testes são criados, executados e mantidos.</p>\n\n<h4>Aplicações de IA em Testes</h4>\n\n<p>##### 9.1 Geração Automatizada de Testes<br><ol><li>Análise de requisitos para gerar casos de teste</li><br><li>Extração de testes a partir de histórias de usuários</li><br><li>Geração de dados de teste sintéticos</li><br></ol><br>##### 9.2 Detecção de Anomalias<br><ol><li>Identificação de padrões incomuns</li><br><li>Alertas proativos sobre regressões</li><br><li>Predição de falhas em produção</li><br></ol><br>##### 9.3 Manutenção Inteligente de Testes<br><ol><li>Detecção automática de testes obsoletos</li><br><li>Identificação de testes flaky</li><br><li>Recomendações de otimização</li><br></ol><br>##### 9.4 Oráculo de Teste Baseado em IA<br><ol><li>Comparação de screenshots com IA visual</li><br><li>Validação de dados com modelos treinados</li><br><li>Detecção de regressões visuais</li></ol></ul></p>\n\n<h4>Ferramentas de IA para QA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Testim</strong></td><td>Testes automatizados com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma de testes inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais com IA</td><td>Applitools</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>Mabl</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de testes unitários</td><td>Diffblue</td></tr>\n</table></figure>\n\n<hr>\n<h3>10. DevOps e CI/CD: Qualidade Integrada</h3>\n\n<p>A integração de QA no pipeline de DevOps é essencial para entrega contínua de software de qualidade.</p>\n\n<h4>Pipeline de CI/CD com QA Integrado</h4>\n\n<pre><code>Código → Build → Testes Unitários → Testes de Integração → Testes E2E → Deploy\n         ↓            ↓                   ↓                    ↓           ↓\n     SonarQube    JaCoCo           Postman/Newman        Cypress/Playwright  ArgoCD\n</code></pre>\n\n<h4>Melhores Práticas</h4>\n<ol><li><strong>Testes em Cada Estágio:</strong> Unitários, integração, contrato, E2E</li>\n<li><strong>Quality Gates:</strong> Critérios de qualidade para avançar</li>\n<li><strong>Feedback Rápido:</strong> Notificações instantâneas sobre falhas</li>\n<li><strong>Feature Flags:</strong> Testes em produção com controle</li>\n<li><strong>Canary Deployments:</strong> Liberação gradual com monitoramento</li>\n</ol>\n<hr>\n<h2>Como Preparar Sua Equipe para 2025</h2>\n\n<h3>Competências Essenciais para Profissionais de QA</h3>\n<ol><li><strong>Técnicas</strong></li>\n</ol>   - Programação (Python, JavaScript, Java)\n   - Automação de testes\n   - Cloud computing\n   - Containers (Docker, Kubernetes)\n<ol><li><strong>Metodológicas</strong></li>\n</ol>   - Agile/DevOps\n   - BDD/ATDD\n   - Exploratory Testing\n   - Testes de performance\n<ol><li><strong>Interpessoais</strong></li>\n</ol>   - Comunicação eficaz\n   - Resolução de problemas\n   - Pensamento crítico\n   - Adaptabilidade\n\n<h3>Roadmap de Capacitação</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Trimestre</th><th>Foco</th><th>Ação</th></tr>\n<tr><td>Q1</td><td>Fundamentos</td><td>Certificação ISTQB Foundation</td></tr>\n<tr><td>Q2</td><td>Automação</td><td>Aprender Playwright ou Cypress</td></tr>\n<tr><td>Q3</td><td>Cloud &amp; DevOps</td><td>AWS/Azure DevOps certification</td></tr>\n<tr><td>Q4</td><td>IA em QA</td><td>Hands-on com ferramentas de IA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>As tendências de QA para 2025 e 2026 estão redefinindo como as organizações abordam a qualidade de software. A convergência de IA, automação avançada, Shift-Left e DevOps cria oportunidades sem precedentes para equipes que sabem aproveitar essas tecnologias.</p>\n\n<p><strong>Principais Aprendizados:</strong></p>\n\n<p>✅ IA e GenAI estão transformando a QA, mas a implementação em escala ainda é um desafio  <br>✅ Automação é essencial, mas testes manuais e exploratórios permanecem importantes  <br>✅ Segurança deve ser tratada como prioridade estratégica  <br>✅ Shift-Left reduz custos e melhora a qualidade  <br>✅ Cloud testing oferece escalabilidade e flexibilidade</p>\n\n<p><strong>Chamada para Ação:</strong> Comece hoje mesmo a avaliar qual dessas tendências se aplica ao seu contexto e implemente incrementalmente. A qualidade de software não é um destino, mas uma jornada contínua de melhoria.</p>\n\n<hr>\n<h3>FAQ - Perguntas Frequentes sobre Tendências de QA</h3>\n\n<p><strong>P: Qual é a tendência mais impactante para QA em 2025?</strong>  <br>R: A IA e GenAI em QA são as mais impactantes, permitindo automação inteligente, geração automática de testes e manutenção preditiva.</p>\n\n<p><strong>P: Testes manuais ainda são necessários?</strong>  <br>R: Sim! Embora a automação cresça, testes manuais são essenciais para usabilidade, UX, cenários complexos e exploratory testing.</p>\n\n<p><strong>P: Quanto devo investir em ferramentas de teste em nuvem?</strong>  <br>R: O investimento varia conforme a escala. Plataformas como BrowserStack oferecem planos a partir de $29/mês para equipes pequenas.</p>\n\n<p><strong>P: Como começar com IA em QA?</strong>  <br>R: Comece com ferramentas maduras como Applitools para testes visuais ou Mabl para automação inteligente. Avalie ROI antes de escalar.</p>\n\n<p><strong>P: Qual é o futuro dos testadores manuais?</strong>  <br>R: Profissionais de QA estão evoluindo para engenheiros de qualidade, combinando habilidades manuais com técnicas de automação e análise de dados.</p>\n\n<hr>\n<em>Fonte: PixelQA, Kualitee, a1qa - Tendências QA 2025, World Quality Report 2025, Gartner Research</em>', 'Tendências de QA para 2025: O Futuro dos Testes de Software e Garantia de Qualidade', '', 'publish', 'closed', 'open', '', '02tendenciasqa2025', '', '', '2026-07-06 23:05:49', '2026-07-07 02:05:49', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/02tendenciasqa2025/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('179', '0', '2026-07-06 23:05:52', '2026-07-07 02:05:52', '<p><strong>Meta Description:</strong> Conheça todos os tipos de testes de software: funcionais, não-funcionais, unitários, integração, sistema e mais. Guia completo com definições, objetivos e melhores práticas.</p>\n\n<hr>\n<h2>Introdução aos Tipos de Testes de Software</h2>\n\n<p>Os testes de software são uma atividade crítica no ciclo de desenvolvimento de sistemas. Compreender os diferentes tipos de testes e quando aplicá-los é fundamental para garantir a qualidade e confiabilidade das aplicações.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-12.gif\" alt=\"Pirâmide de Testes - Hierarquia de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este guia completo apresenta uma categorização detalhada dos principais tipos de testes de software, suas finalidades, características e quando cada um deve ser utilizado no seu projeto.</p>\n\n<hr>\n<h2>Categorização Geral dos Testes</h2>\n\n<p>Os testes de software podem ser divididos em duas categorias principais:</p>\n\n<h3>1. Testes Funcionais</h3>\n\n<p>Verificam se o software funciona conforme especificado, testando funcionalidades específicas e requisitos do negócio.</p>\n\n<h3>2. Testes Não-Funcionais</h3>\n\n<p>Avaliam características como performance, segurança, usabilidade e confiabilidade, que não estão relacionadas a funcionalidades específicas.</p>\n\n<hr>\n<h2>Testes Funcionais: Garantindo o Comportamento Correto</h2>\n\n<h3>Teste Unitário: A Base de Tudo</h3>\n\n<p>O teste unitário é o tipo mais básico de teste, onde cada unidade de código (geralmente uma função ou método) é testada isoladamente. Esta atividade é realizada durante as etapas de desenvolvimento pelos próprios desenvolvedores.</p>\n\n<h4>Objetivos dos Testes Unitários</h4>\n\n<ul><li><strong>Identificar falhas em componentes individuais</strong> - Detectar problemas cedo</li><ol><li><strong>Garantir que cada função trabalha corretamente</strong> - Validação granular</li>\n<li><strong>Facilitar a detecção precoce de defeitos</strong> - Redução de custos</li>\n<li><strong>Documentar o código</strong> - Testes como especificação executável</li>\n<li><strong>Permitir refactoring seguro</strong> - Confiança ao modificar código</li>\n</ol>\n<h4>Exemplo Prático em Python (pytest)</h4>\n\n<pre><code>def calcular_desconto(valor_original, percentual):\n    \"\"\"Calcula o valor do desconto.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual deve estar entre 0 e 100\")\n    desconto = valor_original * (percentual / 100)\n    return valor_original - desconto\n\n<p>def test_calcular_desconto_10_porcento():<br>    assert calcular_desconto(100, 10) == 90</p>\n\n<p>def test_calcular_desconto_50_porcento():<br>    assert calcular_desconto(200, 50) == 100</p>\n\n<p>def test_calcular_desconto_invalido():<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 150)<br></code></pre></p>\n\n<h4>Frameworks Populares para Testes Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Framework</th><th>Características</th></tr>\n<tr><td>Java</td><td>JUnit 5, TestNG</td><td>Mais popular, extensível</td></tr>\n<tr><td>JavaScript</td><td>Jest, Mocha</td><td>Rápido, Mocking fácil</td></tr>\n<tr><td>Python</td><td>pytest, unittest</td><td>Sintaxe simples, fixtures</td></tr>\n<tr><td>C#</td><td>xUnit, NUnit</td><td>.NET ecosystem</td></tr>\n<tr><td>Go</td><td>testing (stdlib)</td><td>Simples, integrado</td></tr>\n</table></figure>\n\n<h4>Melhores Práticas para Testes Unitários</h4>\n\n<p>✅ <strong>Teste apenas uma coisa de cada vez</strong> - Um assert por teste é ideal  <br>✅ <strong>Nomes descritivos</strong> - <code>test_deve_retornar_erro_quando_usuario_invalido</code>  <br>✅ <strong>Independência</strong> - Testes não devem depender uns dos outros  <br>✅ <strong>Rapidez</strong> - Unit tests devem executar em milissegundos  <br>✅ <strong>Isolamento</strong> - Use mocks para dependências externas</p>\n\n<hr>\n<h3>Teste de Integração: Verificando Conexões</h3>\n\n<p>O teste de integração verifica a comunicação entre diferentes módulos ou componentes do sistema. Este tipo de teste é crucial para garantir que as partes do sistema funcionam corretamente quando combinadas.</p>\n\n<h4>Características Principais</h4>\n<ol><li><strong>Valida interfaces e interações entre componentes</strong> - Fluxo de dados correto</li>\n<li><strong>Identifica problemas de comunicação</strong> - API mismatches, protocolos</li>\n<li><strong>Pode ser realizado de forma incremental ou big-bang</strong> - Duas abordagens</li>\n<li><strong>Testa camadas de persistência</strong> - Bancos de dados, APIs externas</li>\n</ol>\n<h4>Estratégias de Integração</h4>\n\n<p>##### 1. Big-Bang Integration</p>\n\n<p>Todos os componentes são integrados simultaneamente e testados juntos.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Simples de implementar</li><br><li>Bom para sistemas pequenos</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Difícil localização de erros</li><br><li>Todos os módulos devem estar prontos</li><br></ol><br>##### 2. Incremental Integration (Bottom-Up)</p>\n\n<p>Começa pelos módulos mais baixos e集成 progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Defeitos fáceis de isolar</li><br><li>Feedback contínuo</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode ter módulos de alto nível sem testes até o final</li><br></ol><br>##### 3. Incremental Integration (Top-Down)</p>\n\n<p>Começa pelos módulos de mais alto nível e desce progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Interface do usuário testada primeiro</li><br><li>Protótipo funcional rápido</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Módulos de baixo nível simulados (stubs)</li><br></ol><br><h4>Exemplo de Teste de Integração (REST API)</h4></p>\n\n<pre><code>import requests\nimport pytest\n\n<p>class TestUserAPI:<br>    BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>def test_criar_usuario(self):<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"senha123\"<br>        }<br>        response = requests.post(f\"{self.BASE_URL}/usuarios\", json=payload)</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data</p>\n\n<p>def test_listar_usuarios(self):<br>        response = requests.get(f\"{self.BASE_URL}/usuarios\")</p>\n\n<p>assert response.status_code == 200<br>        assert isinstance(response.json(), list)<br></code></pre></p>\n\n<hr>\n<h3>Teste de Sistema: Visão Holística</h3>\n\n<p>O teste de sistema avalia o software como um todo, verificando se todos os componentes funcionam juntos para atender aos requisitos definidos.</p>\n\n<h4>O Que é Testado no Nível de Sistema?</h4>\n<ol><li><strong>Integração entre todos os módulos</strong></li>\n<li><strong>Fluxos de negócio completos</strong></li>\n<li><strong>Conformidade com requisitos funcionais</strong></li>\n<li><strong>Interface com sistemas externos</strong></li>\n<li><strong>Performance do sistema integrado</strong></li>\n<li><strong>Segurança end-to-end</strong></li>\n</ol>\n<h4>Exemplo: Fluxo de E-commerce</h4>\n\n<pre><code>Usuário → Login → Navegação → Carrinho → Checkout → Pagamento → Confirmação\n    ↓         ↓          ↓           ↓           ↓            ↓            ↓\n Cadastro   Session   Produtos    Estoque     Frete        Stripe     E-mail\n   ↕          ↕         ↕          ↕          ↕            ↕          ↕\n  DB        Redis     DB/API     DB         Correios      API       SMTP\n</code></pre>\n\n<p>Cada seta representa um ponto de integração que deve ser testado no nível de sistema.</p>\n\n<hr>\n<h3>Teste de Aceitação: Validando com o Cliente</h3>\n\n<p>O teste de aceitação determina se um produto ou sistema atende às expectativas e requisitos do cliente. Este é frequentemente o último nível de teste antes da entrega正式.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto certo?\"</strong></p>\n\n<h4>Tipos de Teste de Aceitação</h4>\n\n<p>##### 1. Teste de Aceitação do Usuário (UAT)</p>\n\n<p>Usuários finais testam o sistema em um ambiente semelhante ao de produção.</p>\n\n<p>##### 2. Teste de Aceitação Operacional (OAT)</p>\n\n<p>Equipe de operações validabackup, recuperação, relatórios.</p>\n\n<p>##### 3. Teste de Aceitação Contratual</p>\n\n<p>Verifica se o sistema atende aos critérios contratuais.</p>\n\n<h4>Características do UAT</h4>\n<ol><li>Geralmente envolve cooperação ou feedback do cliente</li>\n<li>Atividade de validação com dados reais</li>\n<li>Foco na usabilidade e fluxo de negócio</li>\n<li>Pode revelar requisitos mal entendidos</li>\n<li>Último checkpoint antes do go-live</li>\n</ol>\n<hr>\n<h3>Teste Funcional: Verificando Funcionalidades</h3>\n\n<p>O teste funcional determina se um recurso ou sistema funciona corretamente sem problemas. Verifica o sistema em diferentes níveis para garantir que todos os cenários são cobertos.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto da forma certa?\"</strong></p>\n\n<h4>Técnicas de Teste Funcional</h4>\n\n<p>##### 1. Teste Baseado em Requisitos<br><ol><li>Cada requisito tem casos de teste correspondentes</li><br><li>Rastreabilidade entre requisitos e testes</li><br><li>Cobertura completa</li><br></ol><br>##### 2. Teste Baseado em Casos de Uso<br><ol><li>Cenários de usuário documentados</li><br><li>Fluxos principais e alternativos</li><br><li>Pré-condições e pós-condições</li><br></ol><br>##### 3. Teste de Tabela de Decisão<br><ol><li>Combinações de condições e ações</li><br><li>Útil para regras de negócio complexas</li><br></ol><br>##### 4. Teste de Transição de Estado<br><ol><li>Mudanças de estado do sistema</li><br><li>Diagramas de estado</li><br></ol><br><hr><br><h2>Testes Não-Funcionais: Avaliando Qualidade Oculta</h2></p>\n\n<h3>Teste de Desempenho: Rapidez e Estabilidade</h3>\n\n<figure><img src=\"https://media.giphy.com/media/l0Iy69RBwNTRF0MXi/giphy.gif\" alt=\"Performance Testing - Testes de Desempenho\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de desempenho avalia a velocidade, responsividade e estabilidade do sistema sob carga de trabalho. É crítico para garantir que a aplicação atende aos SLAs (Service Level Agreements).</p>\n\n<h4>Subtipo 1: Teste de Carga (Load Testing)</h4>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas.</p>\n\n<p><strong>Métricas Coletadas:</strong><ol><li>Tempo de resposta (média, p95, p99)</li><br><li>Throughput (requisições por segundo)</li><br><li>Utilização de recursos (CPU, memória, disco)</li><br><li>Taxa de erros</li><br></ol><br><strong>Ferramentas Populares:</strong><ol><li>JMeter</li><br><li>Gatling</li><br><li>k6</li><br><li>Locust</li><br></ol><br><h4>Subtipo 2: Teste de Estresse (Stress Testing)</h4></p>\n\n<p>Avalia os limites do sistema além da capacidade normal para identificar o ponto de quebra.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar capacidade máxima</li><br><li>Verificar comportamento sob overload</li><br><li>Medir tempo de recuperação</li><br><li>Validar failovers</li><br></ol><br><h4>Subtipo 3: Teste de Resistência (Soak Testing)</h4></p>\n\n<p>Executa o sistema sob carga por períodos prolongados para identificar degradação gradual.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Conexões não fechadas</li><br><li>Acúmulo de logs</li><br><li>Degradação de performance</li><br></ol><br><h4>Subtipo 4: Teste de Pico (Spike Testing)</h4></p>\n\n<p>Avalia reações do sistema a picos súbitos de carga.</p>\n\n<p><strong>Cenário Exemplo:</strong><br><pre><code>Carga normal: 1000 usuários<br>Pico: 5000 usuários em 10 segundos<br>Recovery: Voltar para 1000 usuários<br></code></pre></p>\n\n<h4>Ferramentas de Teste de Desempenho</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>JMeter</strong></td><td>Open Source</td><td>Java</td><td>Enterprise, complexo</td></tr>\n<tr><td><strong>Gatling</strong></td><td>Open Source</td><td>Scala</td><td>DevOps, CI/CD</td></tr>\n<tr><td><strong>k6</strong></td><td>Open Source</td><td>JavaScript</td><td>Moderno, extensível</td></tr>\n<tr><td><strong>Locust</strong></td><td>Open Source</td><td>Python</td><td>Python teams</td></tr>\n<tr><td><strong>LoadRunner</strong></td><td>Comercial</td><td>Various</td><td>Enterprise</td></tr>\n</table></figure>\n\n<h4>Exemplo de Teste de Carga com k6</h4>\n\n<pre><code>// script.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },  // Ramp-up<br>    { duration: \'5m\', target: 100 },  // Steady state<br>    { duration: \'2m\', target: 200 },  // Spike<br>    { duration: \'5m\', target: 200 },  // Steady state<br>    { duration: \'2m\', target: 0 },    // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // Menos de 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/produtos\');<br>  check(res, {<br>    \'status é 200\': (r) =&gt; r.status === 200,<br>    \'tempo  r.timings.duration &lt; 500,<br>  });<br>  sleep(1);<br>}<br></code></pre></p>\n\n<hr>\n<h3>Teste de Segurança: Protegendo Dados e Sistemas</h3>\n\n<figure><img src=\"https://media.giphy.com/media/1qfDU4MJv3jWu34hEx/giphy.gif\" alt=\"Security Testing - Escudo de Segurança\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de segurança identifica vulnerabilidades e garante proteção de dados. Em um mundo cada vez mais digital, a segurança é prioridade.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n\n<p>##### 1. Teste de Penetração (Pen Test)</p>\n\n<p>Simula ataques para identificar vulnerabilidades antes que hackers maliciosos o façam.</p>\n\n<p><strong>Metodologias:</strong><ol><li>OWASP Testing Guide</li><br><li>PTES (Penetration Testing Execution Standard)</li><br><li>NIST SP 800-115</li><br></ol><br><strong>Tipos de Pentest:</strong><ol><li><strong>Black Box:</strong> Sem conhecimento prévio</li><br><li><strong>White Box:</strong> Código e documentação</li><br><li><strong>Gray Box:</strong> Conhecimento parcial</li><br></ol><br>##### 2. Varredura de Vulnerabilidade</p>\n\n<p>Identifica pontos fracos conhecidos através de scanning automatizado.</p>\n\n<p><strong>Ferramentas:</strong><ol><li>Nessus</li><br><li>OpenVAS</li><br><li>Qualys</li><br><li>Nexpose</li><br></ol><br>##### 3. Teste de Firewall e WAF</p>\n\n<p>Verifica configurações de segurança de firewalls e Web Application Firewalls.</p>\n\n<p><strong>O que testar:</strong><ol><li>Regras de firewall</li><br><li>Block de IPs maliciosos</li><br><li>Detecção de SQL Injection</li><br><li>Proteção XSS</li><br></ol><br>##### 4. Análise de Código Estático (SAST)</p>\n\n<p>Detecta vulnerabilidades no código-fonte sem executá-lo.</p>\n\n<p><strong>Ferramentas SAST:</strong><ol><li>SonarQube</li><br><li>Checkmarx</li><br><li>Fortify</li><br><li>Snyk Code</li><br></ol><br>##### 5. Análise de Componentes (SCA)</p>\n\n<p>Identifica vulnerabilidades em bibliotecas e dependências.</p>\n\n<p><strong>Ferramentas SCA:</strong><ol><li>Snyk</li><br><li>OWASP Dependency-Check</li><br><li>WhiteSource</li><br><li>Dependabot</li><br></ol><br><h4>OWASP Top 10: Vulnerabilidades Mais Comuns</h4><br><ol><li><strong>A01 - Broken Access Control</strong></li><br><li><strong>A02 - Cryptographic Failures</strong></li><br><li><strong>A03 - Injection</strong></li><br><li><strong>A04 - Insecure Design</strong></li><br><li><strong>A05 - Security Misconfiguration</strong></li><br><li><strong>A06 - Vulnerable Components</strong></li><br><li><strong>A07 - Authentication Failures</strong></li><br><li><strong>A08 - Software and Data Integrity Failures</strong></li><br><li><strong>A09 - Security Logging Failures</strong></li><br><li><strong>A10 - SSRF (Server-Side Request Forgery)</strong></li><br></ol><br><hr><br><h3>Teste de Usabilidade: Experiência do Usuário</h3></p>\n\n<p>Avalia a facilidade de uso e a experiência do usuário com o sistema. O teste de usabilidade é essencial para garantir que os usuários consigam realizar suas tarefas de forma eficiente.</p>\n\n<h4>Critérios de Usabilidade</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Critério</th><th>Definição</th><th>Métrica</th></tr>\n<tr><td><strong>Eficácia</strong></td><td>Usuário consegue completar tarefa?</td><td>Taxa de sucesso</td></tr>\n<tr><td><strong>Eficiência</strong></td><td>Quanto tempo leva?</td><td>Tempo de tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Usuário gostou?</td><td>Questionários SUS</td></tr>\n<tr><td><strong>Aprendizagem</strong></td><td>Quanto tempo para aprender?</td><td>Tempo até proficiência</td></tr>\n<tr><td><strong>Memorização</strong></td><td>Lembra como usar?</td><td>Retenção após pausa</td></tr>\n</table></figure>\n\n<h4>Métodos de Teste de Usabilidade</h4>\n<ol><li><strong>Testes com Usuários</strong> - Sessões gravadas com participantes</li>\n<li><strong>Análise Heurística</strong> - Avaliação por especialistas</li>\n<li><strong>Questionários</strong> - SUS, SEQ, NPS</li>\n<li><strong>Eye Tracking</strong> - Rastreamento ocular</li>\n<li><strong>Análise de Tarefas</strong> - Tempos e erros</li>\n</ol>\n<h4>Frameworks de Avaliação</h4>\n<ol><li><strong>Nielsen\'s Heurísticas</strong> (10 princípios)</li>\n<li><strong>ISO 9241-11</strong> (Usabilidade)</li>\n<li><strong>WCAG 2.1</strong> (Acessibilidade)</li>\n</ol>\n<hr>\n<h3>Teste de Compatibilidade: Funciona em Todo Lugar?</h3>\n\n<p>Verifica se o software funciona em diferentes ambientes, navegadores e dispositivos.</p>\n\n<h4>Tipos de Teste de Compatibilidade</h4>\n\n<p>##### 1. Teste de Navegador (Cross-Browser)<br><ol><li>Chrome, Firefox, Safari, Edge</li><br><li>Diferentes versões</li><br><li>Modos de compatibilidade</li><br></ol><br>##### 2. Teste Mobile<br><ol><li>iOS (iPhone, iPad)</li><br><li>Android (diferentes fabricantes)</li><br><li>Diferentes tamanhos de tela</li><br><li>Diferentes versões de OS</li><br></ol><br>##### 3. Teste de Sistema Operacional<br><ol><li>Windows 10, 11</li><br><li>macOS (versões diferentes)</li><br><li>Linux (distribuições populares)</li><br></ol><br>##### 4. Teste de Hardware<br><ol><li>Diferentes processadores</li><br><li>Diferentes quantidades de RAM</li><br><li>Diferentes resoluções de tela</li><br></ol><br><h4>Ferramentas de Teste Cross-Browser</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Cobertura</th><th>Preço</th></tr>\n<tr><td>BrowserStack</td><td>3000+ dispositivos</td><td>$29+/mês</td></tr>\n<tr><td>Sauce Labs</td><td>1000+ dispositivos</td><td>$39+/mês</td></tr>\n<tr><td>LambdaTest</td><td>3000+ dispositivos</td><td>$15+/mês</td></tr>\n<tr><td>CrossBrowserTesting</td><td>1500+ dispositivos</td><td>$29+/mês</td></tr>\n</table></figure>\n\n<hr>\n<h3>Teste de Recuperação: Resistência a Falhas</h3>\n\n<p>Avalia a capacidade do sistema de se recuperar de falhas e disasters. É crucial para sistemas críticos que não podem ficar fora do ar.</p>\n\n<h4>Cenários de Teste</h4>\n<ol><li><strong>Falha de Hardware</strong></li>\n</ol>   - Perda de disco\n   - Falha de memória\n   - Queda de servidor\n<ol><li><strong>Falha de Software</strong></li>\n</ol>   - Crash de aplicação\n   - Deadlock\n   - Exceções não tratadas\n<ol><li><strong>Falha de Rede</strong></li>\n</ol>   - Perda de conectividade\n   - Alta latência\n   - Timeout\n<ol><li><strong>Desastres</strong></li>\n</ol>   - Perda de datacenter\n   - Corrupção de dados\n   - Ataques DDoS\n\n<h4>Métricas de Recuperação</h4>\n<ol><li><strong>RTO (Recovery Time Objective):</strong> Tempo máximo para recuperação</li>\n<li><strong>RPO (Recovery Point Objective):</strong> Perda máxima de dados aceitável</li>\n<li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li>\n<li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li>\n</ol>\n<hr>\n<h2>Testes de Regressão: Mantendo a Qualidade</h2>\n\n<p>Executados sempre que o código é modificado para garantir que alterações não introduzam novos defeitos. Este é um dos tipos de teste mais importantes e frequentemente executados.</p>\n\n<h3>Quando Executar Testes de Regressão</h3>\n\n<p>✅ Após cada release de software  <br>✅ Após correção de bugs  <br>✅ Após atualizações de dependências  <br>✅ Após refactoring de código  <br>✅ Antes do deploy de produção</p>\n\n<h3>Estratégias de Testes de Regressão</h3>\n\n<h4>1. Regressão Completa</h4>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura total</li><br><li>Alta confiança</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Tempo longo</li><br><li>Custo elevado</li><br></ol><br><h4>2. Regressão Seletiva</h4></p>\n\n<p>Seleciona testes relevantes baseados em mudanças.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Mais rápido</li><br><li>Mais econômico</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode perder cobertura</li><br></ol><br><h4>3. Regressão Prioritária</h4></p>\n\n<p>Executa testes por prioridade (críticos &gt; altos &gt; médios &gt; baixos).</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura do crítico rápido</li><br><li>Decisões baseadas em risco</li><br></ol><br><h3>Automação de Testes de Regressão</h3></p>\n\n<p>A automação é essencial para testes de regressão eficazes:</p>\n\n<p><strong>Benefícios:</strong><ol><li>Execução frequente</li><br><li>Resultados consistentes</li><br><li>Rapidez</li><br><li>Cobertura ampla</li><br></ol><br><strong>Ferramentas Recomendadas:</strong><ol><li>Selenium WebDriver</li><br><li>Playwright</li><br><li>Cypress</li><br><li>Appium (mobile)</li><br><li>RestAssured (API)</li><br></ol><br><hr><br><h2>Pirâmide de Testes: Arquitetura Ideal</h2></p>\n\n<p>A pirâmide de testes é um conceito fundamental que guia a distribuição dos tipos de teste:</p>\n\n<pre><code>                    /\n                   /  \n                  / E2E        ← Poucos testes E2E (lentos, caros)\n                 /      \n                /Integração   ← Alguns testes de integração\n               /            \n              /  Unitários     ← Muitos testes unitários (rápidos, baratos)\n             /________________\n</code></pre>\n\n<h3>Proporções Ideais</h3>\n<ol><li><strong>Unitários:</strong> 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>Integração:</strong> 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>E2E:</strong> 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Compreender os diferentes tipos de testes de software é fundamental para construir uma estratégia de QA eficaz. Cada tipo de teste tem seu propósito específico e deve ser aplicado no momento adequado do ciclo de desenvolvimento.</p>\n\n<p><strong>Resumo dos Tipos de Testes:</strong></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Categoria</th><th>Tipo</th><th>Quando Usar</th><th>Objetivo</th></tr>\n<tr><td><strong>Funcional</strong></td><td>Unitário</td><td>Desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Integração</td><td>Pós-unitário</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Sistema</td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Aceitação</td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Performance</td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Segurança</td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Usabilidade</td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n</table></figure>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem todo projeto precisa de todos os tipos</li><br><li><strong>Priorize</strong> - Comece com unitários e integração</li><br><li><strong>Automatize</strong> - Regressão deve ser automática</li><br><li><strong>Meça</strong> - Cobertura, tempo, defeitos encontrados</li><br><li><strong>Melhore</strong> - Itere constantemente</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre Tipos de Testes</h3></p>\n\n<p><strong>P: Quantos tipos de testes existem?</strong>  <br>R: Existem dozens de tipos de testes classificados de diferentes formas. Os principais são funcionais e não-funcionais, cada um com subtipos específicos.</p>\n\n<p><strong>P: Qual a diferença entre teste de sistema e teste de aceitação?</strong>  <br>R: Teste de sistema verifica se o sistema atende aos requisitos técnicos. Teste de aceitação verifica se o sistema atende às expectativas do usuário/cliente.</p>\n\n<p><strong>P: Testes manuais podem ser substituídos por automatizados?</strong>  <br>R: Não completamente. Testes manuais são essenciais para exploratory testing, UX e cenários complexos. A automação complementa, não substitui.</p>\n\n<p><strong>P: Quando devo começar a testar?</strong>  <br>R: O mais cedo possível! O conceito de Shift-Left recomenda testes desde as primeiras fases do desenvolvimento.</p>\n\n<p><strong>P: Qual a ordem ideal de execução dos testes?</strong>  <br>R: Unitários → Integração → Sistema → Aceitação. Cada nível depende do anterior.</p>\n\n<hr>\n<em>Fonte: Selenium.dev, Atlassian, Vericode, ISTQB, OWASP</em>', 'Tipos de Testes de Software: Guia Completo com Exemplos Práticos', '', 'publish', 'closed', 'open', '', '03tipostestessoftware', '', '', '2026-07-06 23:05:52', '2026-07-07 02:05:52', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/03tipostestessoftware/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('180', '0', '2026-07-06 23:05:54', '2026-07-07 02:05:54', '<p><strong>Meta Description:</strong> Comparação completa entre os principais frameworks de automação de testes: Playwright, Cypress e Selenium. Análise de performance, features e recomendações para 2026.</p>\n\n<hr>\n<h2>Introdução ao Benchmark de Frameworks</h2>\n\n<p>Em 2026, três frameworks dominam a conversa de automação de testes: <strong>Selenium</strong>, <strong>Playwright</strong> e <strong>Cypress</strong>. A escolha do framework influencia diretamente a confiabilidade dos testes, carga de manutenção, velocidade de execução e entrega de software.</p>\n\n<figure><img src=\"https://media.giphy.com/media/l4q8cJzGdR9J8wDyA/giphy.gif\" alt=\"Code Testing - Automação de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este benchmark detalhado compara cada framework sob múltiplas dimensões para ajudá-lo a tomar a melhor decisão para seu projeto.</p>\n\n<hr>\n<h2>Comparativo Geral em 2026</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Aspecto</th><th>Playwright</th><th>Cypress</th><th>Selenium</th></tr>\n<tr><td><strong>Velocidade</strong></td><td>⭐⭐⭐⭐⭐ Mais rápido</td><td>⭐⭐⭐⭐ Médio</td><td>⭐⭐⭐ Mais lento</td></tr>\n<tr><td><strong>Paralelização</strong></td><td>⭐⭐⭐⭐⭐ Excelente</td><td>⭐⭐⭐⭐ Boa</td><td>⭐⭐⭐ Limitada</td></tr>\n<tr><td><strong>Custo CI</strong></td><td>⭐⭐⭐⭐⭐ Menor</td><td>⭐⭐⭐⭐ Médio</td><td>⭐⭐⭐⭐ Maior</td></tr>\n<tr><td><strong>Confiabilidade</strong></td><td>⭐⭐⭐⭐⭐ Alta</td><td>⭐⭐⭐⭐ Alta</td><td>⭐⭐⭐ Média</td></tr>\n<tr><td><strong>Curva de Aprendizado</strong></td><td>⭐⭐⭐ Média</td><td>⭐⭐⭐⭐ Fácil</td><td>⭐⭐⭐⭐⭐ Fácil</td></tr>\n<tr><td><strong>Suporte Browser</strong></td><td>⭐⭐⭐⭐⭐ Chrome, Firefox, Safari, Edge</td><td>⭐⭐⭐⭐ Chrome, Firefox, Edge</td><td>⭐⭐⭐⭐⭐ Todos</td></tr>\n<tr><td><strong>Comunidade</strong></td><td>⭐⭐⭐⭐ Em crescimento</td><td>⭐⭐⭐⭐ Grande</td><td>⭐⭐⭐⭐⭐ Massiva</td></tr>\n<tr><td><strong>Documentação</strong></td><td>⭐⭐⭐⭐⭐ Excelente</td><td>⭐⭐⭐⭐⭐ Excelente</td><td>⭐⭐⭐ Boa</td></tr>\n<tr><td><strong>Manutenção</strong></td><td>⭐⭐⭐⭐⭐ Baixa</td><td>⭐⭐⭐⭐ Média</td><td>⭐⭐⭐⭐⭐ Alta</td></tr>\n</table></figure>\n\n<hr>\n<h2>1. Selenium: O Padrão da Indústria</h2>\n\n<h3>História e Visão Geral</h3>\n\n<p>O Selenium é o framework mais estabelecido com mais de uma década de adoção enterprise. Foi criado em 2004 e desde então se tornou sinônimo de automação de testes web.</p>\n\n<figure><img src=\"https://media.giphy.com/media/7F7JL3BBaIN2I/giphy.gif\" alt=\"Selenium - Framework de Automação\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h3>Características Principais</h3>\n\n<ul><li><strong>Longevidade:</strong> 20+ anos de desenvolvimento contínuo</li><ol><li><strong>Adoção:</strong> Milhares de organizações em todo o mundo</li>\n<li><strong>Ecossistema:</strong> Amplo com ferramentas complementares</li>\n<li><strong>Suporte a Linguagens:</strong> Java, Python, C#, JavaScript, Ruby, Kotlin</li>\n</ol>\n<h3>Vantagens do Selenium</h3>\n\n<p>✅ <strong>Suporte cross-browser excepcional</strong> - Funciona com Chrome, Firefox, Safari, Edge, Opera, IE  <br>✅ <strong>Ampla comunidade e documentação</strong> - Milhares de tutoriais e recursos  <br>✅ <strong>Integração com múltiplas linguagens</strong> - Escolha a melhor para seu time  <br>✅ <strong>Ecossistema maduro</strong> - Selenium IDE, Selenium Grid, Appium  <br>✅ <strong>Flexibilidade</strong> - Controle total sobre Browser Driver  <br>✅ <strong>Grid para paralelização</strong> - Execute testes em múltiplas máquinas</p>\n\n<h3>Desvantagens do Selenium</h3>\n\n<p>❌ <strong>Execução mais lenta</strong> - Comparado a alternativas modernas  <br>❌ <strong>Manutenção de testes pode ser complexa</strong> - Locators frágeis  <br>❌ <strong>Requer configuração manual de WebDriver</strong> - Gestion manual de versões  <br>❌ <strong>Waits implícitos problemáticos</strong> - Pode causar flaky tests  <br>❌ <strong>API verbosa</strong> - Muito código para testes simples</p>\n\n<h3>Exemplo de Código Selenium</h3>\n\n<pre><code>from selenium import webdriver\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\nfrom selenium.webdriver.chrome.service import Service\n\n<p>def test_login_sucesso():<br>    # Configuração<br>    service = Service(\'/path/to/chromedriver\')<br>    driver = webdriver.Chrome(service=service)</p>\n\n<p>try:<br>        # Navegação<br>        driver.get(\'https://exemplo.com/login\')</p>\n\n<p># Esperar elemento<br>        wait = WebDriverWait(driver, 10)<br>        username = wait.until(<br>            EC.presence_of_element_located((By.ID, \'username\'))<br>        )</p>\n\n<p># Ações<br>        username.send_keys(\'usuario@teste.com\')<br>        driver.find_element(By.ID, \'password\').send_keys(\'senha123\')<br>        driver.find_element(By.ID, \'login-button\').click()</p>\n\n<p># Assertions<br>        assert \'Dashboard\' in driver.title<br>        wait.until(EC.url_contains(\'dashboard\'))</p>\n\n<p>finally:<br>        driver.quit()<br></code></pre></p>\n\n<h3>Quando Usar Selenium</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Cenário</th><th>Recomendação</th></tr>\n<tr><td>Projeto legacy com Selenium</td><td>Mantenha e evolua</td></tr>\n<tr><td>Necessita IE11 ou Safari antigo</td><td>Selenium é a opção</td></tr>\n<tr><td>Equipe com experiência Selenium</td><td>Use expertise existente</td></tr>\n<tr><td>Sistema com controles complexos</td><td>Flexibilidade do Selenium</td></tr>\n<tr><td>Testing cross-browser crítico</td><td>Selenium Grid</td></tr>\n</table></figure>\n\n<hr>\n<h2>2. Playwright: O Novo Líder de Performance</h2>\n\n<h3>História e Visão Geral</h3>\n\n<p>Playwright emergiu como líder de performance em 2025-2026. Desenvolvido pela Microsoft (mesma equipe do Puppeteer), oferece arquitetura moderna com WebSocket-based communication.</p>\n\n<h3>Características Principais</h3>\n<ol><li><strong>Arquitetura moderna</strong> - WebSocket-based para velocidade</li>\n<li><strong>Suporte nativo a múltiplos contextos de navegador</strong> - Isolamento automático</li>\n<li><strong>Auto-wait mechanisms</strong> - Espera automática por elementos</li>\n<li><strong>Network interception</strong> - Mock de requisições HTTP</li>\n<li><strong>Tracing integrado</strong> - Debug visual completo</li>\n</ol>\n<h3>Vantagens do Playwright</h3>\n\n<p>✅ <strong>Maior velocidade de execução</strong> - 2-10x mais rápido que Selenium  <br>✅ <strong>Suporte robusto para auto-wait</strong> - Menos flaky tests  <br>✅ <strong>Paralelização eficiente</strong> - Browser contexts isolados  <br>✅ <strong>Melhores resultados em benchmarks de 2026</strong> - Líder em performance  <br>✅ <strong>API moderna e intuitiva</strong> - Menos código para fazer mais  <br>✅ <strong>Suporte a múltiplas abas/janelas</strong> - Melhor que Cypress  <br>✅ <strong>Gravações de testes</strong> - Codegen integrado  <br>✅ <strong>Testes mobile web</strong> - Emulando dispositivos reais</p>\n\n<h3>Desvantagens do Playwright</h3>\n\n<p>❌ <strong>Ecossistema menor que Selenium</strong> - Menos integrações de terceiros  <br>❌ <strong>Curva de aprendizado para equipes habituadas a Selenium</strong> - Diferenças conceituais  <br>❌ <strong>Suporte apenas a Chromium, Firefox e Safari</strong> - Não suporta IE11</p>\n\n<h3>Exemplo de Código Playwright</h3>\n\n<pre><code>import asyncio\nfrom playwright.async_api import async_playwright\n\n<p>async def test_login_sucesso():<br>    async with async_playwright() as p:<br>        # Launch browser<br>        browser = await p.chromium.launch()<br>        context = await browser.new_context()<br>        page = await context.new_page()</p>\n\n<p>try:<br>            # Navegação<br>            await page.goto(\'https://exemplo.com/login\')</p>\n\n<p># Ações com auto-wait automático<br>            await page.fill(\'#username\', \'usuario@teste.com\')<br>            await page.fill(\'#password\', \'senha123\')<br>            await page.click(\'#login-button\')</p>\n\n<p># Assertions<br>            await page.wait_for_url(\'**/dashboard\')<br>            await page.wait_for_selector(\'.user-profile\')</p>\n\n<p># Verificação de conteúdo<br>            assert \'Dashboard\' in await page.title()</p>\n\n<p>finally:<br>            await browser.close()</p>\n\n<p># Para execução síncrona<br>def test_login_sucesso_sync():<br>    with sync_playwright() as p:<br>        browser = p.chromium.launch()<br>        page = browser.new_page()</p>\n\n<p>page.goto(\'https://exemplo.com/login\')<br>        page.fill(\'#username\', \'usuario@teste.com\')<br>        page.fill(\'#password\', \'senha123\')<br>        page.click(\'#login-button\')</p>\n\n<p>page.wait_for_url(\'**/dashboard\')<br>        assert \'Dashboard\' in page.title()</p>\n\n<p>browser.close()<br></code></pre></p>\n\n<h3>API Locators no Playwright</h3>\n\n<p>O Playwright introduziu locators modernos que são mais estáveis:</p>\n\n<pre><code># Locator moderno (recomendado)\nlocator = page.get_by_role(\'button\', name=\'Login\')\n\n<p># Locator por texto<br>locator = page.get_by_text(\'Entrar\')</p>\n\n<p># Locator por label<br>locator = page.get_by_label(\'Nome de usuário\')</p>\n\n<p># Locator por placeholder<br>locator = page.get_by_placeholder(\'Digite seu email\')</p>\n\n<p># Locator por teste ID<br>locator = page.get_by_test_id(\'submit-button\')</p>\n\n<p># Locator CSS tradicional<br>locator = page.locator(\'button.submit-btn\')<br></code></pre></p>\n\n<h3>Quando Usar Playwright</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Cenário</th><th>Recomendação</th></tr>\n<tr><td>Novo projeto</td><td>Playwright é a melhor escolha</td></tr>\n<tr><td>Performance crítica</td><td>Playwright líder</td></tr>\n<tr><td>Equipe moderna</td><td>APIs limpas e intuitivas</td></tr>\n<tr><td>CI/CD com alta frequência</td><td>Velocidade importa</td></tr>\n<tr><td>Testes mobile web</td><td>Emulação excelente</td></tr>\n<tr><td>Complexidade de abas/janelas</td><td>Suporte nativo</td></tr>\n</table></figure>\n\n<hr>\n<h2>3. Cypress: Focado na Experiência do Desenvolvedor</h2>\n\n<h3>História e Visão Geral</h3>\n\n<p>Cypress é um framework moderno focado em experiência do desenvolvedor. Diferente do Selenium, Cypress executa dentro do navegador, proporcionando maior controle e debugging.</p>\n\n<h3>Características Principais</h3>\n<ol><li><strong>Execução dentro do navegador</strong> - Não usa WebDriver</li>\n<li><strong>Time travel debugging</strong> - Volte no tempo durante falhas</li>\n<li><strong>Dashboard rico</strong> - Visualização de execuções</li>\n<li><strong>Configuração rápida</strong> - Zero config para projetos React</li>\n<li><strong>Auto-reload</strong> - Testes recarregam automaticamente</li>\n</ol>\n<h3>Vantagens do Cypress</h3>\n\n<p>✅ <strong>Configuração rápida</strong> - Funciona out-of-the-box  <br>✅ <strong>Excelente para testes de front-end</strong> - Integração com React, Vue, Angular  <br>✅ <strong>Dashboard rico para gerenciamento</strong> - Vídeos, screenshots, histórico  <br>✅ <strong>Debugging excepcional</strong> - Time travel, DevTools integrados  <br>✅ <strong>Comandos assíncronos simplificados</strong> - Sintaxe encadeada  <br>✅ <strong>Mock de servidor</strong> - Interceptação de requisições  <br>✅ <strong>Stubbing de funções</strong> - Controle total sobre código</p>\n\n<h3>Desvantagens do Cypress</h3>\n\n<p>❌ <strong>Suporte limitado a múltiplas abas/janelas</strong> - Não suporta bem  <br>❌ <strong>Não suporta iframe sem configurações específicas</strong> - Limitação técnica  <br>❌ <strong>Apenas Chrome-family por padrão</strong> - Firefox e Electron com limitações  <br>❌ <strong>Não suporta múltiplos tabs</strong> - Workflows limitados  <br>❌ <strong>Tests rodam apenas no browser</strong> - Sem suporte a desktop apps</p>\n\n<h3>Exemplo de Código Cypress</h3>\n\n<pre><code>describe(\'Login Flow\', () =&gt; {\n  beforeEach(() =&gt; {\n    cy.visit(\'/login\')\n  })\n\n<p>it(\'should login successfully with valid credentials\', () =&gt; {<br>    // Ações<br>    cy.get(\'#username\').type(\'usuario@teste.com\')<br>    cy.get(\'#password\').type(\'senha123{enter}\')</p>\n\n<p>// Assertions<br>    cy.url().should(\'include\', \'/dashboard\')<br>    cy.get(\'.user-profile\').should(\'be.visible\')<br>    cy.contains(\'Welcome\').should(\'exist\')<br>  })</p>\n\n<p>it(\'should show error with invalid credentials\', () =&gt; {<br>    cy.get(\'#username\').type(\'usuario@teste.com\')<br>    cy.get(\'#password\').type(\'senhaerrada\')<br>    cy.get(\'#login-button\').click()</p>\n\n<p>cy.get(\'.error-message\')<br>      .should(\'be.visible\')<br>      .and(\'contain\', \'Credenciais inválidas\')<br>  })</p>\n\n<p>it(\'should mock API response\', () =&gt; {<br>    cy.intercept(\'POST\', \'/api/login\', {<br>      statusCode: 401,<br>      body: { error: \'Unauthorized\' }<br>    }).as(\'loginRequest\')</p>\n\n<p>cy.get(\'#username\').type(\'usuario@teste.com\')<br>    cy.get(\'#password\').type(\'senha123\')<br>    cy.get(\'#login-button\').click()</p>\n\n<p>cy.wait(\'@loginRequest\')<br>    cy.get(\'.error-message\').should(\'exist\')<br>  })<br>})<br></code></pre></p>\n\n<h3>Quando Usar Cypress</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Cenário</th><th>Recomendação</th></tr>\n<tr><td>Projetos React/Vue/Angular</td><td>Excelente integração</td></tr>\n<tr><td>Desenvolvimento guiado por testes</td><td>Time travel debugging</td></tr>\n<tr><td>Equipe com forte background JS/TS</td><td>Sintaxe familiar</td></tr>\n<tr><td>Debugging frequente</td><td>Ferramentas excelentes</td></tr>\n<tr><td>Mock de APIs</td><td>Interceptação nativa</td></tr>\n<tr><td>Dashboard de testes</td><td>Visualização completa</td></tr>\n</table></figure>\n\n<hr>\n<h2>4. Comparativo Técnico Detalhado</h2>\n\n<h3>Performance Benchmark 2026</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Playwright</th><th>Cypress</th><th>Selenium</th></tr>\n<tr><td><strong>Teste médio (simples)</strong></td><td>0.8s</td><td>1.2s</td><td>2.5s</td></tr>\n<tr><td><strong>Suite 100 testes</strong></td><td>~80s</td><td>~120s</td><td>~250s</td></tr>\n<tr><td><strong>Uso de memória</strong></td><td>Baixo</td><td>Médio</td><td>Alto</td></tr>\n<tr><td><strong>Inicialização</strong></td><td>Rápida</td><td>Rápida</td><td>Lenta</td></tr>\n<tr><td><strong>CI pipeline (30 min)</strong></td><td>18min</td><td>22min</td><td>28min</td></tr>\n</table></figure>\n\n<h3>Suporte a Navegadores</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Browser</th><th>Playwright</th><th>Cypress</th><th>Selenium</th></tr>\n<tr><td>Chrome/Chromium</td><td>✅ Full</td><td>✅ Full</td><td>✅ Full</td></tr>\n<tr><td>Firefox</td><td>✅ Full</td><td>⚠️ Experimental</td><td>✅ Full</td></tr>\n<tr><td>Safari</td><td>✅ Full</td><td>❌ Não suporta</td><td>✅ Full</td></tr>\n<tr><td>Edge</td><td>✅ Full</td><td>✅ Full</td><td>✅ Full</td></tr>\n<tr><td>IE11</td><td>❌ Não suporta</td><td>❌ Não suporta</td><td>✅ Full</td></tr>\n</table></figure>\n\n<h3>Suporte Mobile</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Plataforma</th><th>Playwright</th><th>Cypress</th><th>Selenium</th></tr>\n<tr><td>iOS Safari</td><td>✅ Emulação</td><td>❌ Não</td><td>✅ Emulação</td></tr>\n<tr><td>Android Chrome</td><td>✅ Emulação</td><td>❌ Não</td><td>✅ Emulação</td></tr>\n<tr><td>Real devices</td><td>✅ Via第三方</td><td>❌ Não</td><td>✅ Via Appium</td></tr>\n</table></figure>\n\n<hr>\n<h2>5. Frameworks para Testes Unitários</h2>\n\n<h3>Pytest: O Padrão para Python</h3>\n\n<p>Pytest é um framework de testes \"all in one\" para Python, considerado o melhor framework de testes Python. É utilizado por Mozilla, Dropbox, Django e muitos outros projetos de renome.</p>\n\n<h4>Características</h4>\n<ol><li>Sistema de fixtures poderoso</li>\n<li>Rewriting de assertions</li>\n<li>Modelo de plugins extensível</li>\n<li>Sintaxe simples e intuitiva</li>\n<li>Parametrização de testes</li>\n</ol>\n<h4>Exemplo Pytest</h4>\n\n<pre><code>import pytest\nfrom calculator import Calculator\n\n<p>@pytest.fixture<br>def calculator():<br>    return Calculator()</p>\n\n<p>class TestCalculator:<br>    def test_soma_dois_numeros_positivos(self, calculator):<br>        assert calculator.soma(2, 3) == 5</p>\n\n<p>def test_soma_com_numero_negativo(self, calculator):<br>        assert calculator.soma(-1, 5) == 4</p>\n\n<p>@pytest.mark.parametrize(\"a,b,expected\", [<br>        (0, 0, 0),<br>        (1, 1, 2),<br>        (10, 20, 30),<br>        (-5, 5, 0),<br>    ])<br>    def test_soma_parametrizada(self, calculator, a, b, expected):<br>        assert calculator.soma(a, b) == expected</p>\n\n<p>def test_divisao_por_zero(self, calculator):<br>        with pytest.raises(ZeroDivisionError):<br>            calculator.divide(10, 0)<br></code></pre></p>\n\n<hr>\n<h3>Jest: O Framework JavaScript Mais Popular</h3>\n\n<p>Jest é o framework de testes JavaScript mais popular, integrado ao React e ecossistema Node.js. Desenvolvido pelo Facebook.</p>\n\n<h4>Características</h4>\n<ol><li>Configuração zero para projetos React</li>\n<li>Cobertura de código integrada</li>\n<li>Mocking poderoso</li>\n<li>Testes paralelos</li>\n<li>Snapshots para UI testing</li></ol></ul>\n\n<h4>Exemplo Jest</h4>\n\n<pre><code>// sum.test.js\nfunction sum(a, b) {\n  return a + b;\n}\n\n<p>describe(\'Calculator\', () =&gt; {<br>  test(\'adds two numbers\', () =&gt; {<br>    expect(sum(2, 3)).toBe(5);<br>  });</p>\n\n<p>test(\'adds negative numbers\', () =&gt; {<br>    expect(sum(-1, 1)).toBe(0);<br>  });</p>\n\n<p>describe(\'multiply\', () =&gt; {<br>    const multiply = (a, b) =&gt; a * b;</p>\n\n<p>test.each([<br>      [1, 1, 1],<br>      [2, 3, 6],<br>      [-2, 2, -4],<br>    ])(\'multiply({6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}i, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}i) = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}i\', (a, b, expected) =&gt; {<br>      expect(multiply(a, b)).toBe(expected);<br>    });<br>  });<br>});<br></code></pre></p>\n\n<hr>\n<h2>6. Recomendação Final</h2>\n\n<h3>Framework Recomendado por Cenário</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Cenário</th><th>Recomendação</th><th>Justificativa</th></tr>\n<tr><td><strong>Novo projeto em 2026</strong></td><td>Playwright</td><td>Performance líder, API moderna</td></tr>\n<tr><td><strong>Projeto React moderno</strong></td><td>Cypress</td><td>DX excelente, integração native</td></tr>\n<tr><td><strong>Projeto legacy</strong></td><td>Selenium</td><td>Manter e evoluir gradualmente</td></tr>\n<tr><td><strong>Performance crítica</strong></td><td>Playwright</td><td>2-10x mais rápido</td></tr>\n<tr><td><strong>Testes API + UI</strong></td><td>Playwright</td><td>Suporte completo</td></tr>\n<tr><td><strong>IE11 necessário</strong></td><td>Selenium</td><td>Única opção viável</td></tr>\n<tr><td><strong>Equipes DevOps</strong></td><td>Playwright</td><td>CI/CD otimizado</td></tr>\n<tr><td><strong>BDD/Testes de UX</strong></td><td>Cypress</td><td>Time travel debugging</td></tr>\n</table></figure>\n\n<h3>Conclusão do Benchmark</h3>\n\n<p><strong>Playwright é o framework mais rápido e eficiente em recursos em 2026</strong>, superando Cypress e Selenium em velocidade, paralelização e custo de CI. Para novos projetos, Playwright deve ser a primeira escolha. Para projetos existentes, avalie a migração incremental.</p>\n\n<hr>\n<h3>FAQ - Perguntas Frequentes sobre Frameworks</h3>\n\n<p><strong>P: Devo migrar do Selenium para Playwright?</strong>  <br>R: Depende. Para novos projetos, sim. Para projetos legados com suite madura, avalie custo-benefício. Considere migração incremental.</p>\n\n<p><strong>P: Cypress pode substituir Selenium completamente?</strong>  <br>R: Não em todos os casos. Cypress não suporta múltiplas abas, IE11, ou Safari nativo. Para esses casos, Selenium ou Playwright são necessários.</p>\n\n<p><strong>P: Qual framework tem melhor suporte mobile?</strong>  <br>R: Playwright oferece a melhor experiência mobile com emulação avançada. Selenium requer Appium para mobile testing.</p>\n\n<p><strong>P: Playwright é difícil de aprender?</strong>  <br>R: A curva de aprendizado é moderada. A documentação é excelente e a API é intuitiva. Equipes com experiência em Selenium podem precisar de ajustes mentais.</p>\n\n<p><strong>P: Qual framework tem melhor comunidade?</strong>  <br>R: Selenium ainda tem a maior comunidade. No entanto, Playwright e Cypress estão crescendo rapidamente em popularidade.</p>\n\n<hr>\n<em>Fonte: TestDino, FastBuilder.AI, TowardsAnalytics, Masters Software Testing, Benchmark 2026</em>', 'Benchmark de Frameworks de Testes 2026: Playwright vs Cypress vs Selenium', '', 'publish', 'closed', 'open', '', '04benchmarkframeworks', '', '', '2026-07-06 23:05:54', '2026-07-07 02:05:54', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/04benchmarkframeworks/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('181', '0', '2026-07-06 23:05:56', '2026-07-07 02:05:56', '<p><strong>Meta Description:</strong> Descubra como a Inteligência Artificial está revolucionando a QA: automação inteligente, geração de testes, detecção de anomalias e manutenção preditiva. Guia completo para profissionais.</p>\n\n<hr>\n<h2>Estado Atual da IA em QA</h2>\n\n<p>O <strong>World Quality Report 2025</strong> revela dados impressionantes: quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão ativamente buscando GenAI</strong> em práticas de Quality Engineering (QE), mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} alcançaram implementação em escala empresarial.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-13.gif\" alt=\"AI Brain - Inteligência Artificial em QA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Esta lacuna entre interesse e implementação representa uma oportunidade significativa para profissionais e organizações que souberem aproveitar efetivamente essas tecnologias.</p>\n\n<hr>\n<h2>Por Que a Adoção de IA em QA Está Crescendo?</h2>\n\n<h3>Drivers de Adoção</h3>\n<ol><li><strong>Volume de testes crescente</strong> - Sistemas mais complexos exigem mais testes</li>\n<li><strong>Pressure de velocidade</strong> - CI/CD demanda execuções mais rápidas</li>\n<li><strong>Escassez de profissionais</strong> - Demanda supera oferta de testadores</li>\n<li><strong>Qualidade em produção</strong> - Necessidade de monitoramento contínuo</li>\n<li><strong>Custos crescentes</strong> - Automação inteligente reduz despesas</li>\n</ol>\n<h3>Benefícios Comprovados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Impacto da IA</th></tr>\n<tr><td>Redução de tempo de teste</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de custos de QA</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Melhoria em cobertura</td><td>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Detecção precoce de bugs</td><td>3-5x mais cedo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Desafios de Adoção de IA em QA</h2>\n\n<h3>1. Desalinhamento Estratégico</h3>\n\n<p>Existe um hiato crescente entre o interesse organizacional em GenAI e a prontidão real para adoção efetiva dentro de QE. O caminho da experimentação para implementação é mais complexo do que o antecipado.</p>\n\n<h4>Sinais de Desalinhamento</h4>\n\n<ul><li>GenAI vista como \"solução mágica\" sem estratégia clara</li><ol><li>Falta de alinhamento entre TI e negócios</li>\n<li>Expectativas irreais sobre capacidades</li>\n<li>Subestimação de esforço de integração</li>\n</ol>\n<h3>2. Complexidade de Implementação</h3>\n\n<p>A implementação de IA em QA requer alinhamento entre inovação operacional e oversight estratégico. Desafios incluem:</p>\n\n<h4>Desafios Técnicos</h4>\n<ol><li>Integração com sistemas legados</li>\n<li>Qualidade dos dados de treinamento</li>\n<li>Escolha de modelos adequados</li>\n<li>Manutenção de modelos em produção</li>\n</ol>\n<h4>Desafios Organizacionais</h4>\n<ol><li>Resistência cultural</li>\n<li>Falta de competências</li>\n<li>Processos não adaptados</li>\n<li>Governança de IA</li>\n</ol>\n<h3>3. Questões Éticas e de Governança</h3>\n<ol><li>Viés em modelos de IA</li>\n<li>Transparência nas decisões</li>\n<li>Responsabilidade por falhas</li>\n<li>Conformidade regulatória</li>\n</ol>\n<hr>\n<h2>Aplicações de IA em QA: Casos de Uso Detalhados</h2>\n\n<h3>1. Geração Automatizada de Testes</h3>\n\n<p>IA pode gerar casos de teste automaticamente baseados em requisitos e código. Esta é uma das aplicações mais promissoras.</p>\n\n<figure><img src=\"https://media.giphy.com/media/VbZ0cWw6cVPMM/giphy.gif\" alt=\"Automação de Testes com IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Requisitos → Análise de NLP → Cenários de Teste → Casos de Teste\n    ↓                                                        ↓\n Código → Análise Estática → Cobertura → Testes Sugeridos\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de unit tests</td><td>Diffblue</td></tr>\n<tr><td><strong>Testim</strong></td><td>Testes E2E com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>Automação sem código com IA</td><td>Avo Automation</td></tr>\n</table></figure>\n\n<h4>Exemplo: Geração de Testes com GenAI</h4>\n\n<pre><code># Exemplo conceitual de como IA pode gerar testes\nimport openai\n\n<p>def gerar_testes_para_requisito(requisito):<br>    prompt = f\"\"\"<br>    Gere casos de teste para o seguinte requisito:</p>\n\n<p>Requisito: {requisito}</p>\n\n<p>Formato de saída (JSON):<br>    {{<br>        \"casos_de_teste\": [<br>            {{<br>                \"id\": \"CT-001\",<br>                \"titulo\": \"...\",<br>                \"pre_condicoes\": [...],<br>                \"passos\": [...],<br>                \"dados_teste\": {{...}},<br>                \"resultado_esperado\": \"...\"<br>            }}<br>        ]<br>    }}<br>    \"\"\"</p>\n\n<p>response = openai.chat.completions.create(<br>        model=\"gpt-4\",<br>        messages=[{\"role\": \"user\", \"content\": prompt}]<br>    )</p>\n\n<p>return json.loads(response.choices[0].message.content)<br></code></pre></p>\n\n<h3>2. Detecção de Anomalias</h3>\n\n<p>Algoritmos de machine learning identificam padrões incomuns que indicam defeitos, revolucionando o monitoramento de qualidade.</p>\n\n<h4>Técnicas Utilizadas</h4>\n\n<p>##### Análise de Séries Temporais<br><ol><li>Identificação de anomalias em métricas de performance</li><br><li>Detecção de degradação gradual</li><br><li>Alertas proativos sobre problemas</li><br></ol><br>##### Clustering<br><ol><li>Agrupamento de testes similares</li><br><li>Identificação de testes atípicos</li><br><li>Detecção de padrões de falha</li><br></ol><br>##### Redes Neurais<br><ol><li>Detecção de padrões complexos</li><br><li>Aprendizado de comportamentos normais</li><br><li>Previsão de falhas</li><br></ol><br><h4>Ferramentas de Detecção de Anomalias</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Aplicação</th></tr>\n<tr><td><strong>Elastic APM</strong></td><td>APM</td><td>Detecção de anomalias em produção</td></tr>\n<tr><td><strong>Datadog</strong></td><td>Monitoring</td><td>ML para métricas</td></tr>\n<tr><td><strong>New Relic</strong></td><td>APM</td><td>Detecção inteligente</td></tr>\n<tr><td><strong>Grafana + Loki</strong></td><td>Logging</td><td>Análise de logs com ML</td></tr>\n</table></figure>\n\n<h3>3. Manutenção Inteligente de Testes</h3>\n\n<p>IA ajuda a identificar e remover testes obsoletos ou flaky, mantendo a suite de testes saudável.</p>\n\n<h4>Problemas que a IA Resolve</h4>\n\n<p><strong>Testes Flaky (Instáveis)</strong><br><ol><li>Identificação de padrões que causam instabilidade</li><br><li>Predição de quais testes podem falhar</li><br><li>Sugestões de correções</li><br><li>Quarentena automática</li><br></ol><br><strong>Testes Obsoletos</strong><br><ol><li>Detecção de funcionalidades removidas</li><br><li>Identificação de código não coberto</li><br><li>Sugestões de remoção segura</li><br></ol><br><h4>Exemplo de Detecção de Testes Flaky</h4></p>\n\n<pre><code># Sistema simplificado de detecção de testes flaky\nclass FlakyTestDetector:\n    def __init__(self):\n        self.test_history = {}\n        self.ml_model = load_trained_model()\n\n<p>def analyze_test(self, test_name, execution_history):<br>        features = self.extract_features(execution_history)<br>        flaky_probability = self.ml_model.predict_proba([features])[0]</p>\n\n<p>if flaky_probability &gt; 0.7:<br>            return {<br>                \"test\": test_name,<br>                \"flaky_probability\": flaky_probability,<br>                \"recommendation\": \"QUARANTINE\",<br>                \"reasons\": self.explain_prediction(features)<br>            }<br>        return {\"test\": test_name, \"flaky_probability\": flaky_probability}</p>\n\n<p>def extract_features(self, history):<br>        return [<br>            history.success_rate,<br>            history.avg_duration,<br>            history.recent_failures,<br>            history.environment_changes,<br>            history.dependency_changes<br>        ]<br></code></pre></p>\n\n<h3>4. Análise de Código Estático com IA</h3>\n\n<p>Identifica potenciais problemas de qualidade antes da execução, usando análise semântica avançada.</p>\n\n<h4>Capacidades Avançadas</h4>\n<ol><li><strong>Detecção de vulnerabilidades</strong> - OWASP Top 10</li>\n<li><strong>Análise de dependências</strong> - Bibliotecas desatualizadas</li>\n<li><strong>Code smells</strong> - Padrões problemáticos</li>\n<li><strong>Débito técnico</strong> - Métricas de qualidade</li>\n</ol>\n<h4>Ferramentas com IA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Capacidades IA</th><th>Integração</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Débito técnico, code smells</td><td>CI/CD</td></tr>\n<tr><td><strong>Snyk</strong></td><td>Vulnerabilidades, licenças</td><td>IDE, CI</td></tr>\n<tr><td><strong>CodeClimate</strong></td><td>Quality, maintainability</td><td>GitHub</td></tr>\n<tr><td><strong>DeepSource</strong></td><td>Análise estática com ML</td><td>Git</td></tr>\n</table></figure>\n\n<h3>5. Testes Visuais Automatizados</h3>\n\n<p>Comparação de interfaces visuais usando visão computacional para detectar regressões.</p>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Página Capturada → Modelo de Visão Computacional → Comparação com Baseline\n     ↓                          ↓                                    ↓\n  Screenshots           Detecção de Elementos           Diff Visual\n                                            ↓\n                                    Alertas de Regressão\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tecnologia</th><th>Diferencial</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Visual AI</td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de precisão</td></tr>\n<tr><td><strong> Percy</strong></td><td>Visual testing</td><td>Integração simples</td></tr>\n<tr><td><strong>Chromatic</strong></td><td>Visual regression</td><td>Para Storybook</td></tr>\n<tr><td><strong>Lost Pixel</strong></td><td>Open source</td><td>Self-hosted</td></tr>\n</table></figure>\n\n<h3>6. Oráculos de Teste Baseados em IA</h3>\n\n<p>Validação de resultados usando modelos treinados para determinar se o comportamento está correto.</p>\n\n<h4>Tipos de Oráculos</h4>\n<ol><li><strong>Oráculo de Imagem</strong> - Validação visual de UI</li>\n<li><strong>Oráculo de Texto</strong> - Análise de conteúdo</li>\n<li><strong>Oráculo de Comportamento</strong> - Detecção de anomalias</li>\n<li><strong>Oráculo de Dados</strong> - Validação de datasets</li>\n</ol>\n<hr>\n<h2>Ferramentas de IA para QA: Comparativo</h2>\n\n<h3>Plataformas Completas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Testim</strong></td><td>Automação inteligente E2E</td><td>$600+/mês</td><td>Equipes enterprise</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Automação com ML</td><td>Sob consulta</td><td>Escala enterprise</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>$500+/mês</td><td>CI/CD integrado</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>No-code com IA</td><td>Sob consulta</td><td>Enterprise</td></tr>\n<tr><td><strong>Perfecto</strong></td><td>Testes mobile/web com IA</td><td>Sob consulta</td><td>Mobile testing</td></tr>\n</table></figure>\n\n<h3>Ferramentas Especializadas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais</td><td>$100+/mês</td><td>UI testing</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Unit tests</td><td>$299/assinante</td><td>Dev teams</td></tr>\n<tr><td><strong>Snyk</strong></td><td>SCA</td><td>Grátis + Pro</td><td>Developers</td></tr>\n<tr><td><strong>SonarCloud</strong></td><td>SAST</td><td>Grátis + Pro</td><td>CI/CD</td></tr>\n</table></figure>\n\n<h3>Ferramentas Emerging (2025-2026)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Status</th></tr>\n<tr><td><strong>CodiumAI</strong></td><td>Testes gerados automaticamente</td><td>Beta</td></tr>\n<tr><td><strong>Mutable AI</strong></td><td>Code review + tests</td><td>Beta</td></tr>\n<tr><td><strong>Dagger</strong></td><td>CI/CD programável</td><td>GA</td></tr>\n<tr><td><strong>Trunk</strong></td><td>Linting inteligente</td><td>GA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando IA em QA: Roadmap Prático</h2>\n\n<h3>Fase 1: Avaliação e Planejamento (1-2 meses)</h3>\n\n<h4>Checklist de Avaliação</h4>\n<ol><li>[ ] Mapeamento de processos atuais de QA</li>\n<li>[ ] Identificação de pontos de dor</li>\n<li>[ ] Análise de ROI potencial</li>\n<li>[ ] Avaliação de maturidade tecnológica</li>\n<li>[ ] Levantamento de stakeholders</li>\n</ol>\n<h4>Métricas de Baseline</h4>\n\n<p>Antes de implementar, estabeleça métricas de referência:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Ferramenta</th></tr>\n<tr><td>Tempo de teste</td><td>Duração de suite</td><td>CI/CD logs</td></tr>\n<tr><td>Cobertura de teste</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>Coverage tools</td></tr>\n<tr><td>Taxa de defeitos</td><td>Bugs em produção</td><td>Bug tracker</td></tr>\n<tr><td>Testes flaky</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas instáveis</td><td>CI/CD</td></tr>\n<tr><td>Custo de QA</td><td>$/teste executado</td><td>Financeiro</td></tr>\n</table></figure>\n\n<h3>Fase 2: Pilot (2-3 meses)</h3>\n\n<h4>Escolha do Piloto</h4>\n\n<p>Selecione um projeto ou área com:<br><ol><li>✅ Escopo controlado</li><br><li>✅ Equipe aberta a inovação</li><br><li>✅ Processos definidos</li><br><li>✅ Métricas disponíveis</li><br></ol><br><h4>Pilotos Recomendados</h4><br><ol><li><strong>Geração de unit tests</strong> - Diffblue, CodiumAI</li><br><li><strong>Testes visuais</strong> - Applitools</li><br><li><strong>Detecção de flaky tests</strong> - Ferramentas de CI</li><br><li><strong>Análise estática</strong> - SonarQube, Snyk</li><br></ol><br><h3>Fase 3: Expansão (3-6 meses)</h3></p>\n\n<h4>Escalar Sucesso</h4>\n<ol><li>Documente aprendizados</li>\n<li>Treine outras equipes</li>\n<li>Padronize processos</li>\n<li>Melhore integrações</li>\n</ol>\n<h4>KPIs de Sucesso</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Meta (6 meses)</th></tr>\n<tr><td>Redução de tempo de teste</td><td>30-40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Aumento de cobertura</td><td>20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de defeitos em prod</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>ROI positivo</td><td>Sim</td></tr>\n</table></figure>\n\n<h3>Fase 4: Maturidade (6-12 meses)</h3>\n\n<h4>Implementação Enterprise</h4>\n<ol><li>Integração completa com CI/CD</li>\n<li>IA em produção (monitoramento)</li>\n<li>Maintenance automatizado</li>\n<li>Reporting avançado</li>\n</ol>\n<hr>\n<h2>Futuro da IA em QA: Tendências 2026-2028</h2>\n\n<h3>1. Testes Autônomos</h3>\n\n<p>Sistemas que automaticamente:<br><ol><li>Geram testes baseados em requisitos</li><br><li>Executam testes continuamente</li><br><li>Detectam e reportam falhas</li><br><li>Propõem correções</li><br></ol><br><h3>2. Manutenção Preditiva</h3></p>\n\n<p>IA que prevê:<br><ol><li>Quando testes vão falhar</li><br><li>Quando código precisa de mais testes</li><br><li>Quando componentes estão em risco</li><br><li>Quando fazer refactoring</li><br></ol><br><h3>3. GenAI Nativa em QA</h3></p>\n\n<p>Modelos treinados especificamente para:<br><ol><li>Entender código e testes</li><br><li>Gerar código de teste</li><br><li>Analisar requisitos</li><br><li>Documentar testes</li><br></ol><br><h3>4. Testes em Produção com IA</h3></p>\n\n<p>Monitoramento inteligente:<br><ol><li>Detecção de anomalias em produção</li><br><li>Geração automática de testes de regressão</li><br><li>Validação de deployments</li><br><li>Root cause analysis</li><br></ol><br><hr><br><h2>Considerações Éticas e Best Practices</h2></p>\n\n<h3>Governança de IA em QA</h3>\n\n<h4>Princípios</h4>\n<ol><li><strong>Transparência</strong> - Documente como a IA toma decisões</li>\n<li><strong>Responsabilidade</strong> - Humanos mantêm responsabilidade final</li>\n<li><strong>Fairness</strong> - Evite viés em modelos</li>\n<li><strong>Privacidade</strong> - Proteja dados sensíveis</li>\n<li><strong>Segurança</strong> - Proteja modelos contra ataques</li>\n</ol>\n<h4>Checklist de Governança</h4>\n<ol><li>[ ] Política de uso de IA em QA documentada</li>\n<li>[ ] Processos de revisão de decisões de IA</li>\n<li>[ ] Documentação de modelos utilizados</li>\n<li>[ ] Plano de contingência para falhas de IA</li>\n<li>[ ] Treinamento de equipe em uso responsável</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A IA está transformando fundamentalmente a QA, oferecendo oportunidades sem precedentes para aumentar eficiência, cobertura e qualidade. Embora a adoção em escala ainda seja um desafio, organizações que investem estrategicamente em IA para QA estão obtendo vantagens competitivas significativas.</p>\n\n<p><strong>Resumo dos Principais Aprendizados:</strong></p>\n\n<p>✅ IA pode reduzir tempo de teste em 40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}  <br>✅ GenAI está sendo buscada por 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações, mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram em escala  <br>✅ Ferramentas como Playwright, Applitools e Testim estão liderando a adoção  <br>✅ Implementação requer estratégia, não apenas ferramentas  <br>✅ Futuro aponta para testes autônomos e manutenção preditiva</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem toda organização precisa de todas as capacidades</li><br><li><strong>Comece pequeno</strong> - Pilotos controlados são mais eficazes</li><br><li><strong>Meça resultados</strong> - Métricas são essenciais</li><br><li><strong>Treine sua equipe</strong> - Competências em IA são necessárias</li><br><li><strong>Governarize</strong> - Adote práticas éticas desde o início</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre IA em QA</h3></p>\n\n<p><strong>P: A IA vai substituir testadores humanos?</strong>  <br>R: Não. A IA complementa o trabalho humano, permitindo que testadores foquem em atividades estratégicas, exploratory testing e design de testes.</p>\n\n<p><strong>P: Qual é o ROI da implementação de IA em QA?</strong>  <br>R: O ROI típico é de 200-500{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em 12-18 meses, considerando redução de tempo de teste, aumento de cobertura e redução de defeitos em produção.</p>\n\n<p><strong>P: Preciso de especialistas em dados para implementar IA em QA?</strong>  <br>R: Não necessariamente. Muitas ferramentas são \"plug-and-play\" e não requerem conhecimento de ML. No entanto, para implementações avançadas, especialistas são úteis.</p>\n\n<p><strong>P: Quais são os principais riscos do uso de IA em QA?</strong>  <br>R: Os principais riscos incluem: dependência excessiva, viés em modelos, falta de transparência e custos inesperados de manutenção.</p>\n\n<p><strong>P: Quando devo começar a usar IA em QA?</strong>  <br>R: Se você tem mais de 100 testes automatizados ou gastando mais de 20 horas/semana em QA, é um bom momento para avaliar ferramentas de IA.</p>\n\n<hr>\n<em>Fonte: World Quality Report 2025, Software Testing Magazine, Gartner Research, IEEE Software</em>', 'Inteligência Artificial em Quality Assurance: Guia Completo para 2025-2026', '', 'publish', 'closed', 'open', '', '05inteligenciaartificialqa', '', '', '2026-07-06 23:05:56', '2026-07-07 02:05:56', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/05inteligenciaartificialqa/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('182', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Descubra as principais conclusões sobre qualidade de software, tendências de QA para 2025-2026, frameworks de teste e o papel da IA. Guia completo com recomendações práticas.</p>\n\n<hr>\n<h2>Síntese dos Aprendizados</h2>\n\n<figure><img src=\"https://media.giphy.com/media/3o7TKS4RmR4xF42n7S/giphy.gif\" alt=\"Future Tech - Tecnologia do Futuro\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>A Qualidade de Software evoluiu significativamente, passando de uma atividade de verificação final para um processo contínuo e integrado ao longo de todo o ciclo de desenvolvimento. Esta transformação reflete a crescente importância do software na sociedade moderna e as demandas cada vez maiores por sistemas confiáveis, seguros e eficientes.</p>\n\n<hr>\n<h2>Principais Insights: O Que Aprendemos</h2>\n\n<h3>1. Tendências para 2025-2026</h3>\n\n<p>O cenário da qualidade de software está sendo moldado por tendências tecnológicas e metodológicas que prometem revolucionar a forma como testamos e garantimos a qualidade.</p>\n\n<h4>As Tendências Mais Impactantes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tendência</th><th>Impacto</th><th>Adoção</th></tr>\n<tr><td><strong>IA e GenAI em QA</strong></td><td>Transformador</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} buscam, 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram</td></tr>\n<tr><td><strong>Playwright como Líder</strong></td><td>Performance 2-10x</td><td>Crescimento acelerado</td></tr>\n<tr><td><strong>Shift-Left Testing</strong></td><td>Redução de custos 10x</td><td>Maturidade crescente</td></tr>\n<tr><td><strong>Hiperautomação</strong></td><td>Eficiência operacional</td><td>Adoção em expansão</td></tr>\n<tr><td><strong>Testes em Nuvem</strong></td><td>Escalabilidade</td><td>Enterprise adotando</td></tr>\n<tr><td><strong>Segurança como Prioridade</strong></td><td>Risco reduzido</td><td>Obrigatório</td></tr>\n</table></figure>\n\n<h4>Por Que Estas Tendências Importam?</h4>\n\n<p><strong>IA e GenAI</strong> estão democratizando a automação e permitindo que equipes menores façam mais. A capacidade de gerar testes automaticamente, detectar anomalias e manter suites de teste inteligentes está mudando fundamentalmente o papel dos profissionais de QA.</p>\n\n<p><strong>Playwright</strong> representa a nova geração de frameworks de teste, oferecendo performance, confiabilidade e developer experience que superam alternativas anteriores. Para novos projetos, é a escolha óbvia.</p>\n\n<p><strong>Shift-Left</strong> não é apenas uma tendência, mas uma mudança de mentalidade. Ao testar mais cedo, organizações estão economizando tempo e dinheiro significativos.</p>\n\n<h3>2. Frameworks de Testes: Comparativo Final</h3>\n\n<h4>Recomendação por Cenário</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Cenário</th><th>Framework Recomendado</th><th>Alternativa</th></tr>\n<tr><td>Novo projeto 2026</td><td><strong>Playwright</strong></td><td>Cypress</td></tr>\n<tr><td>Performance crítica</td><td><strong>Playwright</strong></td><td>-</td></tr>\n<tr><td>Projeto React</td><td>Cypress</td><td>Playwright</td></tr>\n<tr><td>Legacy com Selenium</td><td>Manter/Evoluir</td><td>Migrar gradualmente</td></tr>\n<tr><td>IE11 necessário</td><td>Selenium</td><td>-</td></tr>\n<tr><td>Mobile testing</td><td>Playwright + Appium</td><td>-</td></tr>\n<tr><td>API testing</td><td>Playwright + RestAssured</td><td>Postman</td></tr>\n</table></figure>\n\n<h4>Conclusão Técnica</h4>\n\n<p><strong>Playwright é o framework mais rápido e eficiente em recursos em 2026</strong>, superando Cypress e Selenium em:</p>\n\n<p>✅ <strong>Velocidade</strong> - 2-10x mais rápido  <br>✅ <strong>Paralelização</strong> - Browser contexts isolados  <br>✅ <strong>Custo CI</strong> - Menor tempo = menor custo  <br>✅ <strong>Confiabilidade</strong> - Menos flaky tests  <br>✅ <strong>API moderna</strong> - Menos código, mais resultado</p>\n\n<p><strong>Cypress</strong> permanece excelente para:</p>\n\n<p>✅ <strong>Projetos React/Vue</strong> - Integração nativa  <br>✅ <strong>Developer Experience</strong> - Time travel debugging  <br>✅ <strong>TeamsJavaScript</strong> - Curva de aprendizado suave</p>\n\n<p><strong>Selenium</strong> continua relevante para:</p>\n\n<p>✅ <strong>Projetos legacy</strong> - Investimento a proteger  <br>✅ <strong>Suporte a browsers antigos</strong> - IE11, Safari antigo  <br>✅ <strong>Ecossistema massivo</strong> - Ferramentas complementares</p>\n\n<h4>Frameworks Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Recomendação</th><th>Por Que</th></tr>\n<tr><td><strong>Python</strong></td><td>pytest</td><td>Flexível, poderoso, comunidade ativa</td></tr>\n<tr><td><strong>JavaScript</strong></td><td>Jest</td><td>Integrado ao ecossistema Node, zero config</td></tr>\n<tr><td><strong>Java</strong></td><td>JUnit 5</td><td>Padrão da indústria, extensível</td></tr>\n<tr><td><strong>C#</strong></td><td>xUnit</td><td>Moderno, simples, recomendado pela Microsoft</td></tr>\n</table></figure>\n\n<h3>3. Tipos de Testes: Arquitetura Completa</h3>\n\n<h4>Pirâmide de Testes Ideal</h4>\n\n<pre><code>                        /\n                       /  \n                      / E2E        10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Validação end-to-end\n                     /      \n                    /Integração   20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Interfaces e comunicação\n                   /            \n                  /  Unitários    70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Base sólida de testes\n                 /________________\n</code></pre>\n\n<h4>Quando Usar Cada Tipo</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo de Teste</th><th>Quando</th><th>Objetivo Principal</th></tr>\n<tr><td><strong>Unitário</strong></td><td>Durante desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Integração</strong></td><td>Após unitários</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Sistema</strong></td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Aceitação</strong></td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Performance</strong></td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Segurança</strong></td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Usabilidade</strong></td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n<tr><td><strong>Regressão</strong></td><td>A cada mudança</td><td>Garantir não-regressão</td></tr>\n</table></figure>\n\n<hr>\n<h2>Recomendações Práticas</h2>\n\n<h3>1. Adotar Estratégia Híbrida</h3>\n\n<p>Combinar testes manuais e automatizados conforme necessidade. A automação não substitui completamente os testes manuais, especialmente para:</p>\n\n<p>✅ <strong>Exploratory Testing</strong> - Descobrir problemas não previstos  <br>✅ <strong>Testes de Usabilidade</strong> - Avaliar experiência do usuário  <br>✅ <strong>Testes de UX</strong> - Validar design e fluxo  <br>✅ <strong>Cenários complexos</strong> - Que requerem julgamento humano</p>\n\n<h3>2. Investir em Capacitação</h3>\n\n<p>Equipes precisam estar atualizadas com novas tecnologias. Plano de desenvolvimento:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Trimestre</th><th>Foco</th><th>Ação</th></tr>\n<tr><td><strong>Q1</strong></td><td>Fundamentos</td><td>Certificação ISTQB Foundation</td></tr>\n<tr><td><strong>Q2</strong></td><td>Automação</td><td>Aprender Playwright ou Cypress</td></tr>\n<tr><td><strong>Q3</strong></td><td>Cloud &amp; DevOps</td><td>AWS/Azure DevOps</td></tr>\n<tr><td><strong>Q4</strong></td><td>IA em QA</td><td>Hands-on com ferramentas de IA</td></tr>\n</table></figure>\n\n<h3>3. Priorizar Segurança</h3>\n\n<p>Incluir testes de penetração no pipeline de CI/CD. Em 2025-2026, segurança não é opcional:</p>\n\n<ul><li><strong>SAST</strong> - Análise estática integrada ao IDE</li><ol><li><strong>DAST</strong> - Scanner dinâmico no pipeline</li>\n<li><strong>SCA</strong> - Verificação de dependências</li>\n<li><strong>Pentest</strong> - Testes manuais periódicos</li>\n</ol>\n<h3>4. Monitorar Métricas</h3>\n\n<p>Usar dados para melhorar continuamente processos de QA. Métricas essenciais:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Meta</th></tr>\n<tr><td><strong>Cobertura de código</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Tempo de teste</strong></td><td>Duração de suite</td><td>Redução contínua</td></tr>\n<tr><td><strong>Taxa de falhas</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de builds com falhas</td><td>&lt;5{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Defeitos em prod</strong></td><td>Bugs por release</td><td>Tendência decreasing</td></tr>\n<tr><td><strong>MTTR</strong></td><td>Tempo para correção</td><td>&lt;24 horas</td></tr>\n</table></figure>\n\n<hr>\n<h2>Perspectivas Futuras</h2>\n\n<h3>O Que Vem Pela Frente</h3>\n\n<p>O futuro da QA está intrinsecamente ligado à IA. Organizações que conseguirem implementar GenAI efetivamente terão vantagem competitiva significativa. A chave está em encontrar o equilíbrio entre:<br><ol><li><strong>Automação inteligente</strong> - IA fazendo o trabalho repetitivo</li><br><li><strong>Intervenção humana estratégica</strong> - Especialistas focando no que importa</li><br><li><strong>Melhoria contínua</strong> - Aprendendo com dados e feedback</li><br><li><strong>Escalabilidade</strong> - Fazendo mais com menos recursos</li><br></ol><br><h3>As 5 Previsões para 2027-2028</h3></p>\n\n<h4>1. Testes Autônomos</h4>\n\n<p>Sistemas auto-testantes que:<ol><li>Detectam requisitos automaticamente</li><br><li>Geram testes sem intervenção</li><br><li>Executam continuamente</li><br><li>Detectam falhas em produção</li><br><li>Propõem correções</li><br></ol><br><h4>2. Auge da Hiperautomação</h4></p>\n\n<p>QA completamente automatizado com:<ol><li>Geração automática de código de teste</li><br><li>Manutenção preditiva de suites</li><br><li>Detecção proativa de falhas</li><br><li>Integração total com DevOps</li><br></ol><br><h4>3. Profissionais Evoluídos</h4></p>\n\n<p>Engenheiros de qualidade com:<ol><li>Habilidades em IA/ML</li><br><li>Competências em programação</li><br><li>Conhecimento de бизнес</li><br><li>Capabilities analíticas avançadas</li><br></ol><br><h4>4. Qualidade Contínua</h4></p>\n\n<p>Quality integrada em todos os estágios:<ol><li>Design orientado por qualidade</li><br><li>Desenvolvimento com testes-first</li><br><li>Deploy com quality gates</li><br><li>Monitoramento em produção</li><br></ol><br><h4>5. Shift-Right Expandido</h4></p>\n\n<p>Testes em produção com:<ol><li>Feature flags para experiments</li><br><li>Canary deployments</li><br><li>Real user monitoring</li><br><li>Feedback loops automáticos</li><br></ol><br><hr><br><h2>Como Começar Hoje</h2></p>\n\n<h3>Para Equipes Iniciantes</h3>\n<ol><li><strong>Comece com unit tests</strong> - pytest ou Jest</li>\n<li><strong>Automação básica</strong> - Selenium ou Playwright</li>\n<li><strong>CI/CD</strong> - GitHub Actions ou GitLab CI</li>\n<li><strong>Métricas simples</strong> - Cobertura e tempo</li>\n</ol>\n<h3>Para Equipes Intermediárias</h3>\n<ol><li><strong>Evolua para Playwright</strong> - Performance superior</li>\n<li><strong>Implemente testes de API</strong> - Postman ou RestAssured</li>\n<li><strong>Adicione performance testing</strong> - k6 ou JMeter</li>\n<li><strong>Integre segurança</strong> - SonarQube + Snyk</li>\n</ol>\n<h3>Para Equipes Avançadas</h3>\n<ol><li><strong>Explore IA em QA</strong> - Testim, Applitools</li>\n<li><strong>Implemente quality gates</strong> - Automação de decisões</li>\n<li><strong>Monitore em produção</strong> - APM + alerting</li>\n<li><strong>Adote testing em produção</strong> - Feature flags, canary</li>\n</ol>\n<hr>\n<h2>Mensagem Final</h2>\n\n<p>A qualidade de software não é um destino, mas uma jornada contínua de melhoria. As organizações que abraçam esta mentalidade, investem em pessoas e tecnologias certas, e mantêm o foco no valor para o cliente estarão bem posicionadas para o sucesso.</p>\n\n<p><strong>Lembre-se:</strong></p>\n\n<p>✅ <strong>Qualidade é responsabilidade de todos</strong> - Não apenas de QA  <br>✅ <strong>Automação é meio, não fim</strong> - O objetivo é qualidade, não automação  <br>✅ <strong>Pessoas fazem a diferença</strong> - Ferramentas são auxiliares  <br>✅ <strong>Melhoria contínua</strong> - Kaizen aplicada a QA  <br>✅ <strong>Valor para o cliente</strong> - Qualidade só faz sentido se entregar valor</p>\n\n<hr>\n<h2>Recursos Adicionais</h2>\n\n<h3>Leituras Recomendadas</h3>\n<ol><li>\"How Google Tests Software\" - James Whittaker</li>\n<li>\"Agile Testing\" - Lisa Crispin e Janet Gregory</li>\n<li>\"The Phoenix Project\" - Gene Kim</li>\n<li>\"Accelerate\" - Nicole Forsgren</li>\n</ol>\n<h3>Certificações</h3>\n<ol><li><strong>ISTQB</strong> - Foundation, Advanced, Expert</li>\n<li><strong>ICAgile</strong> - Agile Testing</li>\n<li><strong>AWS/Azure DevOps</strong> - Cloud certifications</li>\n<li><strong>Scrum.org</strong> - Professional Scrum Tester</li>\n</ol>\n<h3>Comunidades</h3>\n<ol><li>Ministry of Testing</li>\n<li>Selenium Community</li>\n<li>Playwright Community</li>\n<li>Software Testing Notes (Reddit)</li></ol></ul>\n\n<hr>\n<h3>FAQ - Perguntas Finais</h3>\n\n<p><strong>P: Qual é o futuro dos testadores manuais?</strong>  <br>R: Testadores evoluem para engenheiros de qualidade com habilidades em automação, análise de dados e IA. O foco muda de execução para estratégia.</p>\n\n<p><strong>P: Quando devo migrar do Selenium para Playwright?</strong>  <br>R: Para novos projetos, agora. Para projetos legacy, considere migração incremental quando a suite precisar de manutenção significativa.</p>\n\n<p><strong>P: Como justificar investimento em QA para a gestão?</strong>  <br>R: Use dados: custo de defeitos em produção vs. custo de detecção precoce, ROI de automação, métricas de qualidade.</p>\n\n<p><strong>P: Qual é a melhor abordagem para implementar IA em QA?</strong>  <br>R: Comece com pilotos controlados, meça resultados rigorosamente, escale o que funciona.</p>\n\n<p><strong>P: Como manter a motivação da equipe de QA?</strong>  <br>R: Invista em capacitação, mostre impacto do trabalho, automatize o repetitivo, valorize contribuições estratégicas.</p>\n\n<hr>\n<em>Dissertação atualizada em: 19/03/2026</em>  \n<em>Este guia faz parte de uma série completa sobre Qualidade de Software e QA</em>', 'Conclusão: O Futuro da Qualidade de Software e QA', '', 'publish', 'closed', 'open', '', '06conclusao', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/06conclusao/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('183', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda como implementar automação de testes de forma eficiente. Guia completo com estratégias, ferramentas, frameworks e melhores práticas para 2025.</p>\n\n<hr>\n<h2>O Que é Automação de Testes?</h2>\n\n<p>A automação de testes é o processo de usar ferramentas e scripts especializados para executar testes de software automaticamente, reduzindo a necessidade de intervenção manual e aumentando a eficiência, cobertura e consistência dos testes.</p>\n\n<h3>Por Que Automatizar Testes?</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Benefício</th><th>Impacto</th><th>Resultado</th></tr>\n<tr><td><strong>Velocidade</strong></td><td>Execução 10x mais rápida</td><td>Time-to-market reduzido</td></tr>\n<tr><td><strong>Consistência</strong></td><td>Resultados reprodutíveis</td><td>Confiabilidade aumentada</td></tr>\n<tr><td><strong>Cobertura</strong></td><td>Milhares de combinações</td><td>Qualidade aprimorada</td></tr>\n<tr><td><strong>Custo</strong></td><td>Redução de 50-70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>ROI positivo</td></tr>\n<tr><td><strong>Feedback</strong></td><td>Ciclos de feedback rápidos</td><td>Desenvolvimento ágil</td></tr>\n</table></figure>\n\n<hr>\n<h2>Quando Automatizar vs. Quando Manter Manual</h2>\n\n<h3>Critérios para Automatização</h3>\n\n<p><strong>AUTOMATIZAR quando:</strong></p>\n\n<p>✅ Testes executam frequentemente (regressão)  <br>✅ Cenários com múltiplas combinações de dados  <br>✅ Testes de performance e carga  <br>✅ Processos críticos com alto risco  <br>✅ Necessidade de execução em múltiplos navegadores  <br>✅ Integração contínua (CI/CD)</p>\n\n<p><strong>MANTER MANUAL quando:</strong></p>\n\n<p>✅ Testes executam uma única vez  <br>✅ Cenários exploratórios e discovery  <br>✅ Testes de usabilidade e UX  <br>✅ Correção rápida de bugs  <br>✅ Projetos com orçamento limitado  <br>✅ Sistemas em fase inicial de desenvolvimento</p>\n\n<hr>\n<h2>Estratégias de Automação de Testes</h2>\n\n<h3>1. Pirâmide de Automação</h3>\n\n<pre><code>                    /\n                   /  \n                  /  E2E        10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes end-to-end\n                 /________\n                /          \n               / Integração   20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes de API e serviços\n              /____________\n             /              \n            /   Unitários     70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes unitários\n           /__________________\n</code></pre>\n\n<h3>2. Modelo de Seleção de Testes</h3>\n\n<h4>Quadrante de Automação (Brian Marick)</h4>\n\n<pre><code>                    ↑\n                    │   Exploratory\n                    │   Tests\n                    │   (★ ★ ★)\n         ↓         │   Usability\n    Technology     │   Tests\n    Driven         │   (★ ★)\n    Tests          │\n    (★)            │\n         Unit      │   Product\n         Tests     │   Requirements\n    (★ ★ ★)       │   (★ ★ ★)\n         ←——————————→↓\n              ↓\n         Business\n         Facing\n         Tests\n</code></pre>\n\n<h3>3. Estratégia \"First, Then, Always\"</h3>\n<ol><li><strong>First</strong> - Testes mais críticos para o negócio</li>\n<li><strong>Then</strong> - Testes com maior frequência de execução</li>\n<li><strong>Always</strong> - Regressão completa em cada release</li>\n</ol>\n<hr>\n<h2>Frameworks de Automação: Escolhendo o Certo</h2>\n\n<h3>Frameworks Web (E2E)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Framework</th><th>Melhor Para</th><th>Linguagem</th><th>Curva</th></tr>\n<tr><td><strong>Playwright</strong></td><td>Performance, multi-browser</td><td>TS/JS/Python</td><td>Média</td></tr>\n<tr><td><strong>Cypress</strong></td><td>DX, projetos React</td><td>JS/TS</td><td>Baixa</td></tr>\n<tr><td><strong>Selenium</strong></td><td>Legacy, cross-browser</td><td>Qualquer</td><td>Média</td></tr>\n<tr><td><strong>Puppeteer</strong></td><td>Chrome-focused</td><td>JS/TS</td><td>Baixa</td></tr>\n</table></figure>\n\n<h3>Frameworks Mobile</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Framework</th><th>Plataforma</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>Appium</strong></td><td>iOS, Android</td><td>Qualquer</td><td>Cross-platform</td></tr>\n<tr><td><strong>Espresso</strong></td><td>Android</td><td>Java/Kotlin</td><td>Android nativo</td></tr>\n<tr><td><strong>XCTest</strong></td><td>iOS</td><td>Swift/Obj-C</td><td>iOS nativo</td></tr>\n<tr><td><strong>Detox</strong></td><td>React Native</td><td>JS/TS</td><td>React Native</td></tr>\n</table></figure>\n\n<h3>Frameworks API</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Framework</th><th>Linguagem</th><th>Características</th></tr>\n<tr><td><strong>RestAssured</strong></td><td>Java</td><td>DSL fluent</td></tr>\n<tr><td><strong>Supertest</strong></td><td>JavaScript</td><td>Express integration</td></tr>\n<tr><td><strong>HTTPie</strong></td><td>Python</td><td>CLI tool</td></tr>\n<tr><td><strong>Postman/Newman</strong></td><td>-</td><td>Collection execution</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando Automação: Passo a Passo</h2>\n\n<h3>Passo 1: Definir Objetivos e KPIs</h3>\n\n<p><strong>KPIs de Automação de Testes:</strong></p>\n\n<pre><code>📊 Taxa de Automação = (Casos automatizados / Total casos) × 100\n🎯 ROI de Automação = (Custo manual - Custo automatizado) / Custo automatizado\n⏱️ Tempo Economizado = Tempo manual - Tempo automatizado\n🔢 Defeitos Encontrados = Total defeitos detectados por automação\n</code></pre>\n\n<h3>Passo 2: Selecionar Ferramentas</h3>\n\n<p><strong>Critérios de Seleção:</strong><br><ol><li>Compatibilidade com tecnologias do projeto</li><br><li>Suporte a navegadores/dispositivos necessários</li><br><li>Curva de aprendizado da equipe</li><br><li>Custo de licença e manutenção</li><br><li>Comunidade e suporte</li><br><li>Integração com CI/CD</li><br></ol><br><h3>Passo 3: Criar Framework Base</h3></p>\n\n<pre><code># Estrutura de projeto típica\nproject/\n├── tests/\n│   ├── unit/\n│   ├── integration/\n│   ├── e2e/\n│   └── api/\n├── pages/           # Page Objects\n├── components/      # Componentes reutilizáveis\n├── fixtures/        # Dados de teste\n├── helpers/         # Funções utilitárias\n├── reports/         # Relatórios\n├── config/          # Configurações\n├── conftest.py      # Setup global\n├── pytest.ini       # Configuração pytest\n└── requirements.txt # Dependências\n</code></pre>\n\n<h3>Passo 4: Implementar Page Objects</h3>\n\n<pre><code># pages/login_page.py\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n<p>class LoginPage:<br>    URL = \"https://exemplo.com/login\"</p>\n\n<p>def __init__(self, driver):<br>        self.driver = driver<br>        self.wait = WebDriverWait(driver, 10)</p>\n\n<p>def load(self):<br>        self.driver.get(self.URL)<br>        return self</p>\n\n<p>def enter_username(self, username):<br>        element = self.wait.until(<br>            EC.presence_of_element_located((By.ID, \"username\"))<br>        )<br>        element.send_keys(username)<br>        return self</p>\n\n<p>def enter_password(self, password):<br>        self.driver.find_element(By.ID, \"password\").send_keys(password)<br>        return self</p>\n\n<p>def click_login(self):<br>        self.driver.find_element(By.ID, \"login-button\").click()<br>        return self</p>\n\n<p>def login(self, username, password):<br>        return (self<br>            .load()<br>            .enter_username(username)<br>            .enter_password(password)<br>            .click_login())<br></code></pre></p>\n\n<h3>Passo 5: Configurar Execução Paralela</h3>\n\n<pre><code># playwright.config.ts\nimport { defineConfig, devices } from \'@playwright/test\';\n\n<p>export default defineConfig({<br>  testDir: \'./tests/e2e\',<br>  fullyParallel: true,           // Execução paralela<br>  forbidOnly: !!process.env.CI,<br>  retries: process.env.CI ? 2 : 0,<br>  workers: process.env.CI ? 1 : undefined,  // workers em CI<br>  reporter: \'html\',</p>\n\n<p>use: {<br>    baseURL: \'https://exemplo.com\',<br>    trace: \'on-first-retry\',<br>    screenshot: \'only-on-failure\',<br>  },</p>\n\n<p>projects: [<br>    { name: \'chromium\', use: { ...devices[\'Desktop Chrome\'] } },<br>    { name: \'firefox\', use: { ...devices[\'Desktop Firefox\'] } },<br>    { name: \'webkit\', use: { ...devices[\'Desktop Safari\'] } },<br>  ],<br>});<br></code></pre></p>\n\n<hr>\n<h2>Boas Práticas de Automação</h2>\n\n<h3>1. Princípios SOLID em Testes</h3>\n\n<ul><li><strong>S</strong>ingle Responsibility: Cada teste uma coisa</li><ol><li><strong>O</strong>pen/Closed: Testes extensíveis, não modificáveis</li>\n<li><strong>L</strong>iskov Substitution: Sem dependências hard-coded</li>\n<li><strong>I</strong>nterface Segregation: Múltiplas interfaces específicas</li>\n<li><strong>D</strong>ependency Inversion: Depender de abstrações</li></ol></ul>\n\n<h3>2. Nomenclatura de Testes</h3>\n\n<pre><code># Padrão: test_[funcionalidade]_[cenário]_[resultado_esperado]\ndef test_login_com_credenciais_validas_exibe_dashboard():\n    pass\n\n<p>def test_login_com_senha_invalida_exibe_mensagem_erro():<br>    pass</p>\n\n<p>def test_carrinho_com_produto_adicionado_calcula_frete():<br>    pass<br></code></pre></p>\n\n<h3>3. Dados de Teste</h3>\n\n<pre><code># fixtures/conftest.py\nimport pytest\nfrom faker import Faker\n\n<p>fake = Faker(\'pt_BR\')</p>\n\n<p>@pytest.fixture<br>def usuario_valido():<br>    return {<br>        \"nome\": fake.name(),<br>        \"email\": fake.email(),<br>        \"senha\": \"Senha@123\",<br>        \"cpf\": fake.cpf()<br>    }</p>\n\n<p>@pytest.fixture<br>def produto():<br>    return {<br>        \"nome\": fake.word().capitalize(),<br>        \"preco\": fake.random_number(digits=3),<br>        \"sku\": fake.uuid4()[:8].upper()<br>    }<br></code></pre></p>\n\n<h3>4. Reportes e Logs</h3>\n\n<pre><code>import logging\nimport allure\n\n<p>logger = logging.getLogger(__name__)</p>\n\n<p>@allure.feature(\"Autenticação\")<br>@allure.story(\"Login de usuário\")<br>@allure.severity(allure.severity_level.CRITICAL)<br>def test_login_sucesso(usuario_valido):<br>    logger.info(f\"Iniciando teste de login para: {usuario_valido[\'email\']}\")</p>\n\n<p>with allure.step(\"Acessar página de login\"):<br>        login_page.load()</p>\n\n<p>with allure.step(\"Preencher credenciais\"):<br>        login_page.login(usuario_valido[\"email\"], usuario_valido[\"senha\"])</p>\n\n<p>with allure.step(\"Verificar redirecionamento\"):<br>        assert \"/dashboard\" in driver.current_url</p>\n\n<p>logger.info(\"Teste de login concluído com sucesso\")<br></code></pre></p>\n\n<hr>\n<h2>Integração com CI/CD</h2>\n\n<h3>GitHub Actions</h3>\n\n<pre><code># .github/workflows/test.yml\nname: Testes Automatizados\n\n<p>on:<br>  push:<br>    branches: [main, develop]<br>  pull_request:<br>    branches: [main]</p>\n\n<p>jobs:<br>  unit-tests:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - uses: actions/setup-python@v5<br>        with:<br>          python-version: \'3.11\'<br>      - run: pip install pytest pytest-cov<br>      - run: pytest tests/unit/ -v --cov=src --cov-report=xml<br>      - uses: codecov/codecov-action@v3</p>\n\n<p>e2e-tests:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - uses: actions/setup-node@v4<br>        with:<br>          node-version: \'20\'<br>      - run: npm ci<br>      - run: npx playwright install --with-deps<br>      - run: npm run test:e2e<br>      - uses: actions/upload-artifact@v4<br>        if: always()<br>        with:<br>          name: playwright-report<br>          path: playwright-report/<br></code></pre></p>\n\n<hr>\n<h2>Métricas e ROI de Automação</h2>\n\n<h3>Calculadora de ROI</h3>\n\n<pre><code>Custo Manual por Ciclo:\n  - 1000 casos × 10 min × R$0,50/min = R$5.000/ciclo\n\n<p>Custo Automatizado por Ciclo:<br>  - Setup: R$20.000<br>  - Manutenção: R$500/mês<br>  - Execução: 1000 casos × 2 min × R$0,10/min = R$200/ciclo</p>\n\n<p>Após 12 meses:<br>  - Manual: R$5.000 × 12 = R$60.000<br>  - Automatizado: R$20.000 + (R$500 × 12) + (R$200 × 12) = R$26.400</p>\n\n<p>Economia: R$60.000 - R$26.400 = R$33.600 (56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})<br></code></pre></p>\n\n<h3>Dashboard de Métricas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Target</th><th>Status</th></tr>\n<tr><td>Taxa de Automação</td><td>&gt;70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>✅ 65{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Cobertura de Código</td><td>&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>✅ 78{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Tempo de Suite</td><td>&lt;30 min</td><td>⚠️ 45 min</td></tr>\n<tr><td>Flaky Tests</td><td>&lt;2{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>✅ 1.5{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Defeitos em Produção</td><td>&lt;5/release</td><td>✅ 3</td></tr>\n</table></figure>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A automação de testes é essencial para equipes que buscam qualidade em escala. Implementar uma estratégia eficaz requer planejamento, ferramentas certas e compromisso com melhoria contínua.</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie</strong> - Mapeie sua situação atual</li><br><li><strong>Priorize</strong> - Comece pelos testes mais impactantes</li><br><li><strong>Implemente</strong> - Construa sua framework</li><br><li><strong>Integre</strong> - CI/CD é fundamental</li><br><li><strong>Melhore</strong> - Métricas guiam evolução</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Qual a melhor ferramenta para começar?</strong>  <br>R: Playwright ou Cypress para E2E, pytest para API/unit. Ambos têm curva suave e documentação excelente.</p>\n\n<p><strong>P: Quantos testes devo automatizar?</strong>  <br>R: Foque em 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes mais executados (regressão) e críticos para o negócio.</p>\n\n<p><strong>P: Como lidar com testes flaky?</strong>  <br>R: Auto-wait robustos, retries configuráveis, isolamento de testes, investigar root cause.</p>\n\n<p><strong>P: Automação substitui testes manuais?</strong>  <br>R: Não. Automação executa testes existentes; exploratory testing ainda descobre bugs novos.</p>', 'Automação de Testes: Guia Completo para Implementação Eficiente', '', 'publish', 'closed', 'open', '', '07automacaotestes', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/07automacaotestes/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('184', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda estratégias de testes ágeis para equipes Scrum, Kanban e DevOps. Como implementar qualidade contínua em ciclos de desenvolvimento rápidos.</p>\n\n<hr>\n<h2>Introdução aos Testes Ágeis</h2>\n\n<p>Testes ágeis é uma abordagem que integra atividades de teste ao longo de todo o ciclo de desenvolvimento ágil, em vez de tratá-las como uma fase separada após a implementação. Esta filosofia promove qualidade contínua e colaboração entre desenvolvedores e testadores.</p>\n\n<h3>Princípios Fundamentais</h3>\n<ol><li><strong>Qualidade é responsabilidade de todos</strong> - Toda equipe é responsável pela qualidade</li>\n<li><strong>Testar cedo e frequentemente</strong> - Shift-Left em ação</li>\n<li><strong>Automação como habilitador</strong> - CI/CD e testes automatizados</li>\n<li><strong>Feedback rápido</strong> - loops de feedback curtos</li>\n<li><strong>Adaptação contínua</strong> - Melhoria baseada em retrospectivas</li>\n</ol>\n<hr>\n<h2>Testes em Diferentes Frameworks Ágeis</h2>\n\n<h3>1. Testes em Scrum</h3>\n\n<h4>Distribuição de Testes por Sprint</h4>\n\n<pre><code>Sprint (2 semanas)\n├── Semana 1\n│   ├── Dia 1-2: Planejamento + Desenvolvimento User Stories\n│   ├── Dia 3-4: Desenvolvimento + Testes Unitários\n│   └── Dia 5: Integração + Testes de Integração\n│\n└── Semana 2\n    ├── Dia 1-2: Testes manuais/exploratórios\n    ├── Dia 3-4: Automação de regressão\n    └── Dia 5: Demo + Retrospectiva\n</code></pre>\n\n<h4>Definition of Done (DoD)</h4>\n\n<p>Cada User Story só está \"Done\" quando:</p>\n\n<ul><li>[ ] Código implementado</li><ol><li>[ ] Unit tests escritos e passando (&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} coverage)</li>\n<li>[ ] Code review aprovado</li>\n<li>[ ] Testes de integração passando</li>\n<li>[ ] Testes funcionais passando</li>\n<li>[ ] Critérios de aceitação cumpridos</li>\n<li>[ ] Documentação atualizada</li>\n<li>[ ] Ready for Production</li>\n</ol>\n<h4>Definition of Ready (DoR)</h4>\n\n<p>Antes de entrar no Sprint:<br><ol><li>[ ] Critérios de aceitação definidos</li><br><li>[ ] Critérios de aceite claros e testáveis</li><br><li>[ ] Dependências identificadas</li><br><li>[ ] Estimativa de tamanho feita</li><br><li>[ ] Wireframes/UI definidos (se aplicável)</li><br></ol><br><h3>2. Testes em Kanban</h3></p>\n\n<h4>WIP Limits para QA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Etapa</th><th>WIP Limit</th><th>Razón</th></tr>\n<tr><td>To Do</td><td>10</td><td>Capacidade da equipe</td></tr>\n<tr><td>In Progress</td><td>5</td><td>Permite foco</td></tr>\n<tr><td>Testing</td><td>3</td><td>Qualidade no teste</td></tr>\n<tr><td>Review</td><td>2</td><td>bottlenecks visíveis</td></tr>\n<tr><td>Done</td><td>∞</td><td>Meta, não limite</td></tr>\n</table></figure>\n\n<h4>Fluxo de Testes Contínuo</h4>\n\n<pre><code>Backlog → Ready → In Dev → In Test → Ready to Deploy → Done\n              ↑                                   ↓\n              ←←←←←← BUG FOUND ←←←←←←←←←←←←←←←←←←←\n</code></pre>\n\n<h3>3. Testes em SAFe (Scaled Agile)</h3>\n\n<h4>Hierarquia de Testes</h4>\n\n<pre><code>Portfolio\n    ↓\nValue Stream\n    ↓\nLarge Solution (Program)\n    ├── Solution Demo\n    ├── Solution Acceptance\n    └── System Integration\n        ↓\n    Agile Release Train (ART)\n    ├── Iteration Planning\n    ├── Continuous Delivery Pipeline\n    └── System Demo\n        ↓\n    Team\n    ├── Unit Tests\n    ├── Component Tests\n    └── Feature Tests\n</code></pre>\n\n<hr>\n<h2>Estratégias de Teste por Fase Ágil</h2>\n\n<h3>Sprint 0: Preparação</h3>\n\n<p><strong>Atividades de Teste:</strong></p>\n\n<p>✅ Configurar ambiente de teste  <br>✅ Implementar framework de automação  <br>✅ Definir estratégia de testes  <br>✅ Criar templates de casos de teste  <br>✅ Estabelecer métricas de qualidade</p>\n\n<h3>Durante o Sprint</h3>\n\n<h4>Daily Testing Activities</h4>\n<ol><li><strong>Code Reviews</strong> - Verificar antes de commitar</li>\n<li><strong>Unit Tests</strong> - Desenvolvedor escreve junto com código</li>\n<li><strong>Peer Testing</strong> - Testar funcionalidades de colegas</li>\n<li><strong>Continuous Integration</strong> - Execução automática em cada commit</li>\n</ol>\n<h4>Quando Receber uma User Story</h4>\n\n<pre><code>1. READ → Ler critérios de aceitação<ol><li>DISCUSS → Tirar dúvidas com PO/analista</li>\n<li>CLARIFY →确保 compreensão comum</li>\n<li>PLAN → Identificar casos de teste</li>\n<li>TEST → Executar durante desenvolvimento</li>\n<li>AUTOMATE → Scripts de automação</li>\n<li>VERIFY → Confirmar que está \"Done\"</li>\n</ol></code></pre>\n\n<h3>Fim do Sprint</h3>\n\n<h4>Sprint Review Testing</h4>\n<ol><li>Demonstração de funcionalidades</li>\n<li>Validação com stakeholders</li>\n<li>Verificação de DoD</li>\n<li>Feedback do Product Owner</li>\n</ol>\n<h4>Sprint Retrospective</h4>\n<ol><li>O que funcionou bem em QA?</li>\n<li>O que precisa melhorar?</li>\n<li>Ações de melhoria para próximo sprint</li>\n</ol>\n<hr>\n<h2>Testes Ágeis em Prática</h2>\n\n<h3>Behavior-Driven Development (BDD)</h3>\n\n<h4>O Ciclo BDD</h4>\n\n<pre><code>        SPECIFICATION\n              ↓\n    ┌─────────────────────┐\n    │   User Stories      │\n    │   (Given-When-Then) │\n    └─────────────────────┘\n              ↓\n        IMPLEMENTATION\n              ↓\n    ┌─────────────────────┐\n    │   Executable Specs  │\n    │   (Cucumber/Behave) │\n    └─────────────────────┘\n              ↓\n         VALIDATION\n              ↓\n         FEEDBACK\n</code></pre>\n\n<h4>Exemplo de Cenário BDD</h4>\n\n<pre><code># features/login.feature\nFeature: Login de Usuário\n\n<p>Como um usuário registrado<br>  Quero fazer login no sistema<br>  Para acessar minha conta</p>\n\n<p>Scenario: Login com credenciais válidas<br>    Given que estou na página de login<br>    And o usuário \"joao@exemplo.com\" está registrado<br>    When eu preencho o campo email com \"joao@exemplo.com\"<br>    And eu preencho o campo senha com \"Senha@123\"<br>    And clico no botão \"Entrar\"<br>    Then sou redirecionado para o dashboard<br>    And uma mensagem de boas-vindas é exibida</p>\n\n<p>Scenario: Login com senha incorreta<br>    Given que estou na página de login<br>    And o usuário \"joao@exemplo.com\" está registrado<br>    When eu preencho o campo email com \"joao@exemplo.com\"<br>    And eu preencho o campo senha com \"senhaerrada\"<br>    And clico no botão \"Entrar\"<br>    Then permaneço na página de login<br>    And uma mensagem de erro \"Credenciais inválidas\" é exibida<br></code></pre></p>\n\n<pre><code># steps/login_steps.py\nfrom behave import given, when, then\nfrom selenium.webdriver.common.by import By\n\n<p>@given(\'que estou na página de login\')<br>def step_impl(context):<br>    context.driver.get(\'https://exemplo.com/login\')</p>\n\n<p>@when(\'eu preencho o campo email com \"{email}\"\')<br>def step_impl(context, email):<br>    context.driver.find_element(By.ID, \'email\').send_keys(email)</p>\n\n<p>@then(\'sou redirecionado para o dashboard\')<br>def step_impl(context):<br>    assert \'dashboard\' in context.driver.current_url<br></code></pre></p>\n\n<h3>Test-Driven Development (TDD)</h3>\n\n<h4>Ciclo Red-Green-Refactor</h4>\n\n<pre><code>    RED          GREEN         REFACTOR\n     ↓            ↓              ↓\n┌─────────┐  ┌─────────┐   ┌─────────────┐\n│Escreva   │  │Faça o   │   │Melhore o    │\n│Teste que │→ │teste    │→  │código sem   │\n│falha    │  │passar   │   │alterar      │\n└─────────┘  └─────────┘   │comportamento│\n     ↑                        └─────────────┘\n     └──────────────────────────────┘\n              (Repetir)\n</code></pre>\n\n<h4>Exemplo TDD</h4>\n\n<pre><code># TDD: Calculadora de desconto\n\n<p># 1. RED - Escrever teste que falha<br>def test_calcular_desconto_10_porcento():<br>    resultado = calcular_desconto(100, 10)<br>    assert resultado == 90  # Falha!</p>\n\n<p># 2. GREEN - Implementar código mínimo<br>def calcular_desconto(valor, percentual):<br>    return valor - (valor * percentual / 100)</p>\n\n<p># 3. REFACTOR - Melhorar código<br>def calcular_desconto(valor: float, percentual: float) -&gt; float:<br>    \"\"\"Calcula o valor final após desconto.\"\"\"<br>    if not 0 &lt;= percentual &lt;= 100:<br>        raise ValueError(\"Percentual deve estar entre 0 e 100\")<br>    return valor * (1 - percentual / 100)<br></code></pre></p>\n\n<hr>\n<h2>Automação de Testes em Ambientes Ágeis</h2>\n\n<h3>Pirâmide de Testes Ágil</h3>\n\n<pre><code>                    /\n                   /  \n                  / E2E      10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes end-to-end\n                 /________   Testes de aceitação de usuário\n                /          \n               /Integração   20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes de API/serviços\n              /______________\n             /                \n            /   Unitários       70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes unitários\n           /____________________ Rápidos, isolados, confiáveis\n</code></pre>\n\n<h3>Ferramentas por Camada</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Camada</th><th>Ferramentas</th><th>Linguagem</th></tr>\n<tr><td><strong>Unit</strong></td><td>JUnit, pytest, Jest, Mocha</td><td>Qualquer</td></tr>\n<tr><td><strong>Integration</strong></td><td>TestContainers, Postman</td><td>Qualquer</td></tr>\n<tr><td><strong>E2E</strong></td><td>Playwright, Cypress, Selenium</td><td>TS/JS/Python</td></tr>\n<tr><td><strong>Contract</strong></td><td>Pact, Spring Cloud Contract</td><td>Java/JS</td></tr>\n<tr><td><strong>Performance</strong></td><td>k6, JMeter, Gatling</td><td>Multi</td></tr>\n</table></figure>\n\n<h3>CI/CD Pipeline com Testes</h3>\n\n<pre><code># .github/workflows/ci.yml\nname: CI Pipeline\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  test:<br>    runs-on: ubuntu-latest</p>\n\n<p>services:<br>      postgres:<br>        image: postgres:15<br>        env:<br>          POSTGRES_DB: testdb<br>          POSTGRES_USER: test<br>          POSTGRES_PASSWORD: test</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p># Build<br>      - name: Build application<br>        run: npm ci &amp;&amp; npm run build</p>\n\n<p># Testes Unitários<br>      - name: Unit tests<br>        run: npm run test:unit -- --coverage<br>        env:<br>          DB_HOST: postgres</p>\n\n<p># Testes de Integração<br>      - name: Integration tests<br>        run: npm run test:integration<br>        env:<br>          DB_HOST: postgres</p>\n\n<p># Testes E2E<br>      - name: E2E tests<br>        run: npm run test:e2e<br>        if: github.event_name == \'push\'</p>\n\n<p># Análise de Código<br>      - name: SonarCloud Analysis<br>        uses: SonarSource/sonarcloud-github-action@master<br>        env:<br>          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}</p>\n\n<p># Upload Coverage<br>      - name: Upload coverage<br>        uses: codecov/codecov-action@v3<br></code></pre></p>\n\n<hr>\n<h2>Métricas Ágeis de Qualidade</h2>\n\n<h3>burndown de Defeitos</h3>\n\n<pre><code>Dias:   1  2  3  4  5  6  7  8  9 10\n        │  │  │  │  │  │  │  │  │  │\nIdeal ──└──┴──┴──┴──┴──┴──┴──┴──┴──┘\n        │\nReal ───└──┬──┬──┬──┐     ┌──┬──┬──┘\n          │  │  │  │     │  │  │\n         d1 d2 d3 d4     d7 d8 d9\n\n<p>Meta: Reduzir defeitos abertos ao longo do sprint<br></code></pre></p>\n\n<h3>Relatório de Qualidade do Sprint</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Sprint Anterior</th><th>Sprint Atual</th><th>Target</th></tr>\n<tr><td>Defeitos abertos no início</td><td>15</td><td>12</td><td>&lt;10</td></tr>\n<tr><td>Defeitos criados</td><td>8</td><td>6</td><td>&lt;5</td></tr>\n<tr><td>Defeitos resolvidos</td><td>11</td><td>10</td><td>&gt;8</td></tr>\n<tr><td>Defeitos em aberto no fim</td><td>12</td><td>8</td><td>&lt;5</td></tr>\n<tr><td>Cobertura de código</td><td>72{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>78{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Testes passando</td><td>95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>97{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&gt;98{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n</table></figure>\n\n<h3>Velocity de Testes</h3>\n\n<pre><code># Métricas de velocity de testes\nvelocity_data = {\n    \"sprints\": [1, 2, 3, 4, 5],\n    \"testes_automatizados\": [45, 68, 92, 115, 140],\n    \"cobertura\": [45, 55, 65, 73, 80],\n    \"tempo_execucao_min\": [60, 50, 42, 35, 30]\n}\n\n<p># Tendências<br>tendencia_teste = calculate_trend(velocity_data[\"testes_automatizados\"])<br>tendencia_cobertura = calculate_trend(velocity_data[\"cobertura\"])<br>tendencia_tempo = calculate_trend(velocity_data[\"tempo_execucao_min\"], descending=True)<br></code></pre></p>\n\n<hr>\n<h2>Desafios e Soluções</h2>\n\n<h3>Desafio 1: Falta de Tempo para Testes</h3>\n\n<p><strong>Soluções:</strong><br><ol><li>Automatizar tarefas repetitivas</li><br><li>Priorizar testes de maior impacto</li><br><li>Implementar Shift-Left</li><br><li>Dedicated time para automação</li><br></ol><br><h3>Desafio 2: Testes Lentes no CI</h3></p>\n\n<p><strong>Soluções:</strong><br><ol><li>Execução paralela</li><br><li>Selecionar testes por impacto</li><br><li>Cache de dependências</li><br><li>Execução em cloud</li><br></ol><br><h3>Desafio 3: Testes Flaky</h3></p>\n\n<p><strong>Soluções:</strong><br><ol><li>Waits explícitos ao invés de sleeps</li><br><li>Isolamento de testes</li><br><li>Retry strategies</li><br><li>Investigar root cause</li><br></ol><br><h3>Desafio 4: Cobertura Insuficiente</h3></p>\n\n<p><strong>Soluções:</strong><br><ol><li>TDD para novos features</li><br><li>Code coverage gates</li><br><li>Análise de risco para priorizar</li><br><li>Pair testing com devs</li><br></ol><br><hr><br><h2>Checklist de Testes Ágeis</h2></p>\n\n<h3>Antes do Sprint</h3>\n<ol><li>[ ] User Stories com critérios de aceitação claros</li>\n<li>[ ] Ambiente de teste configurado</li>\n<li>[ ] Framework de automação pronto</li>\n<li>[ ] Dados de teste准备好了</li>\n</ol>\n<h3>Durante o Sprint</h3>\n<ol><li>[ ] Unit tests escritos com código</li>\n<li>[ ] Code reviews realizados</li>\n<li>[ ] CI pipeline passando</li>\n<li>[ ] Testes manuais/exploratórios executados</li>\n</ol>\n<h3>Fim do Sprint</h3>\n<ol><li>[ ] Todos os testes passando</li>\n<li>[ ] DoD cumprido para cada story</li>\n<li>[ ] Regressão executada</li>\n<li>[ ] Métricas atualizadas</li>\n<li>[ ] Retrospectiva de QA realizada</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes ágeis não são apenas sobre ferramentas e automação - são sobre uma mentalidade de qualidade compartilhada por toda a equipe. As chaves para o sucesso são:<br><ol><li><strong>Integração</strong> - Testes não são fase separada</li><br><li><strong>Automação</strong> - Habilitador de velocidade</li><br><li><strong>Colaboração</strong> - Todos responsáveis por qualidade</li><br><li><strong>Feedback</strong> - Loops curtos de informação</li><br><li><strong>Melhoria</strong> - Retrospectivas e adaptação</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Como introduzir testes em uma equipe que não faz?</strong>  <br>R: Comece com unit tests, demonstre valor com métricas, expanda gradualmente.</p>\n\n<p><strong>P: Quantos testadores uma equipe ágil precisa?</strong>  <br>R: Não há número fixo. A proporção ideal depende da complexidade do projeto e maturidade da equipe.</p>\n\n<p><strong>P: Testes manuais ainda fazem sentido em ágil?</strong>  <br>R: Sim! Exploratory testing, UX testing e testes de novos cenários ainda são valiosos.</p>\n\n<p><strong>P: Como medir sucesso de testes ágeis?</strong>  <br>R: Métricas como cobertura, tempo de execução, defeitos em produção e velocity.</p>', 'Testes Ágeis: Estratégias para Equipes Ágeis e DevOps', '', 'publish', 'closed', 'open', '', '08testesageis', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/08testesageis/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('185', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Domine testes de performance: load testing, stress testing, spike testing e soak testing. Aprenda a usar JMeter, k6, Gatling e interprete resultados para otimizar seus sistemas.</p>\n\n<hr>\n<h2>Introdução aos Testes de Performance</h2>\n\n<p>Testes de performance são testes não-funcionais que avaliam quão bem um sistema se comporta sob diferentes condições de carga, volume e estresse. São críticos para garantir que aplicações atendam aos requisitos de velocidade, escalabilidade e estabilidade.</p>\n\n<h3>Por Que Testes de Performance São Essenciais?</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Impacto</th><th>Dados</th></tr>\n<tr><td><strong>Receita</strong></td><td>1 segundo de delay = 7{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos conversões</td></tr>\n<tr><td><strong>Usuários</strong></td><td>53{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} abandonam site se &gt;3s para carregar</td></tr>\n<tr><td><strong>Receita Amazon</strong></td><td>1 segundo de delay = $1.6B/ano em vendas</td></tr>\n<tr><td><strong>Google</strong></td><td>500ms extra = 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos buscas</td></tr>\n</table></figure>\n\n<hr>\n<h2>Tipos de Testes de Performance</h2>\n\n<h3>1. Load Testing (Teste de Carga)</h3>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas em produção.</p>\n\n<p><strong>Objetivos:</strong><br><ul><li>Medir tempos de resposta</li><ol><li>Verificar throughput máximo</li><br><li>Identificar bottlenecks</li><br><li>Validar SLAs</li><br></ol><br><strong>Exemplo de Cenário:</strong><br><pre><code>Carga esperada: 1000 usuários simultâneos<br>Horário de pico: 10:00-12:00 e 14:00-16:00<br>Transações por hora: 10.000<br></code></pre></p>\n\n<h3>2. Stress Testing (Teste de Estresse)</h3>\n\n<p>Avalia os limites do sistema além da capacidade normal.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar ponto de quebra</li><br><li>Medir degradação graciosa</li><br><li>Verificar recovery</li><br><li>Testar failovers</li><br></ol><br><strong>Cenário:</strong><br><pre><code>Normal: 1000 usuários<br>Stress: 2000 → 3000 → 5000 → 8000 → 10000 usuários<br>Objetivo: Encontrar onde o sistema quebra<br></code></pre></p>\n\n<h3>3. Spike Testing (Teste de Pico)</h3>\n\n<p>Avalia reações a picos súbitos de carga.</p>\n\n<pre><code>Carga normal: 1000 usuários\nPico: 5000 usuários em 5 segundos\nRecovery: 1000 usuários\nPadrão: On-off-on-off\n</code></pre>\n\n<h3>4. Soak Testing (Teste de Resistência)</h3>\n\n<p>Executa carga sustentada por período prolongado.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Connection pool exhaustion</li><br><li>Log rotation issues</li><br><li>Database connection limits</li><br><li>Disk space issues</li><br></ol><br><strong>Duração:</strong> 8-24+ horas contínuas</p>\n\n<h3>5. Endurance Testing</h3>\n\n<p>Similar ao Soak, mas com foco em validação de SLAs por longo período.</p>\n\n<hr>\n<h2>Métricas de Performance</h2>\n\n<h3>Métricas Principais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Descrição</th><th>Target Típico</th></tr>\n<tr><td><strong>Response Time (Avg)</strong></td><td>Tempo médio de resposta</td><td>&lt;2s para web, &lt;500ms para API</td></tr>\n<tr><td><strong>Response Time (P95)</strong></td><td>95º percentil</td><td>&lt;3s</td></tr>\n<tr><td><strong>Response Time (P99)</strong></td><td>99º percentil</td><td>&lt;5s</td></tr>\n<tr><td><strong>Throughput</strong></td><td>Requisições por segundo</td><td>Conforme especificado</td></tr>\n<tr><td><strong>Error Rate</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de requisições com erro</td><td>&lt;1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>CPU Usage</strong></td><td>Utilização de CPU</td><td>&lt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Memory Usage</strong></td><td>Utilização de memória</td><td>&lt;85{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Network I/O</strong></td><td>Largura de banda</td><td>Dentro de capacidade</td></tr>\n<tr><td><strong>Disk I/O</strong></td><td>Operações de disco</td><td>&lt;70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} capacidade</td></tr>\n</table></figure>\n\n<h3>Como Medir Percentis</h3>\n\n<pre><code>Lista de tempos de resposta (ms):\n[120, 150, 180, 200, 220, 250, 280, 300, 350, 400, 500, 600, 800, 1000]\n\n<p>Média: 334ms<br>Mediana (P50): 275ms<br>P95: 800ms (5{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} acima = 800ms)<br>P99: 1000ms (1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} acima = 1000ms)<br></code></pre></p>\n\n<hr>\n<h2>Ferramentas de Teste de Performance</h2>\n\n<h3>1. Apache JMeter</h3>\n\n<p><strong>Melhor para:</strong> Projetos enterprise, testes complexos</p>\n\n<h4>Instalação e Configuração</h4>\n\n<pre><code># Download JMeter\nwget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.6.3.tgz\ntar -xzf apache-jmeter-5.6.3.tgz\n\n<p># Executar (requer Java 8+)<br>cd apache-jmeter-5.6.3/bin<br>./jmeter.sh<br></code></pre></p>\n\n<h4>Exemplo de Plano de Teste (GUI)</h4>\n\n<pre><code>Test Plan\n├── Thread Group (Users: 100, Ramp-up: 10s, Loop: 10)\n│   ├── HTTP Request Defaults (Server: api.exemplo.com)\n│   │   └── Path: /api/produtos\n│   ├── HTTP Cookie Manager\n│   ├── Listeners\n│   │   ├── Summary Report\n│   │   ├── View Results Tree\n│   │   └── Graph Results\n</code></pre>\n\n<h4>Script JMeter (CLI)</h4>\n\n<pre><code>\n\n  \n    \n      API Load Test\n    \n    \n      \n        100\n        10\n        10\n      \n      \n        \n          api.exemplo.com\n          GET\n          /api/produtos\n        \n      \n    \n  \n\n</code></pre>\n\n<pre><code># Executar via CLI\n./jmeter.sh -n -t api_test.jmx -l results.jtl -e -o html_report\n</code></pre>\n\n<h3>2. k6 (Grafana k6)</h3>\n\n<p><strong>Melhor para:</strong> DevOps, scripts em JS, CI/CD integrado</p>\n\n<h4>Instalação</h4>\n\n<pre><code># macOS\nbrew install k6\n\n<p># Linux<br>sudo gpg -k<br>sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69<br>echo \"deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main\" | sudo tee /etc/apt/sources.list.d/k6.list<br>sudo apt-get update<br>sudo apt-get install k6<br></code></pre></p>\n\n<h4>Script k6 - Load Test Básico</h4>\n\n<pre><code>// load-test.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\nimport { Rate, Trend } from \'k6/metrics\';\n\n<p>// Métricas customizadas<br>const errorRate = new Rate(\'errors\');<br>const responseTime = new Trend(\'response_time\');</p>\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },   // Ramp-up<br>    { duration: \'5m\', target: 100 },   // Steady state<br>    { duration: \'2m\', target: 200 },   // Stress<br>    { duration: \'5m\', target: 200 },   // Steady state<br>    { duration: \'2m\', target: 0 },     // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das req &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // &lt; 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>    errors: [\'rate&lt;0.1&#039;],               // &lt; 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de erros<br>  },<br>};</p>\n\n<p>const BASE_URL = \'https://api.exemplo.com\';</p>\n\n<p>export default function () {<br>  // Login para obter token<br>  const loginRes = http.post(<code>${BASE_URL}/auth/login</code>, {<br>    email: \'usuario@teste.com\',<br>    password: \'senha123\',<br>  });</p>\n\n<p>check(loginRes, {<br>    \'login status 200\': (r) =&gt; r.status === 200,<br>    \'token received\': (r) =&gt; r.json(\'token\') !== undefined,<br>  });</p>\n\n<p>const token = loginRes.json(\'token\');</p>\n\n<p>// Listar produtos com token<br>  const productsRes = http.get(<code>${BASE_URL}/api/produtos</code>, {<br>    headers: {<br>      \'Authorization\': <code>Bearer ${token}</code>,<br>    },<br>  });</p>\n\n<p>responseTime.add(productsRes.timings.duration);<br>  errorRate.add(productsRes.status !== 200);</p>\n\n<p>check(productsRes, {<br>    \'products status 200\': (r) =&gt; r.status === 200,<br>    \'products returned\': (r) =&gt; r.json(\'data\').length &gt; 0,<br>  });</p>\n\n<p>sleep(1);<br>}<br></code></pre></p>\n\n<h4>Script k6 - Spike Test</h4>\n\n<pre><code>// spike-test.js\nimport http from \'k6/http\';\nimport { check } from \'k6\';\n\n<p>export const options = {<br>  scenarios: {<br>    spike_test: {<br>      executor: \'ramping-vus\',<br>      startVUs: 0,<br>      stages: [<br>        { duration: \'10s\', target: 100 },   // Normal<br>        { duration: \'30s\', target: 1000 },    // SPIKE!<br>        { duration: \'30s\', target: 1000 },   // Hold<br>        { duration: \'10s\', target: 100 },    // Recovery<br>        { duration: \'10s\', target: 0 },      // Cooldown<br>      ],<br>    },<br>  },<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;1000&#039;],<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/health\');<br>  check(res, { \'status OK\': (r) =&gt; r.status === 200 });<br>}<br></code></pre></p>\n\n<h3>3. Gatling</h3>\n\n<p><strong>Melhor para:</strong> Scala/Java, relatórios detalhados, CI/CD</p>\n\n<h4>Instalação</h4>\n\n<pre><code># Download\nwget https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/3.10.5/gatling-charts-highcharts-bundle-3.10.5.zip\nunzip gatling-charts-highcharts-bundle-3.10.5.zip\n</code></pre>\n\n<h4>Script Gatling (Scala)</h4>\n\n<pre><code>// src/test/scala/LoadSimulation.scala\npackage simulations\n\n<p>import io.gatling.core.Predef._<br>import io.gatling.http.Predef._</p>\n\n<p>class LoadSimulation extends Simulation {</p>\n\n<p>val baseUrl = \"https://api.exemplo.com\"</p>\n\n<p>val httpConfig = http<br>    .baseUrl(baseUrl)<br>    .acceptHeader(\"application/json\")<br>    .contentTypeHeader(\"application/json\")</p>\n\n<p>val userFeeder = csv(\"users.csv\").random</p>\n\n<p>val scn = scenario(\"API Load Test\")<br>    .feed(userFeeder)<br>    .exec(<br>      http(\"Login\")<br>        .post(\"/auth/login\")<br>        .body(StringBody(\"\"\"{\"email\":\"${email}\",\"password\":\"${password}\"}\"\"\"))<br>        .check(jsonPath(\"$.token\").saveAs(\"authToken\"))<br>    )<br>    .pause(1)<br>    .exec(<br>      http(\"Get Products\")<br>        .get(\"/api/produtos\")<br>        .header(\"Authorization\", \"Bearer ${authToken}\")<br>        .check(status.is(200))<br>    )<br>    .pause(1)<br>    .exec(<br>      http(\"Get Product Details\")<br>        .get(\"/api/produtos/1\")<br>        .header(\"Authorization\", \"Bearer ${authToken}\")<br>        .check(status.is(200))<br>    )</p>\n\n<p>setUp(<br>    scn.inject(<br>      rampUsers(100).during(30.seconds),<br>      constantUsersPerSec(50).during(60.seconds)<br>    )<br>  )<br>  .protocols(httpConfig)<br>  .thresholds(<br>    http_req_duration.p95.lt(500),<br>    http_req_duration.p99.lt(1000)<br>  )<br>}<br></code></pre></p>\n\n<h3>4. Locust (Python)</h3>\n\n<p><strong>Melhor para:</strong> Equipes Python, testes distribuídos</p>\n\n<h4>Instalação</h4>\n\n<pre><code>pip install locust\n</code></pre>\n\n<h4>Script Locust</h4>\n\n<pre><code># locustfile.py\nfrom locust import HttpUser, task, between, events\nimport random\n\n<p>class APIClient(HttpUser):<br>    wait_time = between(1, 3)</p>\n\n<p>def on_start(self):<br>        \"\"\"Login antes de executar tarefas\"\"\"<br>        response = self.client.post(\"/auth/login\", json={<br>            \"email\": \"usuario@teste.com\",<br>            \"password\": \"senha123\"<br>        })<br>        if response.status_code == 200:<br>            self.token = response.json()[\"token\"]<br>        else:<br>            self.token = None</p>\n\n<p>@task(3)<br>    def list_products(self):<br>        \"\"\"Listar produtos (mais frequente)\"\"\"<br>        if self.token:<br>            self.client.get(<br>                \"/api/produtos\",<br>                headers={\"Authorization\": f\"Bearer {self.token}\"}<br>            )</p>\n\n<p>@task(2)<br>    def get_product(self):<br>        \"\"\"Detalhes de produto\"\"\"<br>        product_id = random.randint(1, 100)<br>        if self.token:<br>            self.client.get(<br>                f\"/api/produtos/{product_id}\",<br>                headers={\"Authorization\": f\"Bearer {self.token}\"}<br>            )</p>\n\n<p>@task(1)<br>    def create_order(self):<br>        \"\"\"Criar pedido (menos frequente)\"\"\"<br>        if self.token:<br>            self.client.post(<br>                \"/api/pedidos\",<br>                headers={\"Authorization\": f\"Bearer {self.token}\"},<br>                json={<br>                    \"produto_id\": random.randint(1, 100),<br>                    \"quantidade\": random.randint(1, 5)<br>                }<br>            )</p>\n\n<p># Executar<br># locust -f locustfile.py --host=https://api.exemplo.com<br></code></pre></p>\n\n<hr>\n<h2>Cenários de Teste Common</h2>\n\n<h3>1. E-commerce</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Cenário</th><th>Usuários</th><th>Duração</th><th>Objetivo</th></tr>\n<tr><td>Navegação</td><td>500</td><td>10 min</td><td>P95 &lt; 2s</td></tr>\n<tr><td>Busca</td><td>200</td><td>5 min</td><td>Throughput &gt; 50/s</td></tr>\n<tr><td>Checkout</td><td>100</td><td>15 min</td><td>P95 &lt; 5s</td></tr>\n<tr><td>Pico Black Friday</td><td>2000</td><td>1 min</td><td>Sistema estável</td></tr>\n</table></figure>\n\n<h3>2. API REST</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Endpoint</th><th>Load</th><th>Stress</th><th>Spike</th></tr>\n<tr><td>GET /users</td><td>1000 rps</td><td>2000 rps</td><td>5000 rps</td></tr>\n<tr><td>POST /orders</td><td>500 rps</td><td>1000 rps</td><td>2000 rps</td></tr>\n<tr><td>GET /products</td><td>2000 rps</td><td>4000 rps</td><td>8000 rps</td></tr>\n</table></figure>\n\n<h3>3. Aplicação Web</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Página</th><th>Target Load</th><th>P95 Target</th></tr>\n<tr><td>Home</td><td>1000 concurrent</td><td>&lt;3s</td></tr>\n<tr><td>Search</td><td>500 concurrent</td><td>&lt;2s</td></tr>\n<tr><td>Product Page</td><td>800 concurrent</td><td>&lt;2.5s</td></tr>\n<tr><td>Checkout</td><td>200 concurrent</td><td>&lt;5s</td></tr>\n</table></figure>\n\n<hr>\n<h2>Interpretando Resultados</h2>\n\n<h3>Identificando Bottlenecks</h3>\n\n<h4>CPU Bound</h4>\n\n<pre><code>Sintomas:<ol><li>CPU &gt; 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</li>\n<li>Throughput não aumenta com mais usuários</li>\n<li>Response time aumenta linearmente</li>\n</ol>\nSoluções:<ol><li>Otimizar algoritmos</li>\n<li>Cachear resultados</li>\n<li>Adicionar índices ao banco</li>\n<li>Load balancing</li>\n</ol></code></pre>\n\n<h4>Memory Bound</h4>\n\n<pre><code>Sintomas:<ol><li>Memory leak crescente</li>\n<li>Garbage collection frequente</li>\n<li>OOM errors</li>\n</ol>\nSoluções:<ol><li>Code review para memory leaks</li>\n<li>Aumentar memória</li>\n<li>Pool de objetos</li>\n<li>Compactação de dados</li>\n</ol></code></pre>\n\n<h4>I/O Bound</h4>\n\n<pre><code>Sintomas:<ol><li>Disk I/O 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</li>\n<li>Network saturation</li>\n<li>Queries lentas</li>\n</ol>\nSoluções:<ol><li>Cache de queries</li>\n<li>Compressão de dados</li>\n<li>CDN para estáticos</li>\n<li>Read replicas</li>\n</ol></code></pre>\n\n<h3>Dashboard de Resultados</h3>\n\n<pre><code>// Exemplo de parse de resultados JMeter para dashboard\nconst results = parseJMeterResults(\'results.jtl\');\n\n<p>const summary = {<br>  totalRequests: results.length,<br>  avgResponseTime: results.avg(r =&gt; r.elapsed),<br>  p95ResponseTime: results.percentile(95, r =&gt; r.elapsed),<br>  p99ResponseTime: results.percentile(99, r =&gt; r.elapsed),<br>  errorRate: results.filter(r =&gt; r.success === false).length / results.length,<br>  throughput: results.length / (results.max(r =&gt; r.timestamp) - results.min(r =&gt; r.timestamp)) * 1000,<br>};</p>\n\n<p>console.log(`<br>=== Load Test Summary ===<br>Total Requests: ${summary.totalRequests}<br>Avg Response: ${summary.avgResponseTime}ms<br>P95 Response: ${summary.p95ResponseTime}ms<br>P99 Response: ${summary.p99ResponseTime}ms<br>Error Rate: ${(summary.errorRate * 100).toFixed(2)}{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>Throughput: ${summary.throughput.toFixed(2)} req/s<br>`);<br></code></pre></p>\n\n<hr>\n<h2>Melhores Práticas</h2>\n\n<h3>Antes do Teste</h3>\n<ol><li><strong>Definir objetivos claros</strong> - SLAs, thresholds</li>\n<li><strong>Ambiente isolado</strong> - Não testar em produção</li>\n<li><strong>Dados准备了</strong> - Massa de dados realista</li>\n<li><strong>Baseline estabelecido</strong> - Métricas de referência</li>\n<li><strong>Monitoramento configurado</strong> - APM tools</li>\n</ol>\n<h3>Durante o Teste</h3>\n<ol><li><strong>Iniciar gradualmente</strong> - Ramp-up suave</li>\n<li><strong>Monitorar em tempo real</strong> - Dashboards ativos</li>\n<li><strong>Documentar incidentes</strong> - Timestamps e evidências</li>\n<li><strong>Não tocar no ambiente</strong> - Interferência mínima</li>\n<li><strong>Capturar métricas</strong> - Logs, monitoring, profiling</li>\n</ol>\n<h3>Após o Teste</h3>\n<ol><li><strong>Analisar resultados</strong> - Correlacionar métricas</li>\n<li><strong>Identificar bottlenecks</strong> - Root cause analysis</li>\n<li><strong>Documentar achados</strong> - Relatório técnico</li>\n<li><strong>Recomendar ações</strong> - Priorizadas por impacto</li>\n<li><strong>Repetir testes</strong> - Validar otimizações</li>\n</ol>\n<hr>\n<h2>Checklist de Teste de Performance</h2>\n\n<h3>Preparação</h3>\n<ol><li>[ ] Objetivos de teste definidos</li>\n<li>[ ] SLAs documentados</li>\n<li>[ ] Ambiente configurado</li>\n<li>[ ] Dados de teste criados</li>\n<li>[ ] Baselinecapturado</li>\n<li>[ ] Monitoramento configurado</li>\n</ol>\n<h3>Execução</h3>\n<ol><li>[ ] Teste piloto executado</li>\n<li>[ ] Carga gradual aplicada</li>\n<li>[ ] Métricas capturadas</li>\n<li>[ ] Incidentes documentados</li>\n<li>[ ] Logs coletados</li>\n</ol>\n<h3>Análise</h3>\n<ol><li>[ ] Resultados analisados</li>\n<li>[ ] Bottlenecks identificados</li>\n<li>[ ] Recomendações formuladas</li>\n<li>[ ] Relatório preparado</li>\n<li>[ ] Ações priorizadas</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de performance são essenciais para garantir que suas aplicações atendam às expectativas dos usuários em termos de velocidade, escalabilidade e estabilidade. A escolha da ferramenta certa depende do contexto do projeto, mas o mais importante é:<br><ol><li><strong>Testar regularmente</strong> - Não apenas antes de releases</li><br><li><strong>Definir SLAs claros</strong> - Métricas objetivas</li><br><li><strong>Analisar resultados</strong> - Não apenas coletar</li><br><li><strong>Otimizar continuamente</strong> - Melhoria progressiva</li><br><li><strong>Automatizar</strong> - CI/CD integrado</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Quantos usuários devo simular no load test?</strong>  <br>R: Baseie-se em seus picos de uso real + margem de 20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}.</p>\n\n<p><strong>P: Qual é o P95 ideal?</strong>  <br>R: Depende do tipo de aplicação. API: &lt;500ms, Web: &lt;3s, Mobile: &lt;2s.</p>\n\n<p><strong>P: Como often devo executar load tests?</strong>  <br>R: Mínimo: antes de cada release. Ideal: diária com subset, semanal completa.</p>\n\n<p><strong>P: Load test em produção é uma boa ideia?</strong>  <br>R: Somente com feature flags, canary deployments e monitoramento rigoroso.</p>', 'Testes de Performance: Guia Completo de Load Testing e Stress Testing', '', 'publish', 'closed', 'open', '', '09testesperformance', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/09testesperformance/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('186', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda a implementar testes de segurança eficazes: OWASP Top 10, penetration testing, SAST, DAST, SCA e análise de vulnerabilidades. Guia completo para proteção de aplicações.</p>\n\n<hr>\n<h2>Introdução à Segurança de Software</h2>\n\n<p>A segurança de software é um aspecto crítico do desenvolvimento moderno. Com o aumento de ataques cibernéticos e regulamentações como LGPD e GDPR, garantir que suas aplicações sejam seguras não é mais opcional - é uma necessidade de negócios.</p>\n\n<h3>Estatísticas Alarmantes</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Dado</th><th>Porcentagem</th></tr>\n<tr><td>Ataques direcionados a apps web</td><td>40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de todos os ataques</td></tr>\n<tr><td>Cust médio de violação de dados</td><td>R$ 6.4 milhões</td></tr>\n<tr><td>Tempo médio para detectar breach</td><td>207 dias</td></tr>\n<tr><td>apps com vulnerabilidades críticas</td><td>47{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>OWASP Top 10 presente em</td><td>94{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das apps</td></tr>\n</table></figure>\n\n<hr>\n<h2>OWASP Top 10: As Maiores Vulnerabilidades</h2>\n\n<p>O OWASP Top 10 é o guia definitivo das vulnerabilidades mais críticas em aplicações web. Vamos explorar cada uma.</p>\n\n<h3>A01 - Broken Access Control (Controle de Acesso Quebrado)</h3>\n\n<p><strong>Descrição:</strong> Usuários podem executar ações além de suas permissões permitidas.</p>\n\n<p><strong>Exemplos:</strong><br><pre><code># VULNERÁVEL - IDOR (Insecure Direct Object Reference)<br>@app.route(\'/pedidos/\')<br>def get_pedido(id):<br>    # Não verifica se o pedido pertence ao usuário logado<br>    return Pedido.query.get(id)</p>\n\n<p># SEGURO<br>@app.route(\'/pedidos/\')<br>@login_required<br>def get_pedido(id):<br>    pedido = Pedido.query.filter_by(<br>        id=id, <br>        usuario_id=current_user.id<br>    ).first_or_404()<br>    return pedido<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><br><ul><li>Implementar autorização em cada camada</li><ol><li>Negar por padrão</li><br><li>Usar IDs aleatórios (UUID)</li><br><li>Log de acessos</li><br></ol><br><h3>A02 - Cryptographic Failures (Falhas Criptográficas)</h3></p>\n\n<p><strong>Descrição:</strong> Exposição de dados sensíveis devido a criptografia inadequada.</p>\n\n<p><strong>Exemplos:</strong><br><pre><code># VULNERÁVEL<br>senha = \"senha123\"  # Sem hash<br>dados = dados.encode(\"utf-8\")  # Sem criptografia</p>\n\n<p># SEGURO<br>from cryptography.fernet import Fernet</p>\n\n<p># Gerar chave (armazenar em segurança!)<br>key = Fernet.generate_key()<br>cipher = Fernet(key)</p>\n\n<p>senha_hash = bcrypt.hashpw(\"senha123\".encode(), bcrypt.gensalt())<br>dados_criptografados = cipher.encrypt(dados)<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>Usar criptografia forte (AES-256, bcrypt, Argon2)</li><br><li>Gerenciar chaves com Key Vault</li><br><li>TLS para dados em trânsito</li><br><li>Nunca hardcodar secrets</li><br></ol><br><h3>A03 - Injection (Injeção)</h3></p>\n\n<p><strong>Descrição:</strong> Injeção de código malicioso através de inputs não sanitizados.</p>\n\n<p><strong>Exemplos:</strong></p>\n\n<pre><code>-- SQL Injection Vulnerável\ncursor.execute(f\"SELECT * FROM users WHERE email = \'{email}\'\")\n\n<p>-- SQL Injection Seguro<br>cursor.execute(\"SELECT * FROM users WHERE email = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s\", (email,))<br></code></pre></p>\n\n<pre><code># Command Injection Vulnerável\nos.system(f\"ping {host}\")\n\n<p># Command Injection Seguro<br>import subprocess<br>subprocess.run([\"ping\", host])  # Lista, não string!<br></code></pre></p>\n\n<pre><code>// XSS Vulnerável\ndocument.getElementById(\'comment\').innerHTML = userInput;\n\n<p>// XSS Seguro<br>document.getElementById(\'comment\').textContent = userInput;<br>// ou<br>element.textContent = sanitizeHTML(userInput);<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>Sanitizar e validar inputs</li><br><li>Usar ORM ou queries parametrizadas</li><br><li>Escapar outputs</li><br><li>Content Security Policy (CSP)</li><br></ol><br><h3>A04 - Insecure Design (Design Inseguro)</h3></p>\n\n<p><strong>Descrição:</strong> Arquitetura e modelagem de sistema com falhas de segurança inerentes.</p>\n\n<p><strong>Mitigação:</strong><ol><li>Threat modeling na fase de design</li><br><li>Segregar recursos por criticidade</li><br><li>Limitar tentativas de login (rate limiting)</li><br><li>Princípio de menor privilégio</li><br></ol><br><h3>A05 - Security Misconfiguration (Configuração de Segurança)</h3></p>\n\n<p><strong>Exemplos:</strong><br><pre><code># Docker vulnerável<br>docker run -p 80:80 -v /:/root image:latest</p>\n\n<p># Docker seguro<br>docker run <br>  --read-only <br>  --no-new-privileges <br>  -p 8080:8080 <br>  --cap-drop ALL <br>  image:latest<br></code></pre></p>\n\n<pre><code># Flask vulnerável\napp = Flask(__name__)\napp.debug = True  # Reveals code in errors!\n\n<p># Flask seguro<br>app = Flask(__name__)<br>app.config[\'DEBUG\'] = False<br>app.config[\'PROPAGATE_EXCEPTIONS\'] = False<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>Hardening de servidores</li><br><li>Revisão de configurações</li><br><li>Automação de patching</li><br><li>Arquitetura minimalista</li><br></ol><br><h3>A06 - Vulnerable and Outdated Components (Componentes Vulneráveis)</h3></p>\n\n<p><strong>Mitigação:</strong><br><pre><code># Verificar dependências vulneráveis<br>pip install safety<br>safety check</p>\n\n<p># npm audit<br>npm audit</p>\n\n<p># OWASP Dependency-Check<br>dependency-check --project App --scan ./lib<br></code></pre></p>\n\n<pre><code># GitHub Actions - Verificar vulnerabilidades em PR<ol><li>name: Run Snyk Security Test</li>\n</ol>  uses: snyk/actions/python@master\n  with:\n    args: --severity-threshold=high\n  env:\n    SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}\n</code></pre>\n\n<h3>A07 - Identification and Authentication Failures</h3>\n\n<pre><code># Vulnerável - Sem rate limiting\n@app.route(\'/login\', methods=[\'POST\'])\ndef login():\n    user = User.query.filter_by(email=email).first()\n    if bcrypt.checkpw(password, user.password_hash):\n        login_user(user)\n        return redirect(\'/dashboard\')\n\n<p># Seguro - Com rate limiting<br>from flask_limiter import Limiter<br>limiter = Limiter(app)</p>\n\n<p>@app.route(\'/login\', methods=[\'POST\'])<br>@limiter.limit(\"5 per minute\")<br>def login():<br>    # ... resto do código<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>MFA (Autenticação Multifator)</li><br><li>Rate limiting em autenticação</li><br><li>Senhas complexas (passphrase &gt; senha)</li><br><li>Sessões com timeout</li><br></ol><br><h3>A08 - Software and Data Integrity Failures</h3></p>\n\n<pre><code># GitHub Actions - Verificar integridade de dependências<ol><li>name: Verify checksums</li>\n</ol>  run: |\n    echo \"$CHECKSUM\" &gt; expected_checksum.txt\n    sha256sum -c expected_checksum.txt\n  env:\n    CHECKSUM: ${{ secrets.CHECKSUM }}\n</code></pre>\n\n<p><strong>Mitigação:</strong><ol><li>Verificar integridade de dependências</li><br><li>Assinar artefatos</li><br><li>CI/CD com aprovações</li><br><li>Não confiar em dados não verificados</li><br></ol><br><h3>A09 - Security Logging and Monitoring Failures</h3></p>\n\n<pre><code>import logging\nfrom flask import request\n\n<p>logger = logging.getLogger(__name__)</p>\n\n<p>@app.before_request<br>def log_request():<br>    logger.info({<br>        \'ip\': request.remote_addr,<br>        \'method\': request.method,<br>        \'path\': request.path,<br>        \'user_agent\': request.headers.get(\'User-Agent\')<br>    })</p>\n\n<p>@app.route(\'/login\', methods=[\'POST\'])<br>def login():<br>    if failed_login(user):<br>        logger.warning({<br>            \'event\': \'failed_login\',<br>            \'email\': request.form.get(\'email\'),<br>            \'ip\': request.remote_addr,<br>            \'attempts\': get_attempts(request.remote_addr)<br>        })<br>        # Alertar se muitas tentativas<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>Logging de todos os eventos de segurança</li><br><li>Monitoramento 24/7</li><br><li>Alertas para anomalias</li><br><li>Retenção de logs adequada</li><br></ol><br><h3>A10 - Server-Side Request Forgery (SSRF)</h3></p>\n\n<pre><code># Vulnerável\n@app.route(\'/fetch_url\')\ndef fetch_url():\n    url = request.args.get(\'url\')\n    response = requests.get(url)  # Pode acessar internamente!\n    return response.text\n\n<p># Seguro<br>from urllib.parse import urlparse</p>\n\n<p>ALLOWED_HOSTS = [\'api.exemplo.com\', \'cdn.exemplo.com\']</p>\n\n<p>@app.route(\'/fetch_url\')<br>def fetch_url():<br>    url = request.args.get(\'url\')<br>    parsed = urlparse(url)</p>\n\n<p>if parsed.hostname not in ALLOWED_HOSTS:<br>        abort(403)</p>\n\n<p># Block private IPs<br>    if parsed.hostname in [\'localhost\', \'127.0.0.1\', \'0.0.0.0\']:<br>        abort(403)</p>\n\n<p>return requests.get(url).text<br></code></pre></p>\n\n<hr>\n<h2>Ferramentas de Teste de Segurança</h2>\n\n<h3>SAST - Static Application Security Testing</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Linguagem</th><th>Tipo</th><th>Custo</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Multi</td><td>Self-hosted</td><td>Grátis/Enterprise</td></tr>\n<tr><td><strong>Snyk Code</strong></td><td>Multi</td><td>Cloud</td><td>Grátis/Pro</td></tr>\n<tr><td><strong>Semgrep</strong></td><td>Multi</td><td>CLI</td><td>Grátis</td></tr>\n<tr><td><strong>Checkmarx</strong></td><td>Multi</td><td>Enterprise</td><td>Comercial</td></tr>\n<tr><td><strong>Fortify</strong></td><td>Multi</td><td>Enterprise</td><td>Comercial</td></tr>\n</table></figure>\n\n<h3>DAST - Dynamic Application Security Testing</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Custo</th></tr>\n<tr><td><strong>OWASP ZAP</strong></td><td>Open Source</td><td>Grátis</td></tr>\n<tr><td><strong>Burp Suite</strong></td><td>Freemium</td><td>$399+/ano</td></tr>\n<tr><td><strong>Acunetix</strong></td><td>Commercial</td><td>Sob consulta</td></tr>\n<tr><td><strong>Netsparker</strong></td><td>Commercial</td><td>Sob consulta</td></tr>\n</table></figure>\n\n<h3>SCA - Software Composition Analysis</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Custo</th></tr>\n<tr><td><strong>Snyk</strong></td><td>Dependencies</td><td>Grátis/Pro</td></tr>\n<tr><td><strong>OWASP Dep-Check</strong></td><td>Dependencies</td><td>Grátis</td></tr>\n<tr><td><strong>WhiteSource</strong></td><td>Enterprise</td><td>Comercial</td></tr>\n<tr><td><strong>FOSSA</strong></td><td>License compliance</td><td>Grátis/Pro</td></tr>\n</table></figure>\n\n<h3>IAST - Interactive Application Security Testing</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th></tr>\n<tr><td><strong>Contrast Security</strong></td><td>Commercial</td></tr>\n<tr><td><strong>Hdiv</strong></td><td>Commercial</td></tr>\n<tr><td><strong>Seeker</strong> (Synopsys)</td><td>Commercial</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando Testes de Segurança no CI/CD</h2>\n\n<h3>GitHub Actions - Pipeline de Segurança</h3>\n\n<pre><code>name: Security Pipeline\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  sast:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Semgrep<br>        uses: returntocorp/semgrep-action@v1<br>        with:<br>          config: &gt;<br>            p/owasp-top-ten<br>            p/nodejs-scan</p>\n\n<p>- name: SonarCloud Scan<br>        uses: SonarSource/sonarcloud-github-action@master<br>        env:<br>          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}</p>\n\n<p>sca:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Snyk<br>        uses: snyk/actions/python@master<br>        with:<br>          args: --severity-threshold=high</p>\n\n<p>dast:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Start application<br>        run: docker-compose up -d</p>\n\n<p>- name: OWASP ZAP Scan<br>        uses: zaproxy/action-baseline@v0.9.0<br>        with:<br>          target: \'https://localhost:8443\'<br>          rules_rules_name: \'api-scan\'<br></code></pre></p>\n\n<hr>\n<h2>Penetration Testing</h2>\n\n<h3>Metodologia OWASP</h3>\n\n<pre><code>1. Information Gathering\n   - Footprinting\n   - Enumeration\n   <ol><li>Threat Modeling</li>\n</ol>   - Identify assets\n   - Analyze threats\n   <ol><li>Vulnerability Analysis</li>\n</ol>   - Automated scanning\n   - Manual testing\n   <ol><li>Exploitation</li>\n</ol>   - Proof of concept\n   - Impact assessment\n   <ol><li>Reporting</li>\n</ol>   - Findings\n   - Recommendations\n   - Remediation\n</code></pre>\n\n<h3>Tipos de Pentest</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo</th><th>Conhecimento</th><th>Escopo</th><th>Custo</th></tr>\n<tr><td><strong>Black Box</strong></td><td>Zero</td><td>Sem informação</td><td>$$$</td></tr>\n<tr><td><strong>Gray Box</strong></td><td>Parcial</td><td>Credenciais limitadas</td><td>$$$$</td></tr>\n<tr><td><strong>White Box</strong></td><td>Total</td><td>Código e documentação</td><td>$$$$$</td></tr>\n</table></figure>\n\n<h3>Ferramentas de Pentest</h3>\n\n<pre><code># Reconhecimento\nnmap -sV -sC target.com\nsubfinder -d target.com\namass enum -passive -d target.com\n\n<p># Scanning<br>nikto -h https://target.com<br>sqlmap -u \"https://target.com/api?id=1\"<br>XSStrike -u \"https://target.com/search?q=test\"</p>\n\n<p># Exploitation<br>metasploit framework<br>burp suite professional<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Segurança de software é responsabilidade de todos. Implementar testes de segurança de forma integrada ao ciclo de desenvolvimento é essencial para reduzir riscos e proteger dados sensíveis.</p>\n\n<p><strong>Resumo:</strong><ol><li>OWASP Top 10 deve ser training obrigatório</li><br><li>SAST/DAST/SCA integrados ao CI/CD</li><br><li>Pentests periódicos são essenciais</li><br><li>Nunca confie em inputs de usuários</li><br><li>Criptografia forte é não negociável</li></ol></ul></p>\n\n<hr>\n<h3>FAQ</h3>\n\n<p><strong>P: Com que frequência devo fazer pentests?</strong>  <br>R: Mínimo annually, idealmente a cada 6 meses ou após grandes mudanças.</p>\n\n<p><strong>P: SAST substitui DAST?</strong>  <br>R: Não. SAST analisa código, DAST testa aplicação em execução. São complementares.</p>\n\n<p><strong>P: Como começar com segurança em devs?</strong>  <br>R: Treinamento OWASP Top 10, implementar SAST no CI/CD, secure code review.</p>\n\n<p><strong>P: Bug bounty substitui pentest?</strong>  <br>R: Não. São complementares. Bug bounty encontra issues em produção, pentest é controlado.</p>', 'Testes de Segurança: OWASP, Penetration Testing e Análise de Vulnerabilidades', '', 'publish', 'closed', 'open', '', '10testesseguranca', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/10testesseguranca/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('187', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Descubra como integrar QA no DevOps: CI/CD pipelines, quality gates, automação de testes em pipeline e métricas de qualidade para equipes DevOps modernas.</p>\n\n<hr>\n<h2>A Evolução de QA para DevOps</h2>\n\n<p>DevOps representa a fusão de desenvolvimento e operações, com QA como ponte essencial entre os dois mundos. A qualidade não é mais uma fase separada, mas um valor integrado em cada etapa do pipeline.</p>\n\n<h3>Transformação Cultural</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tradicional</th><th>DevOps</th></tr>\n<tr><td>QA como gatekeeper</td><td>QA como habilitador</td></tr>\n<tr><td>Testes no final</td><td>Testes contínuos</td></tr>\n<tr><td>Releases trimestrais</td><td>Deploys diários</td></tr>\n<tr><td>Siloed teams</td><td>Squads multifuncionais</td></tr>\n<tr><td>Reativo</td><td>Proativo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Pipeline de CI/CD com Qualidade Integrada</h2>\n\n<h3>Visão Geral do Pipeline</h3>\n\n<pre><code>Code → Build → Test → Security → Deploy → Monitor → Feedback\n  ↓      ↓       ↓       ↓          ↓         ↓         ↓\nCommit  Unit   Integration  SAST/DAST  Staging  APM     Retrospectiva\nReview  Tests   + E2E       SCA        Deploy   Alerts\n</code></pre>\n\n<h3>Estrutura do Pipeline</h3>\n\n<h4>1. Stage: Code (Commit)</h4>\n\n<pre><code># .github/workflows/code-quality.yml\nname: Code Quality\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  lint:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Set up Python<br>        uses: actions/setup-python@v5<br>        with:<br>          python-version: \'3.11\'</p>\n\n<p>- name: Install linters<br>        run: pip install ruff black flake8</p>\n\n<p>- name: Run Ruff (Linter)<br>        run: ruff check .</p>\n\n<p>- name: Run Black (Formatter)<br>        run: black --check .</p>\n\n<p>- name: Run type checker<br>        run: pip install mypy &amp;&amp; mypy src/<br></code></pre></p>\n\n<h4>2. Stage: Build</h4>\n\n<pre><code>  build:\n    needs: lint\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n<p>- name: Build Docker image<br>        run: |<br>          docker build <br>            --tag app:${{ github.sha }} <br>            --tag app:latest <br>            .</p>\n\n<p>- name: Run Trivy (Container scan)<br>        uses: aquasecurity/trivy-action@master<br>        with:<br>          image-ref: \'app:${{ github.sha }}\'<br>          format: \'sarif\'<br>          output: \'trivy-results.sarif\'<br></code></pre></p>\n\n<h4>3. Stage: Unit Tests</h4>\n\n<pre><code>  unit-tests:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n<p>- name: Run Unit Tests<br>        run: |<br>          docker-compose run --rm test pytest <br>            --cov=src <br>            --cov-report=xml <br>            --cov-fail-under=80</p>\n\n<p>- name: Upload coverage<br>        uses: codecov/codecov-action@v3<br></code></pre></p>\n\n<h4>4. Stage: Integration Tests</h4>\n\n<pre><code>  integration-tests:\n    runs-on: ubuntu-latest\n    services:\n      postgres:\n        image: postgres:15\n        env:\n          POSTGRES_DB: test\n          POSTGRES_USER: test\n          POSTGRES_PASSWORD: test\n        options: &gt;-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 5432:5432\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Integration Tests<br>        env:<br>          DATABASE_URL: postgresql://test:test@localhost:5432/test<br>        run: |<br>          docker-compose run --rm test pytest <br>            tests/integration/ <br>            -v <br>            --tb=short<br></code></pre></p>\n\n<h4>5. Stage: E2E Tests</h4>\n\n<pre><code>  e2e-tests:\n    runs-on: ubuntu-latest\n    if: github.event_name == \'push\'\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run E2E Tests<br>        run: |<br>          npm ci<br>          npx playwright install --with-deps<br>          npm run test:e2e</p>\n\n<p>- name: Upload test results<br>        uses: actions/upload-artifact@v4<br>        if: always()<br>        with:<br>          name: playwright-report<br>          path: playwright-report/<br></code></pre></p>\n\n<h4>6. Stage: Security Scan</h4>\n\n<pre><code>  security:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n<p>- name: SAST with Semgrep<br>        uses: returntocorp/semgrep-action@v1</p>\n\n<p>- name: SCA with Snyk<br>        uses: snyk/actions/python@master<br>        with:<br>          args: --severity-threshold=high</p>\n\n<p>- name: DAST with OWASP ZAP<br>        run: |<br>          docker run -t owasp/zap2docker-stable <br>            zap-baseline.py <br>            -t https://staging.exemplo.com <br>            -J zap-results.json<br></code></pre></p>\n\n<h4>7. Stage: Deploy (Quality Gates)</h4>\n\n<pre><code>  deploy-staging:\n    needs: [security, e2e-tests]\n    runs-on: ubuntu-latest\n    environment: staging\n\n<p>steps:<br>      - name: Deploy to Staging<br>        run: |<br>          kubectl apply -f k8s/staging/</p>\n\n<p>- name: Smoke Tests<br>        run: |<br>          curl -f https://staging.exemplo.com/health || exit 1</p>\n\n<p>- name: Notify<br>        run: |<br>          echo \"Deploy concluído para staging\"<br></code></pre></p>\n\n<hr>\n<h2>Quality Gates</h2>\n\n<p>Quality Gates são pontos de verificação que determinam se o código pode avançar no pipeline.</p>\n\n<h3>Critérios de Quality Gate</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Gate</th><th>Critério</th><th>Ação se Falhar</th></tr>\n<tr><td><strong>Code Coverage</strong></td><td>&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>Blocker</td></tr>\n<tr><td><strong>Code Quality</strong></td><td>No critical issues</td><td>Blocker</td></tr>\n<tr><td><strong>Security Scan</strong></td><td>No high/critical CVEs</td><td>Blocker</td></tr>\n<tr><td><strong>Unit Tests</strong></td><td>100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} passing</td><td>Blocker</td></tr>\n<tr><td><strong>E2E Tests</strong></td><td>&gt;95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} passing</td><td>Blocker</td></tr>\n<tr><td><strong>Performance</strong></td><td>P95 &lt; 500ms</td><td>Warning</td></tr>\n</table></figure>\n\n<h3>Implementação de Quality Gates</h3>\n\n<pre><code># Quality Gate no GitHub Actions\n<ul><li>name: Check Quality Gates</li></ul>\n  run: |\n    # Verificar cobertura\n    COVERAGE=$(cat coverage/coverage.xml | grep -oP \'(?&lt;=line-covered=&quot;)d+&#039;)\n    TOTAL=$(cat coverage/coverage.xml | grep -oP &#039;(?&lt;=line-count=&quot;)d+&#039;)\n    PERCENTAGE=$((COVERAGE * 100 / TOTAL))\n\n<p>echo \"Coverage: ${PERCENTAGE}{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</p>\n\n<p>if [ $PERCENTAGE -lt 80 ]; then<br>      echo \"❌ Coverage below 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br>      exit 1<br>    fi</p>\n\n<p># Verificar security<br>    if [ -f \"snyk/snyk.sarif\" ]; then<br>      VULNS=$(cat snyk/snyk.sarif | grep -c \"high|critical\")<br>      if [ $VULNS -gt 0 ]; then<br>        echo \"❌ Security vulnerabilities found\"<br>        exit 1<br>      fi<br>    fi</p>\n\n<p>echo \"✅ All quality gates passed\"<br></code></pre></p>\n\n<hr>\n<h2>TestContainers para Testes de Integração</h2>\n\n<pre><code># testcontainers_example.py\nimport pytest\nfrom selenium import webdriver\nfrom selenium.webdriver.common.by import By\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\n\n<p>@pytest.fixture(scope=\"class\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as postgres:<br>        url = postgres.get_connection_url()<br>        yield url</p>\n\n<p>@pytest.fixture(scope=\"class\")<br>def redis():<br>    with RedisContainer(\"redis:7\") as redis:<br>        yield redis.get_connection_url()</p>\n\n<p>@pytest.fixture(scope=\"class\")<br>def app(postgres, redis):<br>    \"\"\"SUT com dependências reais\"\"\"<br>    import os<br>    os.environ[\'DATABASE_URL\'] = postgres<br>    os.environ[\'REDIS_URL\'] = redis</p>\n\n<p>from app import create_app<br>    app = create_app()<br>    app.config[\'TESTING\'] = True</p>\n\n<p>with app.app_context():<br>        from models import db<br>        db.create_all()</p>\n\n<p>yield app</p>\n\n<p>@pytest.fixture<br>def client(app):<br>    return app.test_client()<br></code></pre></p>\n\n<hr>\n<h2>Métricas DevOps de Qualidade</h2>\n\n<h3>Four Keys (DORA Metrics)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Descrição</th><th>Target Elite</th></tr>\n<tr><td><strong>Deployment Frequency</strong></td><td>Frequência de deploys</td><td>On-demand (várias vezes/dia)</td></tr>\n<tr><td><strong>Lead Time for Changes</strong></td><td>Tempo do commit ao prod</td><td>&lt;1 hora</td></tr>\n<tr><td><strong>Time to Restore</strong></td><td>Tempo para recovery</td><td>&lt;1 hora</td></tr>\n<tr><td><strong>Change Failure Rate</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de deploys com falha</td><td>&lt;15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n</table></figure>\n\n<h3>Dashboard de Qualidade</h3>\n\n<pre><code># Métricas para Grafana\npanels:\n  - title: \"Test Coverage\"\n    query: \"coverage_percentage{job=\'unit-tests\'}\"\n    thresholds:\n      - value: 80\n        color: green\n      - value: 60\n        color: yellow\n      - value: 0\n        color: red\n\n<p>- title: \"Test Pass Rate\"<br>    query: \"rate(test_passed_total[5m]) / rate(test_total[5m])\"<br>    thresholds:<br>      - value: 0.95<br>        color: green</p>\n\n<p>- title: \"Pipeline Duration\"<br>    query: \"histogram_quantile(0.95, pipeline_duration_bucket)\"<br>    unit: \"s\"</p>\n\n<p>- title: \"Failed Deployments\"<br>    query: \"rate(deployment_failed_total[1h])\"<br></code></pre></p>\n\n<hr>\n<h2>Estratégia de Deploy</h2>\n\n<h3>Canary Deployment</h3>\n\n<pre><code># Argo Rollouts Canary\napiVersion: argoproj.io/v1alpha1\nkind: Rollout\nmetadata:\n  name: my-app\nspec:\n  strategy:\n    canary:\n      steps:\n        - setWeight: 5\n        - pause: {duration: 10m}\n        - setWeight: 20\n        - pause: {duration: 10m}\n        - setWeight: 50\n        - pause: {duration: 30m}\n      analysis:\n        templates:\n          - templateName: success-rate\n        args:\n          - name: service-name\n            value: my-app-canary\n</code></pre>\n\n<h3>Feature Flags</h3>\n\n<pre><code># Feature Flags com LaunchDarkly\nimport launchdarkly_server_sdk\n\n<p>client = launchdarkly_server_sdk.Client(\"sdk-key\")</p>\n\n<p>user = {<br>    \"key\": user_id,<br>    \"email\": email,<br>    \"custom\": {<br>        \"team\": team<br>    }<br>}</p>\n\n<p># Check feature flag<br>if client.variation(\"new_checkout\", user, False):<br>    return new_checkout_flow()<br>else:<br>    return legacy_checkout_flow()<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Integrar QA no DevOps não é apenas sobre ferramentas - é uma mudança cultural. As chaves para o sucesso são:<br><ol><li><strong>Automação em primeiro lugar</strong> - Tudo que pode ser automatizado deve</li><br><li><strong>Quality Gates efetivos</strong> - Critérios claros para avanzar</li><br><li><strong>Feedback rápido</strong> - Detectar problemas cedo</li><br><li><strong>Métricas de qualidade</strong> - Medir é melhorar</li><br><li><strong>Melhoria contínua</strong> - Retrospectivas e ajustes</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Como começar a integrar QA em DevOps?</strong>  <br>R: Comece com unit tests no CI, depois expanda para integração e E2E gradualmente.</p>\n\n<p><strong>P: Quantos testes devo ter no pipeline?</strong>  <br>R: Priorize por impacto e risco. Cobertura &gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} é bom target.</p>\n\n<p><strong>P: Quality Gates devem ser obrigatórios?</strong>  <br>R: Para código em main, sim. Para feature branches, podem ser warnings.</p>\n\n<p><strong>P: Como medir ROI de DevOps QA?</strong>  <br>R: DORA metrics + redução de bugs em produção + tempo economizado.</p>', 'DevOps e QA: Integrando Qualidade no Pipeline de Entrega Contínua', '', 'publish', 'closed', 'open', '', '11devopsqa', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/11devopsqa/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('188', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda a testar aplicativos mobile: Appium, Espresso, XCTest, testes emulators vs dispositivos reais, e automação mobile para iOS e Android.</p>\n\n<hr>\n<h2>Introdução aos Testes Mobile</h2>\n\n<p>Testar aplicativos mobile apresenta desafios únicos: múltiplas versões de OS, diferentes tamanhos de tela, conectividade variável e interação touch. Uma estratégia de teste mobile eficaz deve cobrir dispositivos, plataformas e condições de uso diversas.</p>\n\n<h3>Panorama Mobile</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Dado</th><th>Valor</th></tr>\n<tr><td>Apps disponíveis</td><td>6.5+ milhões</td></tr>\n<tr><td>Tempo médio em apps</td><td>4.8 horas/dia</td></tr>\n<tr><td>Usuários mobile</td><td>7.33 bilhões</td></tr>\n<tr><td>Fragmentação Android</td><td>24.000+ dispositivos</td></tr>\n<tr><td>iOS versions ativas</td><td>4-5 simultâneas</td></tr>\n</table></figure>\n\n<hr>\n<h2>Estratégia de Testes Mobile</h2>\n\n<h3>Pirâmide de Testes Mobile</h3>\n\n<pre><code>              /\n             /           E2E Tests\n            /____        (10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\n           /             Funcionalidade completa\n          /              em dispositivos reais\n         /__________\n        /               Integration Tests\n       /______________  (20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\n      /                 Componentes e módulos\n     /__________________\n    /                     Unit Tests\n   /______________________ (70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\n   Componentes e lógica\n</code></pre>\n\n<h3>Dispositivos: Emuladores vs. Reais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Aspecto</th><th>Emuladores</th><th>Dispositivos Reais</th></tr>\n<tr><td><strong>Custo</strong></td><td>Grátis</td><td>Dispositivos físicos</td></tr>\n<tr><td><strong>Velocidade</strong></td><td>Mais lentos</td><td>Mais rápidos</td></tr>\n<tr><td><strong>Acurácia</strong></td><td>Limitada</td><td>Real</td></tr>\n<tr><td><strong>Hardware</strong></td><td>CPU/RAM limitados</td><td>Real performance</td></tr>\n<tr><td><strong>Sensores</strong></td><td>Simulados</td><td>Reais (GPS, câmera)</td></tr>\n<tr><td><strong>Rede</strong></td><td>Controlável</td><td>Real, variável</td></tr>\n</table></figure>\n\n<p><strong>Recomendação:</strong> Usar ambos - emuladores para CI/rapidez, dispositivos reais para QA final.</p>\n\n<hr>\n<h2>Ferramentas de Teste Mobile</h2>\n\n<h3>1. Appium - Cross-Platform</h3>\n\n<p><strong>Melhor para:</strong> Testes cross-platform (iOS + Android) com uma codebase.</p>\n\n<h4>Instalação</h4>\n\n<pre><code># macOS com Homebrew\nbrew install node\nnpm install -g appium\nnpm install -g appium-doctor\nappium &amp;\n</code></pre>\n\n<h4>Configuração Android</h4>\n\n<pre><code># SDK Android\nexport ANDROID_HOME=~/Android/Sdk\nexport PATH=$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools\n\n<p># Start emulador<br>$ANDROID_HOME/emulator/emulator -avd Pixel_6_API_33<br></code></pre></p>\n\n<h4>Script Appium (Python)</h4>\n\n<pre><code>from appium import webdriver\nfrom appium.webdriver.common.appiumby import AppiumBy\nfrom appium.webdriver.common.touch_action import TouchAction\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n<p>class TestApp:<br>    @pytest.fixture<br>    def driver(self):<br>        capabilities = {<br>            \"platformName\": \"Android\",<br>            \"deviceName\": \"Pixel_6_API_33\",<br>            \"app\": \"/path/to/app.apk\",<br>            \"automationName\": \"UiAutomator2\",<br>            \"autoGrantPermissions\": True<br>        }</p>\n\n<p>driver = webdriver.Remote(<br>            \"http://localhost:4723/wd/hub\",<br>            capabilities<br>        )<br>        yield driver<br>        driver.quit()</p>\n\n<p>def test_login_flow(self, driver):<br>        # Aguardar elementos<br>        wait = WebDriverWait(driver, 10)</p>\n\n<p># Clicar no campo email<br>        email_field = wait.until(<br>            EC.presence_of_element_located(<br>                (AppiumBy.ANDROID_UIAUTOMATOR, \'resourceId(\"com.app:id/email\")\')<br>            )<br>        )<br>        email_field.send_keys(\"usuario@test.com\")</p>\n\n<p># Clicar no campo senha<br>        driver.find_element(<br>            AppiumBy.ANDROID_UIAUTOMATOR,<br>            \'resourceId(\"com.app:id/password\")\'<br>        ).send_keys(\"senha123\")</p>\n\n<p># Clicar em Login<br>        driver.find_element(<br>            AppiumBy.ANDROID_UIAUTOMATOR,<br>            \'text(\"Entrar\")\'<br>        ).click()</p>\n\n<p># Verificar redirecionamento para dashboard<br>        wait.until(<br>            EC.presence_of_element_located(<br>                (AppiumBy.ANDROID_UIAUTOMATOR, \'text(\"Dashboard\")\')<br>            )<br>        )</p>\n\n<p>def test_swipe_gesture(self, driver):<br>        # Obter tamanho da tela<br>        size = driver.get_window_size()<br>        start_x = size[\'width\'] * 0.5<br>        start_y = size[\'height\'] * 0.8<br>        end_y = size[\'height\'] * 0.2</p>\n\n<p># Swipe up<br>        TouchAction(driver).press(start_x, start_y).move_to(0, -500).release().perform()</p>\n\n<p>def test_scroll_to_element(self, driver):<br>        # Scroll até encontrar elemento<br>        driver.find_element(<br>            AppiumBy.ANDROID_UIAUTOMATOR,<br>            \'new UiScrollable(new UiSelector()).scrollIntoView(text(\"Settings\"))\'<br>        )<br></code></pre></p>\n\n<h3>2. Espresso - Android Nativo</h3>\n\n<p><strong>Melhor para:</strong> Projetos Android com Kotlin/Java.</p>\n\n<h4>Dependências (build.gradle)</h4>\n\n<pre><code>androidTestImplementation \'androidx.test.espresso:espresso-core:3.5.1\'\nandroidTestImplementation \'androidx.test:runner:1.5.2\'\nandroidTestImplementation \'androidx.test:rules:1.5.0\'\n</code></pre>\n\n<h4>Script Espresso (Kotlin)</h4>\n\n<pre><code>package com.example.app\n\n<p>import androidx.test.ext.junit.rules.ActivityScenarioRule<br>import androidx.test.ext.junit.runners.AndroidJUnit4<br>import androidx.test.filters.LargeTest<br>import org.junit.Rule<br>import org.junit.Test<br>import org.junit.runner.RunWith<br>import static androidx.test.espresso.Espresso.*<br>import static androidx.test.espresso.action.ViewActions.*<br>import static androidx.test.espresso.assertion.ViewAssertions.*<br>import static androidx.test.espresso.matcher.ViewMatchers.*</p>\n\n<p>@RunWith(AndroidJUnit4::class)<br>@LargeTest<br>class LoginTest {</p>\n\n<p>@get:Rule<br>    val activityRule = ActivityScenarioRule(LoginActivity::class.java)</p>\n\n<p>@Test<br>    fun testLoginWithValidCredentials() {<br>        // Preencher email<br>        onView(withId(R.id.email_input))<br>            .perform(typeText(\"usuario@test.com\"), closeSoftKeyboard())</p>\n\n<p>// Preencher senha<br>        onView(withId(R.id.password_input))<br>            .perform(typeText(\"senha123\"), closeSoftKeyboard())</p>\n\n<p>// Clicar em Login<br>        onView(withId(R.id.login_button))<br>            .perform(click())</p>\n\n<p>// Verificar navegação para Dashboard<br>        onView(withId(R.id.dashboard_title))<br>            .check(matches(isDisplayed()))<br>    }</p>\n\n<p>@Test<br>    fun testLoginWithInvalidCredentials() {<br>        onView(withId(R.id.email_input))<br>            .perform(typeText(\"invalido@test.com\"))<br>            .perform(typeText(\"senhaerrada\"), closeSoftKeyboard())</p>\n\n<p>onView(withId(R.id.login_button)).perform(click())</p>\n\n<p>// Verificar mensagem de erro<br>        onView(withId(R.id.error_message))<br>            .check(matches(withText(\"Credenciais inválidas\")))<br>    }</p>\n\n<p>@Test<br>    fun testScrollThroughList() {<br>        // Scroll down<br>        onView(withId(R.id.product_list))<br>            .perform(<br>                RecyclerViewActions.scrollTo(<br>                    hasDescendant(withText(\"Product 50\"))<br>                )<br>            )</p>\n\n<p>// Clicar no item<br>        onView(withText(\"Product 50\"))<br>            .perform(click())<br>    }<br>}<br></code></pre></p>\n\n<h3>3. XCTest - iOS Nativo</h3>\n\n<p><strong>Melhor para:</strong> Projetos iOS com Swift/Objective-C.</p>\n\n<h4>Script XCTest (Swift)</h4>\n\n<pre><code>import XCTest\n\n<p>class LoginTests: XCTestCase {</p>\n\n<p>var app: XCUIApplication!</p>\n\n<p>override func setUp() {<br>        super.setUp()<br>        continueAfterFailure = false<br>        app = XCUIApplication()<br>        app.launchArguments = [\"--uitesting\"]<br>        app.launch()<br>    }</p>\n\n<p>func testLoginWithValidCredentials() {<br>        // Acessar campos<br>        let emailField = app.textFields[\"email_input\"]<br>        let passwordField = app.secureTextFields[\"password_input\"]<br>        let loginButton = app.buttons[\"login_button\"]</p>\n\n<p>// Preencher credenciais<br>        emailField.tap()<br>        emailField.typeText(\"usuario@test.com\")</p>\n\n<p>passwordField.tap()<br>        passwordField.typeText(\"senha123\")</p>\n\n<p>// Clicar em Login<br>        loginButton.tap()</p>\n\n<p>// Verificar Dashboard<br>        XCTAssertTrue(<br>            app.staticTexts[\"dashboard_title\"].waitForExistence(timeout: 5)<br>        )<br>    }</p>\n\n<p>func testPullToRefresh() {<br>        // Encontrar UITableView<br>        let tableView = app.tables[\"product_list\"]</p>\n\n<p>// Pull to refresh<br>        let firstCell = tableView.cells.element(boundBy: 0)<br>        let cellCenter = firstCell.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0))<br>        let pullPoint = cellCenter.withOffset(CGVector(dx: 0, dy: -100))</p>\n\n<p>cellCenter.press(forDuration: 0, thenDragTo: pullPoint)</p>\n\n<p>// Verificar refresh indicator<br>        XCTAssertTrue(app.activityIndicators[\"refresh_indicator\"].exists)<br>    }</p>\n\n<p>func testSwipeToDelete() {<br>        let tableView = app.tables[\"product_list\"]<br>        let cell = tableView.cells.element(boundBy: 0)</p>\n\n<p>// Swipe left<br>        cell.swipeLeft()</p>\n\n<p>// Clicar em Delete<br>        app.buttons[\"delete_button\"].tap()</p>\n\n<p>// Verificar confirmação<br>        app.alerts[\"Confirma exclusão?\"].buttons[\"Excluir\"].tap()<br>    }<br>}<br></code></pre></p>\n\n<hr>\n<h2>Testes em Dispositivos Reais</h2>\n\n<h3>Serviços de Cloud Testing</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Serviço</th><th>Dispositivos</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>BrowserStack</strong></td><td>3000+</td><td>$29+/mês</td><td>Cobertura completa</td></tr>\n<tr><td><strong>Sauce Labs</strong></td><td>1000+</td><td>$39+/mês</td><td>Enterprise</td></tr>\n<tr><td><strong>AWS Device Farm</strong></td><td>数百</td><td>Sob demanda</td><td>AWS integration</td></tr>\n<tr><td><strong>Firebase Test Lab</strong></td><td>数百</td><td>Pay-per-use</td><td>Android focused</td></tr>\n</table></figure>\n\n<h3>Setup BrowserStack</h3>\n\n<pre><code># pytest + BrowserStack\nfrom appium import webdriver\n\n<p>def get_browserstack_driver():<br>    desired_caps = {<br>        \"platformName\": \"android\",<br>        \"deviceName\": \"Samsung Galaxy S23\",<br>        \"os_version\": \"13.0\",<br>        \"app\": \"bs://APP_ID\",<br>        \"browserstack.user\": \"USER\",<br>        \"browserstack.key\": \"ACCESS_KEY\",<br>        \"browserstack.debug\": True,<br>        \"browserstack.networkLogs\": True<br>    }</p>\n\n<p>return webdriver.Remote(<br>        \"http://hub-cloud.browserstack.com/wd/hub\",<br>        desired_caps<br>    )<br></code></pre></p>\n\n<hr>\n<h2>Cenários de Teste Mobile</h2>\n\n<h3>1. Testes de Interface</h3>\n\n<pre><code>def test_responsividade_telas():\n    \"\"\"Testa layouts em diferentes tamanhos de tela\"\"\"\n    sizes = [\n        (360, 640),  # Small phone\n        (390, 844),  # iPhone 12/13\n        (412, 915),  # Large phone\n        (600, 1024), # Tablet portrait\n    ]\n\n<p>for width, height in sizes:<br>        driver.execute_script(f\"setWindowSize({width}, {height})\")</p>\n\n<p># Verificar elementos não se sobrepõem<br>        assert not elements_overlap(header, footer)<br>        assert text_is_readable(header)<br></code></pre></p>\n\n<h3>2. Testes de Conectividade</h3>\n\n<pre><code>def test_offline_mode():\n    \"\"\"Testa comportamento sem internet\"\"\"\n    # Desligar rede\n    driver.set_network_connection(0)  # Airplane mode\n\n<p># Tentar acessar conteúdo offline<br>    assert app.has_cached_content()<br>    assert app.can_show_cached_products()</p>\n\n<p># Tentar ação que requer internet<br>    with pytest.raises(NetworkError):<br>        app.submit_order()</p>\n\n<p># Reconectar<br>    driver.set_network_connection(6)  # WiFi</p>\n\n<p># Sincronizar<br>    app.sync_pending_orders()<br>    assert order.was_synced()<br></code></pre></p>\n\n<h3>3. Testes de Performance</h3>\n\n<pre><code>@Test\nfun testListScrollPerformance() {\n    val recyclerView = espresso.onView(\n        withId(R.id.product_list)\n    )\n\n<p>// Medir FPS durante scroll<br>    val monitor = FrameMetricsMonitor()</p>\n\n<p>recyclerView.perform(<br>        scrollToPosition(100),<br>        scrollToPosition(50),<br>        scrollToPosition(0)<br>    )</p>\n\n<p>val metrics = monitor.getMetrics()</p>\n\n<p>// Verificar 60 FPS (16.67ms por frame)<br>    assertThat(metrics.averageFrameTime).isLessThan(20.0)<br>    assertThat(metrics.droppedFrames).isLessThan(5)<br>}<br></code></pre></p>\n\n<hr>\n<h2>Appium + CI/CD</h2>\n\n<h3>GitHub Actions</h3>\n\n<pre><code>name: Mobile Tests\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  android-tests:<br>    runs-on: macos-latest</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Java<br>        uses: actions/setup-java@v4<br>        with:<br>          java-version: \'17\'</p>\n\n<p>- name: Setup Android SDK<br>        uses: android-actions/setup-android@v2</p>\n\n<p>- name: Cache Appium<br>        uses: actions/cache@v3<br>        with:<br>          path: node_modules<br>          key: ${{ runner.os }}-appium</p>\n\n<p>- name: Install Dependencies<br>        run: |<br>          npm ci<br>          pip install pytest pytest-appium</p>\n\n<p>- name: Run Tests on BrowserStack<br>        env:<br>          BROWSERSTACK_USER: ${{ secrets.BS_USER }}<br>          BROWSERSTACK_KEY: ${{ secrets.BS_KEY }}<br>        run: |<br>          pytest tests/mobile/ <br>            --device=\"Samsung Galaxy S23\" <br>            --platform=\"Android 13\" <br>            --hub=\"http://hub.browserstack.com/wd/hub\"<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes mobile requerem estratégia bem definida cobrindo múltiplas plataformas, dispositivos e condições. As chaves para sucesso são:<br><ol><li><strong>Automação estratégica</strong> - Appium para cross-platform, nativo para performance</li><br><li><strong>Device matrix</strong> - Priorizar por uso real</li><br><li><strong>CI/CD integrado</strong> - Testes em cloud para escalabilidade</li><br><li><strong>Performance monitorada</strong> - FPS, memória, bateria</li><br><li><strong>Testes de condições reais</strong> - Offline, network switching</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Appium é mais lento que Espresso/XCTest?</strong>  <br>R: Sim, mas permite código único para iOS e Android.</p>\n\n<p><strong>P: Quantos dispositivos testar?</strong>  <br>R: Foque nos top 10-20 dispositivos por mercado (iOS, Android).</p>\n\n<p><strong>P: Como testar notificações push?</strong>  <br>R: Use emuladores para automação, dispositivos reais para validação final.</p>\n\n<p><strong>P: Testes mobile podem ser 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} automatizados?</strong>  <br>R: Não. Alguns testes (usabilidade, exploratory) requerem testers humanos.</p>', 'Testes Mobile: Guia Completo para Apps iOS e Android', '', 'publish', 'closed', 'open', '', '12testesmobile', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/12testesmobile/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('189', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda TDD do zero: ciclo Red-Green-Refactor, baby steps, mocks e práticas essenciais para escrever código testável e robusto.</p>\n\n<hr>\n<h2>O Que é TDD?</h2>\n\n<p>Test-Driven Development (TDD) é uma metodologia de desenvolvimento onde você escreve os testes antes do código de produção. O ciclo é simples: Red (falha), Green (passa), Refactor (melhora).</p>\n\n<h3>Ciclo Red-Green-Refactor</h3>\n\n<pre><code>    RED              GREEN            REFACTOR\n     ↓                ↓                 ↓\n┌─────────┐     ┌─────────┐      ┌─────────────┐\n│Escreva  │     │Faça o   │      │Melhore o    │\n│o teste  │ →   │código   │ →    │código sem   │\n│que      │     │mínimo   │      │mudar o      │\n│falha    │     │passar   │      │comportamento│\n└─────────┘     └─────────┘      └─────────────┘\n     ↑                                   │\n     └───────────────────────────────────┘\n                 (Repetir)\n</code></pre>\n\n<hr>\n<h2>Por Que TDD?</h2>\n\n<h3>Benefícios Quantificados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Com TDD</th><th>Sem TDD</th></tr>\n<tr><td>Defeitos em produção</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos</td><td>Baseline</td></tr>\n<tr><td>Cobertura de testes</td><td>90-100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>20-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Confiança em refactoring</td><td>Alta</td><td>Baixa</td></tr>\n<tr><td>Tempo de debugging</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos</td><td>Baseline</td></tr>\n<tr><td>Custo de manutenção</td><td>40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menor</td><td>Baseline</td></tr>\n</table></figure>\n\n<h3>Quando Usar TDD</h3>\n\n<p><strong>TDD BRILHA quando:</strong><br><ul><li>Algoritmos complexos</li><ol><li>APIs e bibliotecas</li><br><li>Refactoring de código legado</li><br><li>Código compartilhado</li><br><li>Requisitos claros</li><br></ol><br><strong>TDD é mais difícil quando:</strong><ol><li>UI layouts complexos</li><br><li>Exploratory features</li><br><li>Requisitos muito instáveis</li><br><li>Prototipagem rápida</li><br></ol><br><hr><br><h2>TDD em Diferentes Linguagens</h2></p>\n\n<h3>Python com pytest</h3>\n\n<pre><code># 1. RED - Escrever teste que falha\nimport pytest\n\n<p>def test_somar_dois_numeros_positivos():<br>    # Dado<br>    a = 2<br>    b = 3</p>\n\n<p># Quando<br>    resultado = somar(a, b)</p>\n\n<p># Então<br>    assert resultado == 5</p>\n\n<p># 2. GREEN - Implementar código mínimo<br>def somar(a, b):<br>    return 5  # Hardcoded para fazer passar</p>\n\n<p># 3. REFACTOR - Implementar corretamente<br>def somar(a, b):<br>    return a + b<br></code></pre></p>\n\n<h3>Exemplo Completo: Calculadora de Desconto</h3>\n\n<h4>RED - Testes Iniciais</h4>\n\n<pre><code># tests/test_desconto.py\nimport pytest\nfrom desconto import CalculadoraDesconto\n\n<p>class TestCalculadoraDesconto:<br>    def setup_method(self):<br>        self.calc = CalculadoraDesconto()</p>\n\n<p>def test_desconto_de_10_porcento(self):<br>        \"\"\"Cliente com 10 compras recebe 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de desconto\"\"\"<br>        resultado = self.calc.calcular(valor=100, quantidade_compras=10)<br>        assert resultado == 90</p>\n\n<p>def test_desconto_de_20_porcento(self):<br>        \"\"\"Cliente com 20 compras recebe 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de desconto\"\"\"<br>        resultado = self.calc.calcular(valor=100, quantidade_compras=20)<br>        assert resultado == 80</p>\n\n<p>def test_sem_desconto(self):<br>        \"\"\"Cliente novo (0 compras) não recebe desconto\"\"\"<br>        resultado = self.calc.calcular(valor=100, quantidade_compras=0)<br>        assert resultado == 100</p>\n\n<p>def test_desconto_maximo_de_30_porcento(self):<br>        \"\"\"Cliente VIP (50+ compras) recebe no máximo 30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\"\"<br>        resultado = self.calc.calcular(valor=100, quantidade_compras=100)<br>        assert resultado == 70</p>\n\n<p>def test_valor_negativo_deve_falhar(self):<br>        \"\"\"Valor negativo deve lançar exceção\"\"\"<br>        with pytest.raises(ValueError):<br>            self.calc.calcular(valor=-100, quantidade_compras=10)</p>\n\n<p>@pytest.mark.parametrize(\"valor,compras,esperado\", [<br>        (100, 5, 100),   # Sem desconto<br>        (100, 10, 90),   # 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>        (100, 20, 80),   # 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>        (100, 50, 70),   # 30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>        (200, 10, 180),  # 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em valor maior<br>    ])<br>    def test_parametrizado(self, valor, compras, esperado):<br>        resultado = self.calc.calcular(valor=valor, quantidade_compras=compras)<br>        assert resultado == esperado<br></code></pre></p>\n\n<h4>GREEN - Implementação Mínima</h4>\n\n<pre><code># desconto.py\nclass CalculadoraDesconto:\n    def calcular(self, valor, quantidade_compras):\n        if valor &lt; 0:\n            raise ValueError(&quot;Valor não pode ser negativo&quot;)\n\n<p>if quantidade_compras &gt;= 50:<br>            desconto = 0.30<br>        elif quantidade_compras &gt;= 20:<br>            desconto = 0.20<br>        elif quantidade_compras &gt;= 10:<br>            desconto = 0.10<br>        else:<br>            desconto = 0</p>\n\n<p>return valor * (1 - desconto)<br></code></pre></p>\n\n<h4>REFACTOR - Melhorias</h4>\n\n<pre><code># desconto.py (refatorado)\nfrom dataclasses import dataclass\n\n<p>@dataclass<br>class RegraDesconto:<br>    min_compras: int<br>    max_compras: int | None<br>    percentual: float</p>\n\n<p>REGRAS = [<br>    RegraDesconto(min_compras=50, max_compras=None, percentual=30),<br>    RegraDesconto(min_compras=20, max_compras=49, percentual=20),<br>    RegraDesconto(min_compras=10, max_compras=19, percentual=10),<br>]</p>\n\n<p>class CalculadoraDesconto:<br>    def calcular(self, valor: float, quantidade_compras: int) -&gt; float:<br>        if valor &lt; 0:<br>            raise ValueError(\"Valor não pode ser negativo\")</p>\n\n<p>for regra in REGRAS:<br>            if quantidade_compras &gt;= regra.min_compras:<br>                if regra.max_compras is None or quantidade_compras &lt;= regra.max_compras:<br>                    return valor * (1 - regra.percentual / 100)</p>\n\n<p>return valor<br></code></pre></p>\n\n<h3>JavaScript com Jest</h3>\n\n<pre><code>// 1. RED - Testes\ndescribe(\'CalculadoraFrete\', () =&gt; {\n  const calculadora = new CalculadoraFrete();\n\n<p>test(\'frete para SP capital\', () =&gt; {<br>    expect(calculadora.calcular(\'SP\', \'São Paulo\')).toBe(15.90);<br>  });</p>\n\n<p>test(\'frete para RJ\', () =&gt; {<br>    expect(calculadora.calcular(\'RJ\', \'Rio de Janeiro\')).toBe(20.00);<br>  });</p>\n\n<p>test(\'frete para outros estados\', () =&gt; {<br>    expect(calculadora.calcular(\'MG\', \'Belo Horizonte\')).toBe(30.00);<br>  });</p>\n\n<p>test(\'frete grátis para SP com compra &gt; 200\', () =&gt; {<br>    expect(calculadora.calcular(\'SP\', \'São Paulo\', 250)).toBe(0);<br>  });<br>});</p>\n\n<p>// 2. GREEN - Implementação<br>class CalculadoraFrete {<br>  calcular(estado, cidade, valorCompra = 0) {<br>    if (estado === \'SP\' &amp;&amp; valorCompra &gt; 200) return 0;<br>    if (estado === \'SP\') return 15.90;<br>    if (estado === \'RJ\') return 20.00;<br>    return 30.00;<br>  }<br>}<br></code></pre></p>\n\n<h3>Java com JUnit 5</h3>\n\n<pre><code>// Teste\nclass CarrinhoTest {\n\n<p>@Test<br>    void deveCalcularTotalComDesconto() {<br>        // Given<br>        Carrinho carrinho = new Carrinho();<br>        carrinho.adicionar(new Produto(\"Camiseta\", 50.00, 2));<br>        carrinho.adicionar(new Produto(\"Calça\", 100.00, 1));</p>\n\n<p>// When<br>        double total = carrinho.calcularTotal();</p>\n\n<p>// Then<br>        assertEquals(200.00, total, 0.01);<br>    }</p>\n\n<p>@Test<br>    void deveAplicarCupomDesconto() {<br>        // Given<br>        Carrinho carrinho = new Carrinho();<br>        carrinho.adicionar(new Produto(\"Camiseta\", 100.00, 1));</p>\n\n<p>// When<br>        carrinho.aplicarCupom(new Cupom(\"DESCONTO10\", 10));<br>        double total = carrinho.calcularTotal();</p>\n\n<p>// Then<br>        assertEquals(90.00, total, 0.01);<br>    }</p>\n\n<p>@ParameterizedTest<br>    @CsvSource({<br>        \"100, 10, 90\",<br>        \"200, 10, 180\",<br>        \"100, 20, 80\"<br>    })<br>    void deveCalcularComDescontoParametrizado(<br>        double valor, double desconto, double esperado<br>    ) {<br>        Carrinho carrinho = new Carrinho();<br>        carrinho.adicionar(new Produto(\"Item\", valor, 1));<br>        carrinho.aplicarCupom(new Cupom(\"TESTE\", desconto));</p>\n\n<p>assertEquals(esperado, carrinho.calcularTotal(), 0.01);<br>    }<br>}<br></code></pre></p>\n\n<hr>\n<h2>Baby Steps: Implementação Incremental</h2>\n\n<h3>Exemplo: Fibonacci</h3>\n\n<pre><code># Passo 1: O menor teste possível\ndef test_fibonacci_0():\n    assert fibonacci(0) == 0\n\n<p># Implementação mínima<br>def fibonacci(n):<br>    return 0</p>\n\n<p># Passo 2: Segundo valor<br>def test_fibonacci_1():<br>    assert fibonacci(1) == 1</p>\n\n<p>def fibonacci(n):<br>    if n == 0:<br>        return 0<br>    return 1  # Ainda não está correto!</p>\n\n<p># Passo 3: Terceiro valor<br>def test_fibonacci_2():<br>    assert fibonacci(2) == 1</p>\n\n<p># GREEN: Implementação correta (forma recursiva)<br>def fibonacci(n):<br>    if n &lt;= 0:<br>        return 0<br>    if n == 1:<br>        return 1<br>    return fibonacci(n - 1) + fibonacci(n - 2)</p>\n\n<p># GREEN: Implementação melhor (forma iterativa)<br>def fibonacci(n):<br>    if n &lt;= 0:<br>        return 0<br>    if n == 1:<br>        return 1</p>\n\n<p>a, b = 0, 1<br>    for _ in range(2, n + 1):<br>        a, b = b, a + b<br>    return b<br></code></pre></p>\n\n<hr>\n<h2>Mocks e Stubs</h2>\n\n<h3>Por Que Usar Mocks?</h3>\n\n<p>Mocks são essenciais para:<ol><li>Isolar unidade sob teste</li><br><li>Simular dependências externas</li><br><li>Controlar cenários de teste</li><br><li>Aumentar velocidade dos testes</li></ol></ul></p>\n\n<h3>Exemplo: Service com Dependência</h3>\n\n<pre><code># 1. Teste com mock\nfrom unittest.mock import Mock, patch\n\n<p>def test_pedido_service_cria_pedido_com_sucesso():<br>    # Given<br>    email_service = Mock()<br>    email_service.enviar = Mock(return_value=True)</p>\n\n<p>payment_gateway = Mock()<br>    payment_gateway.cobrar = Mock(return_value={<br>        \"status\": \"approved\",<br>        \"transaction_id\": \"tx_123\"<br>    })</p>\n\n<p>repository = Mock()<br>    repository.salvar = Mock(return_value=1)</p>\n\n<p>service = PedidoService(<br>        email_service=email_service,<br>        payment_gateway=payment_gateway,<br>        repository=repository<br>    )</p>\n\n<p># When<br>    resultado = service.criar_pedido(<br>        cliente_id=1,<br>        itens=[{\"produto_id\": 1, \"quantidade\": 2}],<br>        forma_pagamento=\"credit_card\"<br>    )</p>\n\n<p># Then<br>    assert resultado[\"status\"] == \"confirmed\"<br>    assert resultado[\"pedido_id\"] == 1</p>\n\n<p># Verificar chamadas<br>    payment_gateway.cobrar.assert_called_once()<br>    repository.salvar.assert_called_once()<br>    email_service.enviar.assert_called_once()<br></code></pre></p>\n\n<h3>Spy vs Mock vs Stub</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo</th><th>Comportamento</th><th>Uso</th></tr>\n<tr><td><strong>Stub</strong></td><td>Respostas pré-programadas</td><td>Fornecer dados</td></tr>\n<tr><td><strong>Mock</strong></td><td>Comportamento verificado</td><td>Verificar interações</td></tr>\n<tr><td><strong>Spy</strong></td><td>Wrapper do real + verificação</td><td>Comportamento real + verificação</td></tr>\n</table></figure>\n\n<pre><code># Stub\nrepository = Mock()\nrepository.buscar_por_id = Mock(return_value={\"id\": 1, \"nome\": \"Produto\"})\n\n<p># Spy (usando wraps)<br>with patch(\'app.repository\') as mock_repo:<br>    mock_repo.buscar_por_id.return_value = {\"id\": 1}</p>\n\n<p>service = MyService(mock_repo)<br>    service.algum_metodo()</p>\n\n<p># Verificar que foi chamado<br>    mock_repo.buscar_por_id.assert_called_once_with(1)<br></code></pre></p>\n\n<hr>\n<h2>TDD em Prática: Kata de String Calculator</h2>\n\n<h3>Requisitos</h3>\n<ol><li>Criar calculadora que recebe string vazia retorna 0</li>\n<li>Recebe \"1\" retorna 1</li>\n<li>Recebe \"1,2\" retorna 3</li>\n<li>Recebe \"1n2,3\" retorna 6</li>\n<li>Suporta delimitador customizado \"//;n1;2\" retorna 3</li>\n</ol>\n<h3>Solução TDD</h3>\n\n<pre><code># Step 1: String vazia\ndef test_string_vazia_retorna_zero():\n    assert string_calculator(\"\") == 0\n\n<p>def string_calculator(numbers):<br>    return 0</p>\n\n<p># Step 2: Um número<br>def test_um_numero():<br>    assert string_calculator(\"1\") == 1</p>\n\n<p>def string_calculator(numbers):<br>    if not numbers:<br>        return 0<br>    return int(numbers)</p>\n\n<p># Step 3: Dois números separados por vírgula<br>def test_dois_numeros():<br>    assert string_calculator(\"1,2\") == 3</p>\n\n<p>def string_calculator(numbers):<br>    if not numbers:<br>        return 0<br>    return sum(int(n) for n in numbers.split(\',\'))</p>\n\n<p># Step 4: Múltiplos números<br>def test_multiplos_numeros():<br>    assert string_calculator(\"1,2,3,4,5\") == 15</p>\n\n<p>def string_calculator(numbers):<br>    if not numbers:<br>        return 0<br>    delimiters = [\',\', \'n\']<br>    parts = numbers.replace(\'n\', \',\')<br>    return sum(int(n) for n in parts.split(\',\'))</p>\n\n<p># Step 5: Delimitador customizado<br>def test_delimitador_customizado():<br>    assert string_calculator(\"//;n1;2;3\") == 6</p>\n\n<p>def string_calculator(numbers):<br>    if not numbers:<br>        return 0</p>\n\n<p># Detectar delimitador customizado<br>    if numbers.startswith(\'//\'):<br>        end_header = numbers.index(\'n\')<br>        delimiter = numbers[2:end_header]<br>        numbers = numbers[end_header + 1:]<br>        numbers = numbers.replace(delimiter, \',\')</p>\n\n<p>return sum(int(n) for n in numbers.replace(\'n\', \',\').split(\',\'))<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>TDD é mais que escrever testes primeiro - é uma filosofia de design que resulta em código mais limpo, testável e manutenível. As chaves para dominar TDD são:<br><ol><li><strong>Prática constante</strong> - Katas diárias</li><br><li><strong>Baby steps</strong> - Pequenas iterações</li><br><li><strong>Feedback rápido</strong> - Execução de testes rápida</li><br><li><strong>Disciplina</strong> - Não pule etapas</li><br><li><strong>Paciência</strong> - Curva de aprendizado é íngreme no início</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: TDD funciona para todos os projetos?</strong>  <br>R: Não. É excelente para lógica de negócio, APIs. Menos para UI exploratória ou protótipos.</p>\n\n<p><strong>P: Como começar com TDD?</strong>  <br>R: Pratique com katas (String Calculator, Bowling Game, Tennis Refactoring) diariamente.</p>\n\n<p><strong>P: TDD não ralent development?</strong>  <br>R: No curto prazo parece mais lento, mas reduz significativamente bugs e tempo de debugging.</p>\n\n<p><strong>P: Posso usar TDD com legacy code?</strong>  <br>R: Sim! Comece com characterization tests, depois refatore一点点 com testes.</p>', 'Test-Driven Development (TDD): Guia Prático para Implementação', '', 'publish', 'closed', 'open', '', '13tdd', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/13tdd/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('190', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda BDD: Gherkin, Cucumber, Behave, e como implementar desenvolvimento guiado por comportamento para equipes ágeis.</p>\n\n<hr>\n<h2>O Que é BDD?</h2>\n\n<p>Behavior-Driven Development (BDD) é uma evolução do TDD que foca na colaboração entre desenvolvedores, QA e negócios. BDD usa linguagem natural (Gherkin) para descrever comportamentos de software, tornando requisitos mais acessíveis a todos.</p>\n\n<h3>A História do BDD</h3>\n\n<pre><code>2003: Dan North cria \"JBehave\" (Java)\n2006: Ruby implementation \"Cucumber\" (Aslak Hellesøy)\n2008: GoBehave para Python\n2012: Cucumber-JVM\nHoje: Gherkin é padrão indústria\n</code></pre>\n\n<hr>\n<h2>Gherkin: A Linguagem de BDD</h2>\n\n<h3>Estrutura Básica</h3>\n\n<pre><code># language: pt\nFuncionalidade: Título da funcionalidade\n  Como um [ator]\n  Quero [ação]\n  Para [benefício]\n\n<p>Contexto: [precondições]<br>    Dado [estado inicial]<br>    E [mais estados]</p>\n\n<p>Cenário: [nome do cenário]<br>    Quando [ação]<br>    E [mais ações]<br>    Então [resultado esperado]<br>    E [mais resultados]</p>\n\n<p>Cenário: [outro cenário]<br>    ...<br></code></pre></p>\n\n<h3>Palavras-Chave Gherkin</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Keyword</th><th>Uso</th></tr>\n<tr><td><code>Funcionalidade</code> (Feature)</td><td>Agrupa cenários relacionados</td></tr>\n<tr><td><code>Contexto</code> (Background)</td><td>Precondições comuns</td></tr>\n<tr><td><code>Cenário</code> (Scenario)</td><td>Caso de uso específico</td></tr>\n<tr><td><code>Dado</code> (Given)</td><td>Pré-condições</td></tr>\n<tr><td><code>Quando</code> (When)</td><td>Ação/evento</td></tr>\n<tr><td><code>Então</code> (Then)</td><td>Resultado esperado</td></tr>\n<tr><td><code>E</code> (And)</td><td>Conjunção</td></tr>\n<tr><td><code>Mas</code> (But)</td><td>Conjunção negativa</td></tr>\n<tr><td><code>Esquema do Cenário</code></td><td>Cenário parametrizado</td></tr>\n<tr><td><code> Exemplos</code> (Examples)</td><td>Dados de teste</td></tr>\n</table></figure>\n\n<h3>Exemplo Completo</h3>\n\n<pre><code># language: pt\nFuncionalidade: Login de Usuário\n  Como um usuário registrado no sistema\n  Quero fazer login com minhas credenciais\n  Para acessar minha conta e visualizar meus dados\n\n<p>Contexto:<br>    Dado que o sistema está operacional<br>    E o usuário \"joao@exemplo.com\" está cadastrado com senha \"Senha@123\"</p>\n\n<p>Cenário: Login com credenciais válidas<br>    Quando eu acesso a página de login<br>    E preencho o campo email com \"joao@exemplo.com\"<br>    E preencho o campo senha com \"Senha@123\"<br>    E clico no botão \"Entrar\"<br>    Então sou redirecionado para o dashboard<br>    E uma mensagem de boas-vindas é exibida<br>    E meu nome \"João Silva\" aparece no cabeçalho</p>\n\n<p>Cenário: Login com senha incorreta<br>    Quando eu acesso a página de login<br>    E preencho o campo email com \"joao@exemplo.com\"<br>    E preencho o campo senha com \"senhaerrada\"<br>    E clico no botão \"Entrar\"<br>    Então permaneço na página de login<br>    E uma mensagem de erro \"Credenciais inválidas\" é exibida<br>    E o campo senha está vazio para nova tentativa</p>\n\n<p>Cenário: Login com email não cadastrado<br>    Quando eu acesso a página de login<br>    E preencho o campo email com \"naoexiste@exemplo.com\"<br>    E preencho o campo senha com \"senha123\"<br>    E clico no botão \"Entrar\"<br>    Então uma mensagem de erro \"Usuário não encontrado\" é exibida</p>\n\n<p>Esquema do Cenário: Bloqueio após múltiplas tentativas<br>    Quando tento fazer login com email \"\" e senha \"\"<br>    E repito este login falho por  vezes<br>    Então minha conta fica bloqueada por  minutos<br>    E uma mensagem \"Conta temporariamente bloqueada\" é exibida</p>\n\n<p>Exemplos:<br>      | email             | senha      | tentativas | minutos |<br>      | joao@exemplo.com  | errada1    | 3          | 30      |<br>      | maria@exemplo.com  | errada2    | 5          | 60      |<br></code></pre></p>\n\n<hr>\n<h2>Cucumber: Implementando BDD</h2>\n\n<h3>Cucumber Architecture</h3>\n\n<pre><code>.feature files (Gherkin)\n        ↓\n   Cucumber Parser\n        ↓\n   Step Definitions (Glue Code)\n        ↓\n   Step Definitions (Java/JS/Python/Ruby)\n        ↓\n   Application Under Test\n</code></pre>\n\n<h3>Cucumber com Java (Spring Boot)</h3>\n\n<h4>Dependências</h4>\n\n<pre><code>\n    io.cucumber\n    cucumber-java\n    7.14.0\n    test\n\n\n    io.cucumber\n    cucumber-spring\n    7.14.0\n    test\n\n\n    io.cucumber\n    cucumber-junit-platform-engine\n    7.14.0\n    test\n\n</code></pre>\n\n<h4>Feature File</h4>\n\n<pre><code># src/test/resources/features/carrinho.feature\nFuncionalidade: Carrinho de Compras\n  Como um cliente do e-commerce\n  Quero adicionar e remover produtos do carrinho\n  Para finalizar minha compra\n\n<p>Contexto:<br>    Dado que estou logado como \"cliente@teste.com\"<br>    E o produto \"Camiseta Azul\" custa R$ 49,90<br>    E o produto \"Calça Jeans\" custa R$ 129,90<br>    E o produto \"Tênis\" custa R$ 199,90</p>\n\n<p>Cenário: Adicionar produto ao carrinho<br>    Quando adiciono \"Camiseta Azul\" ao carrinho<br>    Então o carrinho deve conter 1 item<br>    E o total deve ser R$ 49,90</p>\n\n<p>Cenário: Adicionar múltiplos produtos<br>    Quando adiciono \"Camiseta Azul\" ao carrinho<br>    E adiciono \"Calça Jeans\" ao carrinho<br>    E adiciono \"Tênis\" ao carrinho<br>    Então o carrinho deve conter 3 itens<br>    E o total deve ser R$ 379,70</p>\n\n<p>Cenário: Remover produto do carrinho<br>    Dado que tenho \"Camiseta Azul\" e \"Calça Jeans\" no carrinho<br>    Quando removo \"Camiseta Azul\" do carrinho<br>    Então o carrinho deve conter 1 item<br>    E o total deve ser R$ 129,90<br></code></pre></p>\n\n<h4>Step Definitions</h4>\n\n<pre><code>package steps;\n\n<p>import io.cucumber.java.pt.*;<br>import org.springframework.beans.factory.annotation.Autowired;<br>import static org.junit.jupiter.api.Assertions.*;</p>\n\n<p>class CarrinhoSteps {</p>\n\n<p>@Autowired<br>    private CarrinhoService carrinhoService;</p>\n\n<p>@Autowired<br>    private TestContext testContext;</p>\n\n<p>private Carrinho carrinho;</p>\n\n<p>@Dado(\"que estou logado como {string}\")<br>    public void que_estou_logado_como(String email) {<br>        testContext.setUsuario(email);<br>        carrinho = new Carrinho();<br>    }</p>\n\n<p>@Dado(\"o produto {string} custa R$ {double}\")<br>    public void produto_custa(String nome, double preco) {<br>        // Setup de produto no banco de dados de teste<br>    }</p>\n\n<p>@Quando(\"adiciono {string} ao carrinho\")<br>    public void adiciono_produto_ao_carrinho(String produto) {<br>        carrinho.adicionar(new Item(produto, obterPreco(produto)));<br>    }</p>\n\n<p>@Então(\"o carrinho deve conter {int} item\")<br>    public void carrinho_deve_conter_itens(int quantidade) {<br>        assertEquals(quantidade, carrinho.getItens().size());<br>    }</p>\n\n<p>@Então(\"o total deve ser R$ {double}\")<br>    public void total_deve_ser(double total) {<br>        assertEquals(total, carrinho.getTotal(), 0.01);<br>    }<br>}<br></code></pre></p>\n\n<h3>Cucumber com Python (Behave)</h3>\n\n<h4>Instalação</h4>\n\n<pre><code>pip install behave\n</code></pre>\n\n<h4>Feature File</h4>\n\n<pre><code># features/carrinho.feature\nFuncionalidade: Carrinho de Compras\n  Como um cliente do e-commerce\n  Quero adicionar produtos ao carrinho\n  Para visualizar o total da compra\n\n<p>Cenário: Adicionar produto ao carrinho<br>    Dado que o produto \"Camiseta\" custa 50.00<br>    Quando adiciono o produto ao carrinho<br>    Então o total deve ser 50.00<br></code></pre></p>\n\n<h4>Step Definitions</h4>\n\n<pre><code># features/steps/carrinho_steps.py\nfrom behave import given, when, then\nfrom carrinho import Carrinho\n\n<p>@given(\'o produto \"{nome}\" custa {preco}\')<br>def step_impl(context, nome, preco):<br>    if not hasattr(context, \'produtos\'):<br>        context.produtos = {}<br>    context.produtos[nome] = float(preco.replace(\'.\', \'\').replace(\',\', \'.\'))</p>\n\n<p>@when(\'adiciono o produto ao carrinho\')<br>def step_impl(context):<br>    if not hasattr(context, \'carrinho\'):<br>        context.carrinho = Carrinho()</p>\n\n<p>for nome, preco in context.produtos.items():<br>        context.carrinho.adicionar(nome, preco)</p>\n\n<p>@then(\'o total deve ser {total}\')<br>def step_impl(context, total):<br>    esperado = float(total.replace(\'.\', \'\').replace(\',\', \'.\'))<br>    assert context.carrinho.total == esperado, <br>        f\"Esperado {esperado}, got {context.carrinho.total}\"<br></code></pre></p>\n\n<h4>Runner</h4>\n\n<pre><code># features/environment.py\ndef before_all(context):\n    context.produtos = {}\n    context.carrinho = None\n\n<p>def after_scenario(context, scenario):<br>    # Cleanup<br>    context.produtos = {}<br>    context.carrinho = None<br></code></pre></p>\n\n<hr>\n<h2>BDD em Equipes Ágeis</h2>\n\n<h3>O Ciclo BDD Completo</h3>\n\n<pre><code>   ┌──────────────────────────────────────────────┐\n   │                                              │\n   ▼                                              │\n┌───────┐    ┌─────────┐    ┌──────────┐    ┌─────┴───┐\n│DISCUSS│───▶│EXAMPLES │───▶│AUTOMATE │───▶│IMPLEMENT│\n│   ()  │    │   (O)   │    │   (o)   │    │   (.)   │\n└───────┘    └─────────┘    └──────────┘    └─────────┘\n    ▲                                              │\n    │                                              │\n    └──────────────────────────────────────────────┘\n                    (Feedback)\n</code></pre>\n\n<h3>Reunião de Three Amigos</h3>\n\n<p>A reunião de Three Amigos junta desenvolvedores, QA e product owner para discutir requisitos.</p>\n\n<pre><code># Agenda da Reunião Three Amigos\n\n<h2>Preparação (1 dia antes)</h2>\n<ul><li>PO compartilha user stories</li><ol><li>QA prepara perguntas</li>\n<li>Devs revisam história</li>\n</ol>\n<h2>Reunião (60 minutos)</h2><ol><li>PO apresenta user story (10 min)</li>\n<li>Discussão de requisitos (20 min)</li>\n<li>QA identifica cenários de teste (15 min)</li>\n<li>Devs identificam complexidades (10 min)</li>\n<li>Acordo sobre exemplos concretos (5 min)</li>\n</ol>\n<h2>Output</h2><ol><li>User story com critérios de aceitação claros</li>\n<li>Cenários BDD definidos</li>\n<li>Incertezas documentadas</li>\n</ol></code></pre>\n\n<h3>Exemplo: User Story com BDD</h3>\n\n<pre><code><h2>User Story: RS-123 - Carrinho Abandonado</h2>\n\n<h3>Como</h3>\n  Vendedor do e-commerce\n\n<h3>Eu quero</h3>\n  Receber notificação quando cliente abandonar carrinho\n\n<h3>Para que</h3>\n  Possa entrar em contato e recuperar a venda\n\n<h3>Critérios de Aceitação:</h3><ol><li>[ ] Notificação enviada 30 min após abandono</li>\n<li>[ ] Email inclui produtos abandonados</li>\n<li>[ ] Email inclui link para recuperação</li>\n<li>[ ] Não enviar se cliente já Comprou</li>\n<li>[ ] Rate limit de 1 email por cliente por dia</li></ol></ul>\n\n<h3>Cenários BDD:</h3>\n</code></pre>\n\n<pre><code>Funcionalidade: Carrinho Abandonado\n\n<p>Cenário: Notificação enviada após 30 minutos<br>    Dado que o cliente adicionou produtos ao carrinho<br>    E saiu do site sem Comprar<br>    Quando passam 30 minutos<br>    Então um email de recuperação é enviado</p>\n\n<p>Cenário: Email inclui produtos abandonados<br>    Dado que o cliente abandonou o carrinho com:<br>      | Produto       | Quantidade |<br>      | Camiseta     | 2         |<br>      | Calça Jeans  | 1         |<br>    Quando o email de recuperação é enviado<br>    Então o email lista todos os produtos abandonados</p>\n\n<p>Cenário: Não enviar se cliente Comprou<br>    Dado que o cliente abandonou o carrinho<br>    Mas depois finalizou a compra<br>    Quando passam 30 minutos<br>    Então nenhum email é enviado<br></code></pre></p>\n\n<hr>\n<h2>Boas Práticas em BDD</h2>\n\n<h3>1. Feature Files Bem Estruturados</h3>\n\n<pre><code># BOM: Cenários focados e descritivos\nFuncionalidade: Cálculo de Frete\n  Cenário: Frete para SP capital\n    Dado que o produto custa R$ 100\n    Quando o cliente é de \"SP\" e \"São Paulo\"\n    Então o frete é R$ 15,90\n\n<p># RUIM: Cenário muito genérico<br>Funcionalidade: Frete<br>  Cenário: Teste de frete<br>    Dado que tenho um produto<br>    Quando calculo o frete<br>    Então deve funcionar<br></code></pre></p>\n\n<h3>2. Step Definitions Reutilizáveis</h3>\n\n<pre><code># Defina steps genéricos\n@given(\'que o produto \"{nome}\" custa R$ {preco}\')\ndef step_produto(context, nome, preco):\n    context.produtos[nome] = float(preco)\n\n<p>@when(\'eu adiciono \"{nome}\" ao carrinho\')<br>def step_adicionar(context, nome):<br>    context.carrinho.adicionar(nome, context.produtos[nome])<br></code></pre></p>\n\n<h3>3. Page Objects para Web</h3>\n\n<pre><code># pages/login_page.py\nclass LoginPage:\n    def __init__(self, driver):\n        self.driver = driver\n\n<p>@property<br>    def email_field(self):<br>        return self.driver.find_element(By.ID, \'email\')</p>\n\n<p>@property<br>    def password_field(self):<br>        return self.driver.find_element(By.ID, \'password\')</p>\n\n<p>@property<br>    def login_button(self):<br>        return self.driver.find_element(By.ID, \'login-button\')</p>\n\n<p>def login(self, email, password):<br>        self.email_field.send_keys(email)<br>        self.password_field.send_keys(password)<br>        self.login_button.click()<br></code></pre></p>\n\n<hr>\n<h2>Integração com CI/CD</h2>\n\n<pre><code># GitHub Actions - BDD Tests\nname: BDD Tests\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  bdd-tests:<br>    runs-on: ubuntu-latest</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Python<br>        uses: actions/setup-python@v5<br>        with:<br>          python-version: \'3.11\'</p>\n\n<p>- name: Install dependencies<br>        run: |<br>          pip install behave selenium webdriver-manager</p>\n\n<p>- name: Run BDD tests<br>        run: behave --format=json --outfile=reports/behave.json</p>\n\n<p>- name: Upload reports<br>        uses: actions/upload-artifact@v4<br>        with:<br>          name: cucumber-reports<br>          path: reports/<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>BDD é uma metodologia poderosa que une equipes através de linguagem comum. As chaves para sucesso são:<br><ol><li><strong>Colaboração</strong> - Three Amigos regularmente</li><br><li><strong>Exemplos concretos</strong> - Ao invés de requisitos vagos</li><br><li><strong>Automação</strong> - Transforma cenários em testes executáveis</li><br><li><strong>Documentação viva</strong> - Features são especificação + teste</li><br><li><strong>Feedback rápido</strong> - Ciclos curtos de desenvolvimento</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: BDD substitui TDD?</strong>  <br>R: Não. BDD usa TDD internamente. BDD foca em colaboração, TDD em técnica.</p>\n\n<p><strong>P: Como começar com BDD?</strong>  <br>R: Comece com Three Amigos para definir cenários, depois implemente com Cucumber/Behave.</p>\n\n<p><strong>P: Quantos cenários por feature?</strong>  <br>R: O suficiente para cobrir comportamento. Evite redundância, use Examples para variações.</p>\n\n<p><strong>P: BDD funciona para qualquer projeto?</strong>  <br>R: Melhor para projetos com requisitos claros e colaboração entre negocio e TI.</p>', 'BDD (Behavior-Driven Development): Guia Completo para Equipes Ágeis', '', 'publish', 'closed', 'open', '', '14bdd', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/14bdd/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('191', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Domine testes de API: REST, GraphQL, microservices. Aprenda a usar Postman, RestAssured, pytest e automação de testes de API para garantir qualidade de integrações.</p>\n\n<hr>\n<h2>Introdução aos Testes de API</h2>\n\n<p>APIs (Application Programming Interfaces) são a espinha dorsal da arquitetura moderna de software. Testar APIs de forma eficaz garante que os serviços se comuniquem corretamente, retornem dados esperados e tratem erros apropriadamente.</p>\n\n<h3>Por Que Testar APIs?</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Benefício</th><th>Impacto</th></tr>\n<tr><td><strong>Detecção precoce de bugs</strong></td><td>APIs são gateway para frontend</td></tr>\n<tr><td><strong>Integração confiável</strong></td><td>Microserviços se comunicam via API</td></tr>\n<tr><td><strong>Performance</strong></td><td>API performance afeta toda a aplicação</td></tr>\n<tr><td><strong>Documentação viva</strong></td><td>Contratos de API testados</td></tr>\n<tr><td><strong>Regression testing</strong></td><td>Mudanças não quebram integrações</td></tr>\n</table></figure>\n\n<hr>\n<h2>Tipos de Testes de API</h2>\n\n<h3>1. Testes de Funcionalidade</h3>\n\n<p>Verificam se a API funciona conforme especificado.</p>\n\n<pre><code>import requests\nimport pytest\n\n<p>BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>class TestUsuarioAPI:</p>\n\n<p>def test_criar_usuario(self):<br>        \"\"\"Deve criar usuário com sucesso\"\"\"<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"Senha@123\"<br>        }</p>\n\n<p>response = requests.post(<br>            f\"{BASE_URL}/usuarios\",<br>            json=payload,<br>            headers={\"Content-Type\": \"application/json\"}<br>        )</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data<br>        assert \"senha\" not in data  # Não retorna senha!</p>\n\n<p>def test_criar_usuario_email_duplicado(self):<br>        \"\"\"Deve falhar quando email já existe\"\"\"<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",  # Já existe<br>            \"senha\": \"Senha@123\"<br>        }</p>\n\n<p>response = requests.post(<br>            f\"{BASE_URL}/usuarios\",<br>            json=payload<br>        )</p>\n\n<p>assert response.status_code == 409  # Conflict<br>        assert \"email\" in response.json()[\"erro\"].lower()</p>\n\n<p>def test_buscar_usuario_por_id(self):<br>        \"\"\"Deve retornar usuário existente\"\"\"<br>        response = requests.get(f\"{BASE_URL}/usuarios/1\")</p>\n\n<p>assert response.status_code == 200<br>        data = response.json()<br>        assert data[\"id\"] == 1<br>        assert \"email\" in data</p>\n\n<p>def test_buscar_usuario_inexistente(self):<br>        \"\"\"Deve retornar 404 para usuário inexistente\"\"\"<br>        response = requests.get(f\"{BASE_URL}/usuarios/99999\")</p>\n\n<p>assert response.status_code == 404<br></code></pre></p>\n\n<h3>2. Testes de Contrato</h3>\n\n<p>Verificam se a API está em conformidade com seu contrato (OpenAPI/Swagger).</p>\n\n<pre><code>import pytest\nfrom jsonschema import validate\n\n<p>schema = {<br>    \"type\": \"object\",<br>    \"required\": [\"id\", \"nome\", \"email\"],<br>    \"properties\": {<br>        \"id\": {\"type\": \"integer\"},<br>        \"nome\": {\"type\": \"string\", \"minLength\": 1},<br>        \"email\": {\"type\": \"string\", \"format\": \"email\"}<br>    }<br>}</p>\n\n<p>def test_usuario_response_match_schema():<br>    response = requests.get(f\"{BASE_URL}/usuarios/1\")<br>    data = response.json()</p>\n\n<p>validate(instance=data, schema=schema)<br></code></pre></p>\n\n<h3>3. Testes de Performance</h3>\n\n<pre><code>import time\nimport concurrent.futures\n\n<p>def test_api_response_time():<br>    \"\"\"Tempo de resposta deve ser &lt; 500ms&quot;&quot;&quot;<br>    start = time.time()<br>    response = requests.get(f\"{BASE_URL}/usuarios/1\")<br>    elapsed = (time.time() - start) * 1000</p>\n\n<p>assert response.status_code == 200<br>    assert elapsed &lt; 500, f&quot;Response took {elapsed}ms&quot;</p>\n\n<p>def test_concurrent_requests():<br>    \"\"\"API deve suportar 100 requisições simultâneas\"\"\"<br>    def make_request():<br>        response = requests.get(f\"{BASE_URL}/health\")<br>        return response.status_code == 200</p>\n\n<p>with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:<br>        futures = [executor.submit(make_request) for _ in range(100)]<br>        results = [f.result() for f in concurrent.futures.as_completed(futures)]</p>\n\n<p>success_rate = sum(results) / len(results)<br>    assert success_rate &gt; 0.95, f\"Only {success_rate*100}{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} succeeded\"<br></code></pre></p>\n\n<h3>4. Testes de Segurança</h3>\n\n<pre><code>def test_sql_injection_prevention():\n    \"\"\"API deve prevenir SQL injection\"\"\"\n    payload = {\"email\": \"admin\' OR \'1\'=\'1\"}\n    response = requests.post(f\"{BASE_URL}/usuarios\", json=payload)\n\n<p># Não deve retornar dados sensíveis<br>    assert response.status_code in [400, 422]</p>\n\n<p>def test_xss_in_input(self):<br>    \"\"\"API deve sanitizar inputs\"\"\"<br>    payload = {\"nome\": \"alert(\'xss\')\"}<br>    response = requests.post(f\"{BASE_URL}/usuarios\", json=payload)</p>\n\n<p>if response.status_code == 201:<br>        data = response.json()<br>        assert \"\" not in data[\"nome\"]</p>\n\n<p>def test_rate_limiting(self):<br>    \"\"\"API deve limitar requisições excessivas\"\"\"<br>    responses = []<br>    for _ in range(105):  # Limite é 100<br>        response = requests.get(f\"{BASE_URL}/usuarios/1\")<br>        responses.append(response.status_code)</p>\n\n<p># Últimas 5 devem retornar 429 (Too Many Requests)<br>    assert 429 in responses[-5:]<br></code></pre></p>\n\n<hr>\n<h2>GraphQL: Testando APIs Modernas</h2>\n\n<h3>Queries</h3>\n\n<pre><code>import requests\n\n<p>GRAPHQL_URL = \"https://api.exemplo.com/graphql\"</p>\n\n<p>class TestGraphQL:</p>\n\n<p>def test_query_basica(self):<br>        \"\"\"Deve buscar dados com query GraphQL\"\"\"<br>        query = \"\"\"<br>        query {<br>            usuario(id: 1) {<br>                id<br>                nome<br>                email<br>            }<br>        }<br>        \"\"\"</p>\n\n<p>response = requests.post(<br>            GRAPHQL_URL,<br>            json={\"query\": query}<br>        )</p>\n\n<p>assert response.status_code == 200<br>        data = response.json()<br>        assert \"data\" in data<br>        assert \"usuario\" in data[\"data\"]<br>        assert data[\"data\"][\"usuario\"][\"nome\"]</p>\n\n<p>def test_query_com_parametros(self):<br>        \"\"\"Deve filtrar com argumentos\"\"\"<br>        query = \"\"\"<br>        query($limite: Int) {<br>            produtos(limit: $limite) {<br>                id<br>                nome<br>                preco<br>            }<br>        }<br>        \"\"\"</p>\n\n<p>response = requests.post(<br>            GRAPHQL_URL,<br>            json={<br>                \"query\": query,<br>                \"variables\": {\"limite\": 5}<br>            }<br>        )</p>\n\n<p>data = response.json()<br>        assert len(data[\"data\"][\"produtos\"]) &lt;= 5</p>\n\n<p>def test_mutation_inserir(self):<br>        \"\"\"Deve criar dado com mutation\"\"\"<br>        mutation = \"\"\"<br>        mutation {<br>            criarUsuario(input: {<br>                nome: \"Maria Silva\"<br>                email: \"maria@exemplo.com\"<br>                senha: \"Senha@123\"<br>            }) {<br>                id<br>                nome<br>                email<br>            }<br>        }<br>        \"\"\"</p>\n\n<p>response = requests.post(GRAPHQL_URL, json={\"query\": mutation})</p>\n\n<p>assert response.status_code == 200<br>        data = response.json()<br>        assert \"errors\" not in data<br>        assert data[\"data\"][\"criarUsuario\"][\"nome\"] == \"Maria Silva\"<br></code></pre></p>\n\n<h3>Introspection para Validação</h3>\n\n<pre><code>def test_graphql_introspection():\n    \"\"\"Deve permitir introspection do schema\"\"\"\n    query = \"\"\"\n    {\n        __schema {\n            types {\n                name\n                kind\n            }\n        }\n    }\n    \"\"\"\n\n<p>response = requests.post(GRAPHQL_URL, json={\"query\": query})<br>    data = response.json()</p>\n\n<p>assert \"data\" in data<br>    type_names = [t[\"name\"] for t in data[\"data\"][\"__schema\"][\"types\"]]<br>    assert \"Query\" in type_names<br></code></pre></p>\n\n<hr>\n<h2>Microserviços: Testando em Ambientes Distribuídos</h2>\n\n<h3>Service Mesh Testing</h3>\n\n<pre><code>┌─────────────┐     ┌─────────────┐     ┌─────────────┐\n│   API GW    │────▶│   Auth Svc  │────▶│  User Svc   │\n│   :8080     │     │   :8081     │     │   :8082     │\n└─────────────┘     └─────────────┘     └─────────────┘\n       │                                      │\n       │                                      │\n       ▼                                      ▼\n┌─────────────┐                        ┌─────────────┐\n│   Product   │                        │  Database   │\n│   Svc :8083 │                        │   :5432     │\n└─────────────┘                        └─────────────┘\n</code></pre>\n\n<h3>Testes de Contrato com Pact</h3>\n\n<pre><code># Provider (microserviço de usuários)\nfrom pact import Consumer, Provider\n\n<p>pact = Consumer(\'API-Gateway\').has_pact_with(Provider(\'User-Service\'))<br>pact.start_service()</p>\n\n<p>try:<br>    # Definir expectativas<br>    (pact<br>     .given(\'user with id 1 exists\')<br>     .upon_receiving(\'a request for user 1\')<br>     .with_request(\'GET\', \'/users/1\')<br>     .will_respond_with(200, body={<br>         \'id\': 1,<br>         \'name\': \'Test User\',<br>         \'email\': \'test@example.com\'<br>     })<br>     .verify())</p>\n\n<p># Verificar provider<br>    from pact.matchers import like, Term</p>\n\n<p>(pact<br>     .given(\'user exists\')<br>     .upon_receiving(\'a request for users\')<br>     .with_request(\'GET\', \'/users\')<br>     .will_respond_with(200, body=[<br>         like({<br>             \'id\': 1,<br>             \'name\': Term(\'w+\', \'Test User\'),<br>             \'email\': Term(r\'[w.]+@[w.]+\', \'test@example.com\')<br>         })<br>     ])<br>     .verify())<br>finally:<br>    pact.stop_service()<br></code></pre></p>\n\n<h3>Contrato Consumer-Driven</h3>\n\n<pre><code>// contract.json (gerado pelo consumer)\n{\n  \"consumer\": {\n    \"name\": \"Order-Service\"\n  },\n  \"provider\": {\n    \"name\": \"User-Service\"\n  },\n  \"interactions\": [\n    {\n      \"description\": \"Get user details\",\n      \"request\": {\n        \"method\": \"GET\",\n        \"path\": \"/users/1\"\n      },\n      \"response\": {\n        \"status\": 200,\n        \"body\": {\n          \"id\": 1,\n          \"name\": \"John\",\n          \"email\": \"john@example.com\"\n        }\n      }\n    }\n  ]\n}\n</code></pre>\n\n<h3>TestContainers para Microserviços</h3>\n\n<pre><code>import pytest\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\n\n<p>@pytest.fixture(scope=\"module\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as pg:<br>        yield pg</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def redis():<br>    with RedisContainer(\"redis:7\") as rd:<br>        yield rd</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def user_service(postgres, redis):<br>    with DockerCompose(\".\") as compose:<br>        # Start user-service<br>        compose.exec(\"user-service\", \"python\", \"manage.py\", \"migrate\")<br>        port = compose.expose(\"user-service\", 8080)<br>        yield f\"http://localhost:{port}\"<br></code></pre></p>\n\n<hr>\n<h2>Postman: Collection Runner</h2>\n\n<h3>Collection Structure</h3>\n\n<pre><code>{\n  \"info\": {\n    \"name\": \"E-commerce API\",\n    \"schema\": \"https://schema.getpostman.com/json/collection/v2.1.0/collection.json\"\n  },\n  \"item\": [\n    {\n      \"name\": \"Auth\",\n      \"item\": [\n        {\n          \"name\": \"Login\",\n          \"event\": [\n            {\n              \"listen\": \"test\",\n              \"script\": {\n                \"exec\": [\n                  \"pm.test(\'Status 200\', () =&gt; {\",\n                  \"  pm.response.to.have.status(200);\",\n                  \"});\",\n                  \"pm.test(\'Token received\', () =&gt; {\",\n                  \"  const jsonData = pm.response.json();\",\n                  \"  pm.collectionVariables.set(\'token\', jsonData.token);\",\n                  \"});\"\n                ]\n              }\n            }\n          ],\n          \"request\": {\n            \"method\": \"POST\",\n            \"url\": \"{{baseUrl}}/auth/login\",\n            \"body\": {\n              \"mode\": \"raw\",\n              \"raw\": \"{\"email\":\"test@test.com\",\"password\":\"test123\"}\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"Users\",\n      \"item\": [\n        {\n          \"name\": \"Get All Users\",\n          \"request\": {\n            \"auth\": {\n              \"type\": \"bearer\",\n              \"bearer\": [{\"key\": \"token\", \"value\": \"{{token}}\"}]\n            },\n            \"method\": \"GET\",\n            \"url\": \"{{baseUrl}}/users\"\n          }\n        }\n      ]\n    }\n  ]\n}\n</code></pre>\n\n<h3>Newman CLI</h3>\n\n<pre><code># Executar collection\nnewman run ecommerce-api.postman_collection.json \n  --environment dev.postman_environment.json \n  --reporters html,json \n  --reporter-json-export results.json \n  --reporter-html-export report.html\n\n<p># Com CI/CD<br>newman run collection.json <br>  --environment ${{ secrets.POSTMAN_ENV }} <br>  --iteration-count 1 <br>  --bail<br></code></pre></p>\n\n<hr>\n<h2>Frameworks de Teste de API</h2>\n\n<h3>RestAssured (Java)</h3>\n\n<pre><code>import static io.restassured.RestAssured.*;\nimport static io.restassured.matcher.RestAssuredMatchers.*;\nimport static org.hamcrest.Matchers.*;\n\n<p>class UserApiTest {</p>\n\n<p>@BeforeAll<br>    static void setup() {<br>        RestAssured.baseURI = \"https://api.exemplo.com/v1\";<br>    }</p>\n\n<p>@Test<br>    void criarUsuario() {<br>        given()<br>            .contentType(\"application/json\")<br>            .body(\"\"\"<br>                {<br>                    \"nome\": \"João Silva\",<br>                    \"email\": \"joao@exemplo.com\",<br>                    \"senha\": \"Senha@123\"<br>                }<br>                \"\"\")<br>        .when()<br>            .post(\"/usuarios\")<br>        .then()<br>            .statusCode(201)<br>            .body(\"nome\", equalTo(\"João Silva\"))<br>            .body(\"email\", equalTo(\"joao@exemplo.com\"))<br>            .body(\"id\", notNullValue())<br>            .body(\"senha\", nullValue());<br>    }</p>\n\n<p>@Test<br>    void validarSchema() {<br>        given()<br>            .get(\"/usuarios/1\")<br>        .then()<br>            .statusCode(200)<br>            .body(matchesJsonSchemaInClasspath(\"schemas/usuario.json\"));<br>    }<br>}<br></code></pre></p>\n\n<h3>Pytest + requests</h3>\n\n<pre><code># pytest.ini\n[pytest]\naddopts = -v --tb=short --strict-markers\nmarkers =\n    smoke: Smoke tests\n    integration: Integration tests\n    slow: Slow running tests\n\n<p># conftest.py<br>import pytest<br>import requests</p>\n\n<p>@pytest.fixture<br>def api_client():<br>    class APIClient:<br>        base_url = \"https://api.exemplo.com/v1\"</p>\n\n<p>def __init__(self):<br>            self.session = requests.Session()</p>\n\n<p>def create_user(self, data):<br>            return self.session.post(f\"{self.base_url}/usuarios\", json=data)</p>\n\n<p>def get_user(self, user_id):<br>            return self.session.get(f\"{self.base_url}/usuarios/{user_id}\")</p>\n\n<p>def delete_user(self, user_id):<br>            return self.session.delete(f\"{self.base_url}/usuarios/{user_id}\")</p>\n\n<p>return APIClient()</p>\n\n<p>@pytest.fixture<br>def clean_user(api_client):<br>    \"\"\"Cria usuário para teste e limpa depois\"\"\"<br>    user_data = {<br>        \"nome\": \"Test User\",<br>        \"email\": f\"test_{uuid4()}@exemplo.com\",<br>        \"senha\": \"Senha@123\"<br>    }<br>    response = api_client.create_user(user_data)<br>    user_id = response.json()[\"id\"]</p>\n\n<p>yield user_id</p>\n\n<p># Cleanup<br>    api_client.delete_user(user_id)</p>\n\n<p># test_api.py<br>@pytest.mark.integration<br>def test_criar_e_buscar_usuario(api_client):<br>    # Create<br>    user_data = {\"nome\": \"Test\", \"email\": \"test@ex.com\", \"senha\": \"123\"}<br>    response = api_client.create_user(user_data)<br>    assert response.status_code == 201<br>    user_id = response.json()[\"id\"]</p>\n\n<p># Read<br>    response = api_client.get_user(user_id)<br>    assert response.status_code == 200<br>    assert response.json()[\"nome\"] == \"Test\"<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testar APIs é fundamental para garantir qualidade em arquiteturas modernas. As chaves são:<br><ol><li><strong>Cobertura completa</strong> - Funcional, contrato, performance, segurança</li><br><li><strong>Automação</strong> - CI/CD com collections automatizadas</li><br><li><strong>Contratos</strong> - Consumer-driven contracts para microservices</li><br><li><strong>Isolamento</strong> - TestContainers para dependências</li><br><li><strong>Monitoramento</strong> - API health checks em produção</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Postman substitui testes de código?</strong>  <br>R: Não. Postman é excelente para exploratory e collections, mas testes em código são mais versionáveis e reutilizáveis.</p>\n\n<p><strong>P: Como testar APIs GraphQL?</strong>  <br>R: Use GraphQL client libraries (gql, strawberry) e valide queries, mutations e subscriptions.</p>\n\n<p><strong>P: Contract testing é necessário?</strong>  <br>R: Essencial em microservices. Consumer-driven contracts (Pact) garantem que mudanças não quebram consumidores.</p>\n\n<p><strong>P: Quanto coverage é suficiente?</strong>  <br>R: 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos endpoints críticos, pelo menos 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos endpoints públicos.</p>', 'Testes de API: REST, GraphQL e Microserviços', '', 'publish', 'closed', 'open', '', '15testesapi', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/15testesapi/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('192', '0', '2026-07-04 23:07:29', '2026-07-05 02:07:29', '<p><strong>Meta Description:</strong> Aprenda exploratory testing: técnicas, charters, notas de teste e como combinar testes exploratórios com automação para cobertura completa.</p>\n\n<hr>\n<h2>O Que é Exploratory Testing?</h2>\n\n<p>Exploratory Testing (ET) é uma abordagem de teste onde o testador simultaneamente aprende sobre o sistema, projeta testes e os executa. É o oposto de testes scriptados - em vez de seguir um roteiro fixo, o testador usa sua criatividade e experiência para explorar o software.</p>\n\n<h3>Características Fundamentais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Aspecto</th><th>Scripted Testing</th><th>Exploratory Testing</th></tr>\n<tr><td><strong>Planejamento</strong></td><td>Detalhado antes</td><td>Simultâneo</td></tr>\n<tr><td><strong>Documentação</strong></td><td>Antes da execução</td><td>Durante e depois</td></tr>\n<tr><td><strong>Abordagem</strong></td><td>Repetitiva</td><td>Adaptativa</td></tr>\n<tr><td><strong>Criatividade</strong></td><td>Limitada</td><td>Alta</td></tr>\n<tr><td><strong>Descoberta</strong></td><td>Busca por defeitos específicos</td><td>Busca por defeitos inesperados</td></tr>\n<tr><td><strong>Melhor para</strong></td><td>Regressão, compliance</td><td>Novos features, UX</td></tr>\n</table></figure>\n\n<hr>\n<h2>Por Que Exploratory Testing?</h2>\n\n<h3>Quando ET Brilha</h3>\n\n<ul><li><strong>Novos recursos</strong> - Quando você não sabe o que esperar</li><ol><li><strong>UX testing</strong> - Avaliar experiência do usuário</li>\n<li><strong>Complexidade</strong> - Sistemas com muitas interações</li>\n<li><strong>Bugs difíceis</strong> - Defeitos que scripts não capturam</li>\n<li><strong>Rapid feedback</strong> - Quando tempo é curto</li>\n<li><strong>Decision making</strong> - Determinar se está \"pronto\"</li>\n</ol>\n<h3>Casos de Uso</h3>\n\n<pre><code>Exemplo 1: Nova tela de checkout<ol><li>O que fazer primeiro? → ET descobre fluxos</li>\n<li>O que esperar? → ET revela expectativas reais</li>\n<li>O que pode dar errado? → ET encontra edge cases</li>\n</ol>\nExemplo 2: After refactoring<ol><li>Funciona como antes? → ET verifica comportamento</li>\n<li>Há regressões? → ET busca inconsistências</li>\n<li>Performance está ok? → ET sente delays</li>\n</ol></code></pre>\n\n<hr>\n<h2>Técnicas de Exploratory Testing</h2>\n\n<h3>1. Touring Methods (James Whittaker)</h3>\n\n<h4>Feature Tour</h4>\n<pre><code># Feature Tour\n\"Explore todas as funcionalidades do menu\"\n\n<p>Ações:<ol><li>Navegar por cada opção do menu</li><br><li>Ler tooltips e placeholders</li><br><li>Verificar consistência visual</li><br><li>Identificar funcionalidades duplicadas</li><br></ol></code></pre></p>\n\n<h4>landmarks Tour</h4>\n<pre><code># Landmarks Tour\n\"Identificar pontos de referência na aplicação\"\n\n<p>Registrar:<ol><li>Telas principais (landmarks)</li><br><li>Navegação entre elas</li><br><li>Back button funciona?</li><br><li>Breadcrumbs corretos?</li><br></ol></code></pre></p>\n\n<p>####intellectual Tour<br><pre><code># Intellectual Tour<br>\"Testar baseado em conhecimento do domínio\"</p>\n\n<p>Foco:<ol><li>Regras de negócio críticas</li><br><li>Casos de uso principais</li><br><li>Dados de fronteira</li><br><li>Estados inválidos</li><br></ol></code></pre></p>\n\n<h3>2. CSIO (Clue, Specify, Implement, Operate)</h3>\n\n<pre><code># CSIO Checklist\n\n<p>C - Clue (Pista)<br>└── O que me chamou a atenção?<br>    - Link com texto estranho<br>    - Campo com validação incomum<br>    - Performance lambatmática</p>\n\n<p>S - Specify (Especificar)<br>└── O que testar?<br>    - Teste específico para a pista<br>    - Dados de teste necessários<br>    - Resultado esperado</p>\n\n<p>I - Implement (Implementar)<br>└── Como testar?<br>    - Executar teste<br>    - Observar resultado<br>    - Documentar comportamento</p>\n\n<p>O - Operate (Operar)<br>└── O que descobri?<br>    - Bug encontrado?<br>    - Comportamento inesperado?<br>    - Oportunidade de melhoria?<br></code></pre></p>\n\n<h3>3. Session-Based Testing</h3>\n\n<pre><code># Session-Based Testing\n\n<h2>Estrutura</h2><ol><li>Sessão: 60-90 minutos</li>\n<li>Charter: Objetivo claro</li>\n<li>Debrief: Resumo ao final</li>\n</ol>\n<h2>Template de Charter</h2>\nCharter: Testar fluxo de checkout com múltiplos itens\n===============================================\nCover: Checkout, carrinho, pagamento\nTest: Adicionar itens, aplicar cupons, escolher frete\nOracle: Comportamento esperado de e-commerce\n\n<h2>Session Log</h2>\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tempo</th><th>Ação</th><th>Observação</th></tr>\n<tr><td>00:05</td><td>Adicionou 1 item</td><td>Ok</td></tr>\n<tr><td>00:08</td><td>Adicionou item2</td><td>Total atualiza</td></tr>\n<tr><td>00:12</td><td>Removeu item1</td><td>Total recalcula</td></tr>\n<tr><td>00:15</td><td>Aplicou cupom</td><td>\"CUPOM_VÁLIDO\"</td></tr>\n</table></figure>\n\n<p></code></pre></p>\n\n<hr>\n<h2>Charter de Testing</h2>\n\n<h3>Template de Charter</h3>\n\n<pre><code># Charter de Testing\n\n<h2>Identificação</h2><ol><li>Testador: [Nome]</li>\n<li>Data: [Data]</li>\n<li>Sistema: [Nome do sistema]</li>\n<li>Versão: [Versão]</li>\n</ol>\n<h2>Objetivo</h2>\n[Testar o quê?] - [Por quê?]\n\n<h2>Cobertura</h2><ol><li>Funcionalidades a testar</li>\n<li>Áreas de foco</li>\n</ol>\n<h2>Abordagem</h2><ol><li>Técnicas a usar</li>\n<li>Dados de teste</li>\n</ol>\n<h2>Oracle</h2><ol><li>Como saber se está certo?</li>\n<li>Comportamento esperado</li>\n</ol>\n<h2>Tempo Estimado</h2>\n[ ] 30 min  [ ] 60 min  [ ] 90 min\n</code></pre>\n\n<h3>Exemplos de Charters</h3>\n\n<pre><code><h2>Charter 1: Fluxo de Login</h2>\nTestar o fluxo de login completo incluindo:<ol><li>Login com credenciais válidas</li>\n<li>Login com credenciais inválidas</li>\n<li>Recuperação de senha</li>\n<li>Manter sessão ativa</li>\n<li>Logout</li>\n</ol>\nAbordagem: Use a técnica de percurso do usuário\n\n<h2>Charter 2: Upload de Arquivos</h2>\nExplorar limites de upload de arquivos:<ol><li>Tipos de arquivo permitidos</li>\n<li>Tamanho máximo</li>\n<li>Nome com caracteres especiais</li>\n<li>Upload simultâneo</li>\n<li>Cancelamento de upload</li>\n</ol>\n<h2>Charter 3: Relatórios</h2>\nVerificar geração de relatórios:<ol><li>Filtros funcionam?</li>\n<li>Exportação para PDF/Excel</li>\n<li>Gráficos renderizam?</li>\n<li>Dados estão corretos?</li>\n<li>Performance com muitos dados?</li>\n</ol></code></pre>\n\n<hr>\n<h2>Ferramentas de Apoio</h2>\n\n<h3>Para Documentação</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Uso</th></tr>\n<tr><td><strong>TestRail</strong></td><td>Gerenciamento de casos e notas</td></tr>\n<tr><td><strong>qTest</strong></td><td>Exploratory testing module</td></tr>\n<tr><td><strong>PractiTest</strong></td><td>Gerenciamento de testes</td></tr>\n<tr><td><strong>Rapid Reporter</strong></td><td>Tomar notas rapidamente</td></tr>\n<tr><td><strong>Trello</strong></td><td>Tracking de sessões</td></tr>\n</table></figure>\n\n<h3>Para Gravação</h3>\n\n<pre><code># Rapid Reporter\n# Ferramenta simples para Windows que:\n# - Captura screenshots automaticamente\n# - Log de ações com timestamps\n# - Exportação para Excel/HTML\n\n<p># Loom<br># - Gravar tela durante sessão<br># - Compartilhar com equipe<br># - Revisar depois<br></code></pre></p>\n\n<hr>\n<h2>Combinando ET com Automação</h2>\n\n<h3>Estratégia Híbrida</h3>\n\n<pre><code>┌─────────────────────────────────────────────┐\n│                                             │\n│   Exploratory Testing                        │\n│   ├── Busca por bugs inesperados            │\n│   ├── Avaliação de UX                      │\n│   └── Context-aware testing                │\n│                                             │\n│           ↓                                 │\n│                                             │\n│   Automação de Testes                      │\n│   ├── Regressão                            │\n│   ├── Testes repetitivos                   │\n│   └── Cobertura de edge cases              │\n│                                             │\n└─────────────────────────────────────────────┘\n</code></pre>\n\n<h3>Fluxo de Trabalho</h3>\n<ol><li><strong>ET descobre bug</strong> → Automatizar para regressão</li>\n<li><strong>ET valida fix</strong> → Executar teste automatizado</li>\n<li><strong>ET explora novo feature</strong> → Criar charter</li>\n<li><strong>ET identifica padrões</strong> → Criar testes automatizados</li>\n</ol>\n<h3>Exemplo: Bug Encontrado em ET</h3>\n\n<pre><code># Bug Report - Exploratory Testing\n\n<h2>Descoberta</h2>\nDurante sessão exploratory no checkout, encontrei um bug:<ol><li>Usuário adiciona produto</li>\n<li>Aplica cupom \"DESCONTO10\"</li>\n<li>Remove o produto</li>\n<li>Cupom ainda aparece aplicado!</li>\n</ol>\n<h2>Prioridade</h2>\nAlta - Usuário pode ser cobrado incorretamente\n\n<h2>Steps to Reproduce</h2><ol><li>Adicionar produto ao carrinho</li>\n<li>Clicar em \"Aplicar Cupom\"</li>\n<li>Inserir \"DESCONTO10\"</li>\n<li>Clicar em \"Remover\" no produto</li>\n<li>Observar que cupom permanece</li>\n</ol>\n<h2>Automação</h2>\nCriar teste automatizado para prevenir regressão:\n\n<p></code></pre>python<br>def test_cupom_removido_quando_produto_removido():<br>    # Setup<br>    checkout_page.add_product()<br>    checkout_page.apply_coupon(\"DESCONTO10\")</p>\n\n<p># Action<br>    checkout_page.remove_product()</p>\n\n<p># Assert<br>    assert not checkout_page.has_coupon_applied()<br>    assert checkout_page.coupon_field_is_empty()<br><pre><code></code></pre></p>\n\n<hr>\n<h2>Matriz de Cobertura</h2>\n\n<h3>Cobertura por Feature</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Feature</th><th>ET</th><th>Automatizado</th><th>Cobertura Total</th></tr>\n<tr><td>Login</td><td>✅</td><td>✅</td><td>100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Cadastro</td><td>✅</td><td>✅</td><td>100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Checkout</td><td>✅</td><td>⚠️ Parcial</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Pagamento</td><td>✅</td><td>✅</td><td>95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Perfil</td><td>⚠️ Parcial</td><td>✅</td><td>85{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n</table></figure>\n\n<h3>Cobertura por Risco</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Risco</th><th>Probabilidade</th><th>Impacto</th><th>ET Recomendado</th></tr>\n<tr><td>Processamento de pagamento</td><td>Alta</td><td>Crítico</td><td>2 horas</td></tr>\n<tr><td>Cálculo de frete</td><td>Média</td><td>Alto</td><td>1 hora</td></tr>\n<tr><td>Upload de imagem</td><td>Baixa</td><td>Médio</td><td>30 min</td></tr>\n<tr><td>Notificações</td><td>Média</td><td>Médio</td><td>30 min</td></tr>\n</table></figure>\n\n<hr>\n<h2>Métricas de Exploratory Testing</h2>\n\n<h3>Session Metrics</h3>\n\n<pre><code><h2>Métricas de Sessão</h2>\n<ol><li>Cobertura</li>\n</ol>   - Funcionalidades exploradas: X/Y\n   - Tempo gasto por área\n<ol><li>Eficiência</li>\n</ol>   - Bugs encontrados / hora\n   - Defeitos críticos encontrados\n<ol><li>Qualidade</li>\n</ol>   - Bugs duplicados\n   - Bugs únicos válidos\n<ol><li>Documentation</li>\n</ol>   - Notas tomadas\n   - Screenshots capturados\n   - Testes automatizados propostos\n</code></pre>\n\n<h3>Report Template</h3>\n\n<pre><code># Relatório de Sessão ET\n\n<h2>Informações Gerais</h2><ol><li>Data: [Data]</li>\n<li>Testador: [Nome]</li>\n<li>Duração: [X horas]</li>\n<li>Sistema: [Sistema]</li>\n</ol>\n<h2>Resumo</h2>\n[Brief description of what was tested and overall assessment]\n\n<h2>Cobertura</h2><ol><li>Áreas exploradas: [List]</li>\n<li>Funcionalidades testadas: [Count]</li>\n</ol>\n<h2>Defeitos Encontrados</h2>\n<figure class=\"wp-block-table\"><table>\n<tr><th>ID</th><th>Descrição</th><th>Severidade</th><th>Status</th></tr>\n<tr><td>BUG-001</td><td>Cupom não removido</td><td>Alta</td><td>Aberto</td></tr>\n<tr><td>BUG-002</td><td>...</td><td>...</td><td>...</td></tr>\n</table></figure>\n\n<h2>Opportunidades de Automação</h2><ol><li>[Teste 1] - Prioridade Alta</li>\n<li>[Teste 2] - Prioridade Média</li>\n</ol>\n<h2>Avaliação Geral</h2><ol><li>✅ Sistema pronto para produção</li>\n<li>⚠️ Sistema pronto com restrições</li>\n<li>❌ Sistema NÃO pronto</li></ol></ul>\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Exploratory Testing é uma habilidade essencial que complementa testes automatizados. Suas vantagens são:<br><ol><li><strong>Flexibilidade</strong> - Adapta-se a qualquer situação</li><br><li><strong>Criatividade</strong> - Encontra bugs inesperados</li><br><li><strong>Eficiência</strong> - Máximo de cobertura em pouco tempo</li><br><li><strong>Contexto</strong> - Avalia experiência real do usuário</li><br><li><strong>Descoberta</strong> - Identifica oportunidades de melhoria</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: ET substitui testes automatizados?</strong>  <br>R: Não. ET e automação são complementares. Use ET para descoberta, automação para regressão.</p>\n\n<p><strong>P: Quanto tempo dedicar a ET?</strong>  <br>R: Recomenda-se 20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} do tempo de QA para ET em projetos maduros.</p>\n\n<p><strong>P: Como documentar ET?</strong>  <br>R: Use charters, session logs, screenshots e bug reports estruturados.</p>\n\n<p><strong>P: ET funciona em agile?</strong>  <br>R: Sim! ET é ideal para sprints curtos onde você precisa de feedback rápido.</p>', 'Exploratory Testing: A Arte de Testar Sem Roteiro', '', 'publish', 'open', 'open', '', '16exploratorytesting', '', '', '2026-07-04 23:07:29', '2026-07-05 02:07:29', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/16exploratorytesting/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('193', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda a testar usabilidade: heurísticas de Nielsen, testes com usuários, análise heurística, e como garantir que seus produtos sejam intuitivos e fáceis de usar.</p>\n\n<hr>\n<h2>Introdução aos Testes de Usabilidade</h2>\n\n<p>Testes de usabilidade avaliam quão fácil e intuitivo é usar um produto. São essenciais para garantir que usuários consigam completar suas tarefas eficientemente, sem frustração.</p>\n\n<h3>Por Que Usabilidade Importa?</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Impacto</th><th>Dado</th></tr>\n<tr><td><strong>Receita</strong></td><td>88{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} desiste após experiência ruim</td></tr>\n<tr><td><strong>Suporte</strong></td><td>Custos de suporte dobram com UX ruim</td></tr>\n<tr><td><strong>Conversão</strong></td><td>UX otimizada = +200{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} conversões</td></tr>\n<tr><td><strong>Retenção</strong></td><td>UX excelente = +90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} retenção</td></tr>\n<tr><td><strong>Brand</strong></td><td>73{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} culpa site pelo abandono</td></tr>\n</table></figure>\n\n<hr>\n<h2>As 10 Heurísticas de Nielsen</h2>\n\n<p>Jakob Nielsen definiu 10 princípios para avaliar usabilidade:</p>\n\n<h3>H1: Visibilidade do Status do Sistema</h3>\n\n<p><strong>Descrição:</strong> O sistema deve manter os usuários informados sobre o que está acontecendo.</p>\n\n<pre><code># BOM - Status visível\n✓ Barra de progresso durante upload\n✓ Indicador de \"Salvando...\"\n✓ Toast notification após ação\n\n<p># RUIM - Sem feedback<br>✗ Tela congelada sem indicator<br>✗ Upload sem progresso<br>✗ Confirmação unclear<br></code></pre></p>\n\n<h3>H2: Correspondência entre Sistema e Mundo Real</h3>\n\n<p><strong>Descrição:</strong> Use linguagem e conceitos familiares ao usuário.</p>\n\n<pre><code># BOM\n✓ Ícones de carrinho, lixeira, envelope\n✓ Labels em português correto\n✓ Jargão do domínio, não técnico\n\n<p># RUIM<br>✗ Códigos internos visíveis ao usuário<br>✗ Mensagens de erro técnicas<br>✗ Nomenclatura inconsistente<br></code></pre></p>\n\n<h3>H3: Controle e Liberdade do Usuário</h3>\n\n<p><strong>Descrição:</strong> Ofereça \"saídas de emergência\" e capacidade de desfazer ações.</p>\n\n<pre><code># BOM\n✓ Botão \"Cancelar\" claro\n✓ Undo/Redo disponíveis\n✓ Navegação consistente (back button)\n✓ Discard/Excluir com confirmação\n\n<p># RUIM<br>✗ Ações sem confirmação<br>✗ Sem como cancelar operação<br>✗ Dead ends na navegação<br></code></pre></p>\n\n<h3>H4: Consistência e Padrões</h3>\n\n<p><strong>Descrição:</strong> Mantenha consistência dentro do produto e com convenções da plataforma.</p>\n\n<pre><code># BOM\n✓ Mesmo estilo de botões\n✓ Terminologia consistente\n✓ Padrões de plataforma (iOS/Android)\n\n<p># RUIM<br>✗ Labels diferentes para mesma ação<br>✗ Cores diferentes para mesmo tipo<br>✗ Posições diferentes de elementos<br></code></pre></p>\n\n<h3>H5: Prevenção de Erros</h3>\n\n<p><strong>Descrição:</strong> Melhor do que mensagens de erro é prevenir que erros aconteçam.</p>\n\n<pre><code># BOM\n✓ Máscara de input (telefone, CPF)\n✓ Autocomplete com sugestões\n✓ Desabilitar botão enquanto processa\n✓ Validação em tempo real\n\n<p># RUIM<br>✗ Form提交 sem validação<br>✗ Botão ativo durante loading<br>✗ Senha sem requisitos visíveis<br></code></pre></p>\n\n<h3>H6: Reconhecimento ao Invés de Memorização</h3>\n\n<p><strong>Descrição:</strong> Torne opções e ações visíveis, sem forçar memorização.</p>\n\n<pre><code># BOM\n✓ Breadcrumbs sempre visíveis\n✓ Menus com ícones + texto\n✓ Histórico de navegação\n✓ Labels descritivos\n\n<p># RUIM<br>✗ Navegação só por atalhos<br>✗ Menu com ícones misteriosos<br>✗ Sem orientação contextual<br></code></pre></p>\n\n<h3>H7: Flexibilidade e Eficiência de Uso</h3>\n\n<p><strong>Descrição:</strong> Acomode usuários iniciantes e avançados.</p>\n\n<pre><code># BOM\n✓ Shortcuts para power users\n✓ Configurações avançadas (ocultas)\n✓ Onboarding para novos\n✓ Customização de interface\n\n<p># RUIM<br>✗ Tudo ou nada<br>✗ Sem atalhos possíveis<br>✗ Interface única para todos<br></code></pre></p>\n\n<h3>H8: Design Estético e Minimalista</h3>\n\n<p><strong>Descrição:</strong> Remova informações irrelevantes.</p>\n\n<pre><code># BOM\n✓ Foco no essencial\n✓ Hierarquia visual clara\n✓ White space adequado\n✓ Progressive disclosure\n\n<p># RUIM<br>✗ Informações demais<br>✗ Banners e popups constantes<br>✗ Tudo na mesma tela<br></code></pre></p>\n\n<h3>H9: Ajuda para Reconhecer Erros</h3>\n\n<p><strong>Descrição:</strong> Mensagens de erro devem ajudar o usuário a resolver.</p>\n\n<pre><code># BOM\n✓ \"Email inválido. Formato: usuario@dominio.com\"\n✓ \"Senha deve ter 8+ caracteres, incluindo número\"\n✓ Highlight do campo com erro\n\n<p># RUIM<br>✗ \"Erro 500\"<br>✗ \"Algo deu errado\"<br>✗ Erro sem указание do que fazer<br></code></pre></p>\n\n<h3>H10: Ajuda e Documentação</h3>\n\n<p><strong>Descrição:</strong> Forneça ajuda quando necessário.</p>\n\n<pre><code># BOM\n✓ Tooltips informativos\n✓ FAQ ou central de ajuda\n✓ Onboarding guiado\n✓ Chat de suporte\n\n<p># RUIM<br>✗ Sem documentação<br>✗ Documentação desatualizada<br>✗ Ajuda difícil de encontrar<br></code></pre></p>\n\n<hr>\n<h2>Tipos de Testes de Usabilidade</h2>\n\n<h3>1. Testes com Usuários</h3>\n\n<h4>Setup</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Aspecto</th><th>Recomendação</th></tr>\n<tr><td><strong>Participantes</strong></td><td>5-8 para finding inicial</td></tr>\n<tr><td><strong>Perfil</strong></td><td>Similar ao público real</td></tr>\n<tr><td><strong>Ambiente</strong></td><td>Silencioso, sem distrações</td></tr>\n<tr><td><strong>Duração</strong></td><td>30-90 minutos por sessão</td></tr>\n<tr><td><strong>Gravação</strong></td><td>Tela + rosto + áudio</td></tr>\n</table></figure>\n\n<h4>Tarefas para Usuário</h4>\n\n<pre><code># Tarefas para Teste de E-commerce\n<ol><li>\"Encontre uma camisa azul tamanho M e adicione ao carrinho\"</li>\n</ol>   - Tempo: ___\n   - Sucesso: ✓/✗\n   - Dificuldades: ___\n<ol><li>\"Use um cupom de desconto de 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</li>\n</ol>   - Tempo: ___\n   - Sucesso: ✓/✗\n   - Dificuldades: ___\n<ol><li>\"Finalize a compra como visitante\"</li>\n</ol>   - Tempo: ___\n   - Sucesso: ✓/✗\n   - Dificuldades: ___\n</code></pre>\n\n<h4>Métricas</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Target</th></tr>\n<tr><td><strong>Tempo na tarefa</strong></td><td>Cronômetro</td><td>&lt; 60s para simples</td></tr>\n<tr><td><strong>Taxa de sucesso</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} completou</td><td>&gt; 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Erros</strong></td><td>Contagem</td><td>&lt; 2 por tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Questionnaire (SUS)</td><td>&gt; 70</td></tr>\n<tr><td><strong>Confusão</strong></td><td>Observação</td><td>Minimo</td></tr>\n</table></figure>\n\n<h3>2. Análise Heurística</h3>\n\n<pre><code># Avaliação Heurística\n\n<p>Avaliador: [Nome]<br>Data: [Data]<br>Produto: [Nome]</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Heurística</th><th>Conformidade</th><th>Severidade</th><th>Comentários</th></tr>\n<tr><td>H1: Status</td><td>⚠️ 2/5</td><td>Média</td><td>Carrinho sem count badge</td></tr>\n<tr><td>H2: Mundo Real</td><td>✓ 5/5</td><td>-</td><td>Excelente</td></tr>\n<tr><td>H3: Controle</td><td>✗ 1/5</td><td>Alta</td><td>Sem undo</td></tr>\n<tr><td>H4: Consistência</td><td>✓ 5/5</td><td>-</td><td>Excelente</td></tr>\n<tr><td>H5: Prevenção</td><td>⚠️ 3/5</td><td>Baixa</td><td>Validação tardia</td></tr>\n<tr><td>...</td><td>...</td><td>...</td><td>...</td></tr>\n</table></figure>\n\n<p>Legenda Severidade:<br><ul><li>Crítica: Deve corrigir imediatamente</li><ol><li>Alta: Corrigir na próxima release</li><br><li>Média: Corrigir se tempo</li><br><li>Baixa: Nice to have</li><br></ol></code></pre></p>\n\n<h3>3. Questionário SUS (System Usability Scale)</h3>\n\n<pre><code># SUS Score\n\n<p>Responda de 1 (Discordo totalmente) a 5 (Concordo totalmente):<br><ol><li>Eu acho que gostaria de usar este sistema frequentemente</li><br><li>Eu achei o sistema inutilmente complexo</li><br><li>Eu achei o sistema fácil de usar</li><br><li>Eu precisaria de suporte técnico para usar este sistema</li><br><li>Eu encontrei várias funções bem integradas neste sistema</li><br><li>Eu achei que havia muita inconsistência neste sistema</li><br><li>A maioria das pessoas aprenderia a usar este sistema rapidamente</li><br><li>Eu achei o sistema muito trabalhoso de usar</li><br><li>Eu me senti confiante usando o sistema</li><br><li>Eu precisei aprender muitas coisas antes de conseguir usar o sistema</li><br></ol><br>Cálculo:<ol><li>Para itens ímpares (1,3,5,7,9): score = resposta - 1</li><br><li>Para itens pares (2,4,6,8,10): score = 5 - resposta</li><br><li>SUS = (soma dos scores) × 2.5</li><br></ol><br>Interpretação:<ol><li>90+ = A+ (Best imaginable)</li><br><li>80-90 = A (Excellent)</li><br><li>70-80 = B (Good)</li><br><li>60-70 = C (Okay)</li><br><li>50-60 = D (Poor)</li><br><li>&lt;50 = F (Fail)</li><br></ol></code></pre></p>\n\n<hr>\n<h2>Ferramentas de Teste de Usabilidade</h2>\n\n<h3>1. Observação Remota</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Características</th><th>Custo</th></tr>\n<tr><td><strong>UserTesting</strong></td><td>Painel de participantes</td><td>$39/sessão</td></tr>\n<tr><td><strong>Optimal Workshop</strong></td><td>Card sorting, tree testing</td><td>$100+/mês</td></tr>\n<tr><td><strong>Hotjar</strong></td><td>Heatmaps, recordings</td><td>Grátis/Pro</td></tr>\n<tr><td><strong>Lookback</strong></td><td>Gravação + entrevistas</td><td>Sob consulta</td></tr>\n<tr><td><strong>Maze</strong></td><td>Testing rápido</td><td>Grátis/Pro</td></tr>\n</table></figure>\n\n<h3>2. Heatmaps e Clickmaps</h3>\n\n<pre><code>// Hotjar Heatmap\n// Tracking automático de:\n// - Movimentos do mouse\n// - Cliques\n// - Scroll depth\n// - Tempo de visão\n\n<p>// Configuração<br>hj(\'heatmap\', {<br>    scrollmap: true,<br>    clickmap: true,<br>    recording: true<br>});<br></code></pre></p>\n\n<h3>3. A/B Testing para UX</h3>\n\n<pre><code>// Google Optimize / VWO\n// Testar variações de UI\n\n<p>// Exemplo de implementação<br>function showABTest() {<br>    const variation = Math.random() &gt; 0.5 ? \'A\' : \'B\';</p>\n\n<p>if (variation === \'A\') {<br>        // Versão atual<br>        document.getElementById(\'cta\').textContent = \'Compre Agora\';<br>    } else {<br>        // Nova versão<br>        document.getElementById(\'cta\').textContent = \'Comece Seu Teste Grátis\';<br>    }</p>\n\n<p>// Rastrear resultado<br>    analytics.track(\'cta_variation\', { variation });<br>}<br></code></pre></p>\n\n<hr>\n<h2>WCAG 2.1 - Acessibilidade</h2>\n\n<h3>4 Princípios (POUR)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Princípio</th><th>Descrição</th></tr>\n<tr><td><strong>Perceivable</strong></td><td>Informations deve ser perceptível</td></tr>\n<tr><td><strong>Operable</strong></td><td>Interface deve ser operável</td></tr>\n<tr><td><strong>Understandable</strong></td><td>Informações e operação compreensíveis</td></tr>\n<tr><td><strong>Robust</strong></td><td>Conteúdo deve ser robusto</td></tr>\n</table></figure>\n\n<h3>Critérios de Conformidade (Resumo)</h3>\n\n<pre><code><h2>Nível A (Básico)</h2>\n\n<p>✓ Alternativas textuais para imagens<br>✓ Captions para vídeos<br>✓ Cor não é único meio de informação<br>✓ Navegação por teclado<br>✓ Sem flash mais que 3x/segundo</p>\n\n<h2>Nível AA (Recomendado)</h2>\n\n<p>✓ Contraste mínimo 4.5:1 (texto), 3:1 (grande)<br>✓ Redimensionamento de texto<br>✓ Multiple ways de encontrar conteúdo<br>✓ Cabeçalhos e labels descritivos<br>✓ Sem timing ajustável</p>\n\n<h2>Nível AAA (Avançado)</h2>\n\n<p>✓ Contraste 7:1<br>✓ Audio description<br>✓ Sign language interpretation<br>✓ Enhanced contrast<br></code></pre></p>\n\n<hr>\n<h2>Checklist de Usabilidade</h2>\n\n<h3>Formulários</h3>\n<ol><li>[ ] Labels visíveis (não só placeholders)</li>\n<li>[ ] Campos com autocomplete</li>\n<li>[ ] Validação inline e helpful</li>\n<li>[ ] Tab order logical</li>\n<li>[ ] Required fields indication</li>\n<li>[ ] Error messages específicos</li>\n<li>[ ] Success confirmation</li>\n</ol>\n<h3>Navegação</h3>\n<ol><li>[ ] Logo retorna para home</li>\n<li>[ ] Menu sempre visível</li>\n<li>[ ] Breadcrumbs quando aplicável</li>\n<li>[ ] Search funcional</li>\n<li>[ ] 404 page útil</li>\n<li>[ ] Consistent header/footer</li>\n</ol>\n<h3>Mobile</h3>\n<ol><li>[ ] Touch targets &gt; 48px</li>\n<li>[ ] No horizontal scroll</li>\n<li>[ ] Viewport configured</li>\n<li>[ ] Font size legível (16px min)</li>\n<li>[ ] Space between links</li>\n<li>[ ] Thumb zone respeitada</li>\n</ol>\n<h3>Performance</h3>\n<ol><li>[ ] First paint &lt; 1.5s</li>\n<li>[ ] Interactive &lt; 3s</li>\n<li>[ ] No layout shift</li>\n<li>[ ] Skeleton loading</li>\n<li>[ ] Progressive enhancement</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de usabilidade são essenciais para criar produtos que usuários amam. As chaves para o sucesso são:<br><ol><li><strong>Testar com usuários reais</strong> - Não presuma, observe</li><br><li><strong>Usar heurísticas</strong> - Checklist estruturado</li><br><li><strong>Medir objetivamente</strong> - Métricas + qualititativo</li><br><li><strong>Priorizar</strong> - Nem tudo pode ser corrigido agora</li><br><li><strong>Iterar</strong> - UX é melhoria contínua</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Quantos usuários preciso testar?</strong>  <br>R: 5-8 para encontrar a maioria dos problemas (Lei dos retornos decrescentes).</p>\n\n<p><strong>P: Quando fazer testes de usabilidade?</strong>  <br>R: Idealmente antes do design (pesquisa) e depois do MVP (validação).</p>\n\n<p><strong>P: Posso fazer testes de usabilidade remotamente?</strong>  <br>R: Sim! Ferramentas como UserTesting e Hotjar permitem testes remotos eficientes.</p>\n\n<p><strong>P: Como medir ROI de UX?</strong>  <br>R: Compare métricas antes/depois: tempo de tarefa, taxa de conclusão, satisfação (SUS).</p>', 'Testes de Usabilidade: Garantindo Excelência na Experiência do Usuário', '', 'publish', 'closed', 'open', '', '17testesusabilidade', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/17testesusabilidade/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('194', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda a implementar testes de regressão eficazes: estratégias de seleção, automação, manutenção e como construir uma suite de regressão sustentável.</p>\n\n<hr>\n<h2>O Que São Testes de Regressão?</h2>\n\n<p>Testes de regressão são executados para garantir que mudanças recentes no código (novas funcionalidades, bug fixes, refactoring) não introduziram novos defeitos ou quebraram funcionalidades existentes.</p>\n\n<h3>Quando Executar Regressão</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Situação</th><th>Recomendação</th></tr>\n<tr><td>Antes de cada release</td><td>Suite completa</td></tr>\n<tr><td>Após hotfix</td><td>Smoke + área afetada</td></tr>\n<tr><td>Antes de deploy</td><td>Critical path</td></tr>\n<tr><td>Semanalmente (CI)</td><td>Suite rápida</td></tr>\n<tr><td>Sob demanda</td><td>Após mudanças críticas</td></tr>\n</table></figure>\n\n<hr>\n<h2>Estratégias de Seleção de Testes</h2>\n\n<h3>1. Regressão Completa</h3>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Quando usar:</strong><br><ul><li>Releases major</li><ol><li>Mudanças arquiteturais</li><br><li>After database migration</li><br><li>Final gate para produção</li><br></ol><br><h3>2. Regressão Parcial (Seletiva)</h3></p>\n\n<p>Seleciona subconjunto baseado em mudanças.</p>\n\n<pre><code># Exemplo: Selecionar testes por área afetada\ndef get_affected_tests(changed_files):\n    \"\"\"Retorna testes que devem ser executados\"\"\"\n\n<p>module_to_tests = {<br>        \'src/auth/\': [\'tests/auth/*.py\', \'tests/conftest.py\'],<br>        \'src/payment/\': [\'tests/payment/*.py\'],<br>        \'src/cart/\': [\'tests/cart/<em>.py\', \'tests/checkout/</em>.py\'],<br>    }</p>\n\n<p>tests = set()<br>    for changed_file in changed_files:<br>        module = extract_module(changed_file)<br>        if module in module_to_tests:<br>            tests.update(module_to_tests[module])</p>\n\n<p>return tests</p>\n\n<p># Executar apenas testes afetados<br>affected_tests = get_affected_tests(get_changed_files())<br>pytest.main(affected_tests)<br></code></pre></p>\n\n<h3>3. Regressão Baseada em Risco</h3>\n\n<p>Prioriza por risco de impacto.</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Prioridade</th><th>Critério</th><th>Execução</th></tr>\n<tr><td><strong>Crítica</strong></td><td>Fluxos de pagamento, auth</td><td>Sempre</td></tr>\n<tr><td><strong>Alta</strong></td><td>Features principais</td><td>Antes de cada release</td></tr>\n<tr><td><strong>Média</strong></td><td>Features secundárias</td><td>Semanalmente</td></tr>\n<tr><td><strong>Baixa</strong></td><td>Edge cases</td><td>Mensalmente</td></tr>\n</table></figure>\n\n<h3>4. Regressão Híbrida</h3>\n\n<p>Combina múltiplas estratégias.</p>\n\n<pre><code># strategy: Hybrid Regression\n\n<p># Nivel 1: Critical (sempre)<ol><li>tests/auth/login*.py</li><br><li>tests/auth/logout*.py</li><br><li>tests/payment/checkout*.py</li><br><li>tests/smoke/*.py</li><br></ol><br># Nivel 2: Based on changes<ol><li>get_affected_tests()</li><br></ol><br># Nivel 3: Risk-based<ol><li>tests/high_risk_features*.py</li><br></ol><br># Nivel 4: Full (releases only)<ol><li>tests/full_suite/*.py</li></ol></ul><br></code></pre></p>\n\n<hr>\n<h2>Automação de Regressão</h2>\n\n<h3>Framework Ideal</h3>\n\n<pre><code>regression_suite/\n├── conftest.py              # Setup global\n├── pytest.ini               # Configuração\n├── requirements.txt         # Dependências\n│\n├── core/\n│   ├── __init__.py\n│   ├── base_page.py         # Page Object base\n│   ├── api_client.py        # Cliente API\n│   └── database.py          # Helpers de DB\n│\n├── pages/                   # Page Objects\n│   ├── login_page.py\n│   ├── dashboard_page.py\n│   └── checkout_page.py\n│\n├── api/                     # API Tests\n│   ├── test_auth.py\n│   ├── test_products.py\n│   └── test_orders.py\n│\n├── ui/                      # UI Tests\n│   ├── test_login.py\n│   ├── test_checkout.py\n│   └── test_profile.py\n│\n├── smoke/                   # Smoke Tests\n│   └── test_critical_path.py\n│\n├── data/                    # Data files\n│   └── users.json\n│\n└── reports/                 # Relatórios\n    └── .gitkeep\n</code></pre>\n\n<h3>Page Object Pattern</h3>\n\n<pre><code># pages/base_page.py\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n<p>class BasePage:<br>    def __init__(self, driver):<br>        self.driver = driver<br>        self.wait = WebDriverWait(driver, 10)</p>\n\n<p>def click(self, locator):<br>        self.wait.until(EC.element_to_be_clickable(locator)).click()</p>\n\n<p>def send_keys(self, locator, text):<br>        element = self.wait.until(EC.presence_of_element_located(locator))<br>        element.clear()<br>        element.send_keys(text)</p>\n\n<p>def get_text(self, locator):<br>        return self.wait.until(EC.presence_of_element_located(locator)).text</p>\n\n<p>def is_visible(self, locator):<br>        try:<br>            return self.wait.until(<br>                EC.visibility_of_element_located(locator)<br>            ).is_displayed()<br>        except:<br>            return False</p>\n\n<p># pages/login_page.py<br>from selenium.webdriver.common.by import By</p>\n\n<p>class LoginPage(BasePage):<br>    URL = \"https://exemplo.com/login\"</p>\n\n<p>EMAIL = (By.ID, \"email\")<br>    PASSWORD = (By.ID, \"password\")<br>    LOGIN_BUTTON = (By.ID, \"login-button\")<br>    ERROR_MESSAGE = (By.CLASS_NAME, \"error-message\")</p>\n\n<p>def load(self):<br>        self.driver.get(self.URL)<br>        return self</p>\n\n<p>def login(self, email, password):<br>        self.send_keys(self.EMAIL, email)<br>        self.send_keys(self.PASSWORD, password)<br>        self.click(self.LOGIN_BUTTON)<br>        return self</p>\n\n<p>def get_error(self):<br>        return self.get_text(self.ERROR_MESSAGE)<br></code></pre></p>\n\n<h3>Execução Paralela</h3>\n\n<pre><code># pytest.ini\n[pytest]\naddopts = -n auto --dist loadscope\n# -n auto: usa todas CPUs disponíveis\n# --dist loadscope: agrupa testes por scope\n</code></pre>\n\n<pre><code># GitHub Actions\nname: Regression Tests\n\n<p>on:<br>  schedule:<br>    - cron: \'0 6 <em> </em> 1\'  # Toda segunda 6h</p>\n\n<p>jobs:<br>  regression:<br>    runs-on: ubuntu-latest<br>    strategy:<br>      matrix:<br>        shard: [1, 2, 3, 4]</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run test shard ${{ matrix.shard }}<br>        run: |<br>          pytest tests/ <br>            --dist loadscope <br>            --maxprocesses 4 <br>            --split=${{ matrix.shard }}/4<br></code></pre></p>\n\n<hr>\n<h2>Manutenção da Suite</h2>\n\n<h3>Identificando Testes Obsoletos</h3>\n\n<pre><code># script: identify_obsolete_tests.py\nimport subprocess\nfrom datetime import datetime\n\n<p>def analyze_test_usage():<br>    \"\"\"Analisa quais testes não foram executados ou falham sempre\"\"\"</p>\n\n<p>results = []</p>\n\n<p># 1. Testes sem execution recent<br>    git_log = subprocess.run(<br>        [\'git\', \'log\', \'--oneline\', \'--all\', \'--\', \'tests/\'],<br>        capture_output=True,<br>        text=True<br>    ).stdout</p>\n\n<p># 2. Testes que sempre falham<br>    # 3. Testes duplicados<br>    # 4. Cobertura redundante</p>\n\n<p>return results</p>\n\n<p># Gerar relatório<br>report = analyze_test_usage()<br>print(\"Testes para revisão:\")<br>for test in report:<br>    print(f\"  - {test[\'name\']}: {test[\'reason\']}\")<br></code></pre></p>\n\n<h3>Indicadores de \"Code Smell\" em Testes</h3>\n\n<pre><code># PROBLEMA: Teste faz muito\ndef test_criar_pedido_completo():\n    # Setup (50 linhas)\n    # Login (10 linhas)\n    # Add produto (15 linhas)\n    # Add outro produto (15 linhas)\n    # Apply cupom (10 linhas)\n    # Calculate shipping (10 linhas)\n    # Checkout (20 linhas)\n    # Payment (30 linhas)\n    # Verify (40 linhas)\n    # Cleanup (20 linhas)\n    # Total: 220 linhas - MUITO PARA UM TESTE!\n\n<p># SOLUÇÃO: Dividir em múltiplos testes focados<br>def test_adicionar_produto_ao_carrinho():<br>    \"\"\"Focado: adiciona produto\"\"\"<br>    pass</p>\n\n<p>def test_aplicar_cupom_desconto():<br>    \"\"\"Focado: aplica cupom\"\"\"<br>    pass</p>\n\n<p>def test_calcular_frete():<br>    \"\"\"Focado: calcula frete\"\"\"<br>    pass</p>\n\n<p>def test_checkout_com_sucesso():<br>    \"\"\"Integração: fluxo completo\"\"\"<br>    pass<br></code></pre></p>\n\n<hr>\n<h2>Métricas de Regressão</h2>\n\n<h3>Dashboard</h3>\n\n<pre><code># Grafana Dashboard - Regression Suite\n\n<p>panels:<br>  - title: \"Test Execution Time\"<br>    type: graph<br>    queries:<br>      - query: \"sum(rate(test_duration_seconds_sum[5m])) / sum(rate(test_duration_seconds_count[5m]))\"</p>\n\n<p>- title: \"Pass/Fail Rate\"<br>    type: piechart<br>    queries:<br>      - query: \"sum by (status) (test_results_total)\"</p>\n\n<p>- title: \"Flaky Tests\"<br>    type: stat<br>    queries:<br>      - query: \"count(test_flaky == 1)\"</p>\n\n<p>- title: \"Coverage Trend\"<br>    type: timeseries<br>    queries:<br>      - query: \"test_coverage_percentage\"<br></code></pre></p>\n\n<h3>KPIs</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Target</th><th>Current</th><th>Trend</th></tr>\n<tr><td>Pass Rate</td><td>&gt; 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>93{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>↑</td></tr>\n<tr><td>Execution Time</td><td>&lt; 30 min</td><td>35 min</td><td>↓</td></tr>\n<tr><td>Flaky Rate</td><td>&lt; 2{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>3{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>→</td></tr>\n<tr><td>Coverage</td><td>&gt; 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>78{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>↑</td></tr>\n<tr><td>Maintenance Effort</td><td>&lt; 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>↓</td></tr>\n</table></figure>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de regressão são a rede de segurança do seu software. Para uma suite eficaz:<br><ol><li><strong>Selecione estrategicamente</strong> - Nem tudo precisa de regressão completa</li><br><li><strong>Automatize</strong> - Regressão manual não escala</li><br><li><strong>Mantenha</strong> - Limpe testes obsoletos regularmente</li><br><li><strong>Monitore</strong> - Métricas guiam melhoria</li><br><li><strong>Priorize</strong> - Risco e impacto guiam execução</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Quantos testes deve ter na suite de regressão?</strong>  <br>R: Depende do projeto. Uma suite saudável cobre funcionalidades críticas com alta cobertura.</p>\n\n<p><strong>P: Como reduzir flaky tests?</strong>  <br>R: Use waits explícitos, isole testes, evite dependências, investigue root cause.</p>\n\n<p><strong>P: Testes de regressão devem ser no CI ou separate job?</strong>  <br>R: Smokes no CI (bloqueante), regressão completa em job separado (não bloqueante).</p>\n\n<p><strong>P: Como saber se a suite precisa de mais testes?</strong>  <br>R: Analise: bugs que passaram, áreas sem cobertura, novos riscos.</p>', 'Testes de Regressão: Garantindo Qualidade Contínua', '', 'publish', 'closed', 'open', '', '18testesregressao', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/18testesregressao/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('195', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Entenda como QA se integra às metodologias ágeis: Scrum, Kanban e XP. Aprenda a aplicar práticas de qualidade em equipes ágeis.</p>\n\n<hr>\n<h2>QA em Scrum</h2>\n\n<h3>Cerimônias e QA</h3>\n\n<h4>Sprint Planning</h4>\n<pre><code># Sprint Planning - Input de QA\n\n<h2>Antes da Planning</h2>\n<ul><li>[ ] Backlog priorizado pelo PO</li><ol><li>[ ] User stories com critérios de aceitação</li>\n<li>[ ] Histórias técnicas identificadas</li>\n</ol>\n<h2>Durante Planning</h2>\n<h3>Para cada história</h3><ol><li>PO apresenta requirements</li>\n<li>Devs estimam esforço</li>\n<li>QA identifica:</li>\n</ol>  - Riscos de teste\n  - Dados necessários\n  - Dependências\n  - Complexidade de automação<ol><li>timebox: ~1 hora por sprint</li>\n</ol>\n<h2>Output</h2><ol><li>[ ] Sprint backlog definido</li>\n<li>[ ] Definition of Done clara</li>\n<li>[ ] Dívidas técnicas identificadas</li>\n</ol></code></pre>\n\n<h4>Daily Standup</h4>\n<pre><code># Daily Standup - QA Updates\n\n<h2>Formato: 3 perguntas</h2>\n\n<h3>O que fiz ontem para ajudar o time?</h3><ol><li>\"Finalizei testes da história #123\"</li>\n<li>\"Revisei PR do João\"</li>\n</ol>\n<h3>O que farei hoje?</h3><ol><li>\"Vou testar história #124\"</li>\n<li>\"Vou automatizar teste de login\"</li>\n</ol>\n<h3>Há algum impedimento?</h3><ol><li>\"Aguardando ambiente de staging\"</li>\n<li>\"Preciso de acesso ao banco de produção\"</li>\n</ol>\n<h2>Tips para QA</h2><ol><li>Mantenha updates curtos (~30 segundos)</li>\n<li>Identifique bloqueios rápido</li>\n<li>Ajude devs com code review</li>\n<li>Coordene com outros QAers</li>\n</ol></code></pre>\n\n<h4>Sprint Review</h4>\n<pre><code># Sprint Review - Testing Handoff\n\n<h2>Demo Checklist</h2><ol><li>[ ] Funcionalidades demonstradas</li>\n<li>[ ] Critérios de aceitação cumpridos</li>\n<li>[ ] Testes executados</li>\n<li>[ ] Bugs documentados</li>\n</ol>\n<h2>Demo Format</h2><ol><li>\"O que foi feito?\"</li>\n<li>\"Como funciona?\"</li>\n<li>\"O que não foi feito?\" (e por quê)</li>\n<li>\"Próximos passos\"</li>\n</ol>\n<h2>Feedback de QA</h2><ol><li>Qualidade geral</li>\n<li>Issues encontrados</li>\n<li>Recomendações</li>\n</ol></code></pre>\n\n<h4>Sprint Retrospective</h4>\n<pre><code># Sprint Retrospective - QA Focus\n\n<h2>Start (O que começar a fazer?)</h2><ol><li>\"Começar a fazer BDD com time\"</li>\n<li>\"Começar a documentar testes\"</li>\n</ol>\n<h2>Stop (O que parar de fazer?)</h2><ol><li>\"Parar de fazer testes manuais em features pequenas\"</li>\n<li>\"Parar de aceitar histórias sem critérios de aceitação\"</li>\n</ol>\n<h2>Continue (O que continuar fazendo?)</h2><ol><li>\"Continuar pair testing\"</li>\n<li>\"Continuar code reviews\"</li>\n</ol>\n<h2>Ações para Próximo Sprint</h2><ol><li>[ ] Ação 1 - Responsável: João</li>\n<li>[ ] Ação 2 - Responsável: Maria</li>\n</ol></code></pre>\n\n<h3>Definition of Done (DoD)</h3>\n\n<pre><code># Definition of Done - Checklist\n\n<p>Para uma história ser considerada \"Done\":</p>\n\n<h2>Código</h2><ol><li>[ ] Código implementado</li>\n<li>[ ] Code review aprovado</li>\n<li>[ ] Branch merged to main</li>\n<li>[ ] Sem warnings de linter</li>\n</ol>\n<h2>Testes</h2><ol><li>[ ] Unit tests escritos (&gt; 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} coverage)</li>\n<li>[ ] Testes de integração passando</li>\n<li>[ ] Testes funcionais passando</li>\n<li>[ ] Testes de performance (se aplicável)</li>\n<li>[ ] Accessibility testes (se aplicável)</li>\n</ol>\n<h2>Qualidade</h2><ol><li>[ ] Segurança revisada</li>\n<li>[ ] Performance considerada</li>\n<li>[ ] Responsivo (se web/mobile)</li>\n<li>[ ] Logs implementados</li>\n</ol>\n<h2>Documentação</h2><ol><li>[ ] README atualizado</li>\n<li>[ ] API docs (se aplicável)</li>\n<li>[ ] Swagger/OpenAPI atualizado</li>\n</ol>\n<h2>Deploy</h2><ol><li>[ ] Deploy em staging</li>\n<li>[ ] Smoke tests passando</li>\n<li>[ ] Ready for production</li>\n</ol></code></pre>\n\n<hr>\n<h2>QA em Kanban</h2>\n\n<h3>Quadro Kanban</h3>\n\n<pre><code>┌──────────┬──────────┬──────────┬──────────┬──────────┐\n│  BACKLOG │  READY   │ IN DEV   │  TEST    │   DONE   │\n├──────────┼──────────┼──────────┼──────────┼──────────┤\n│  Story 5 │ Story 1  │ Story 2  │ Story 3  │ Story 4  │\n│  Story 6 │          │          │          │ Story 7  │\n│  Story 8 │          │          │          │          │\n└──────────┴──────────┴──────────┴──────────┴──────────┘\n    ∞            5           3          3           ∞\n</code></pre>\n\n<h3>WIP Limits</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Column</th><th>WIP Limit</th><th>Reason</th></tr>\n<tr><td>Ready</td><td>5</td><td>Capacidade do time</td></tr>\n<tr><td>In Dev</td><td>3</td><td>Focus por developer</td></tr>\n<tr><td>Test</td><td>3</td><td>Capacidade QA</td></tr>\n<tr><td>Review</td><td>2</td><td>Bottlenecks visíveis</td></tr>\n</table></figure>\n\n<h3>Métricas Kanban</h3>\n\n<pre><code># Lead Time e Cycle Time\nimport datetime\n\n<p>def calculate_metrics():<br>    tickets = [<br>        {<br>            \"id\": \"PROD-123\",<br>            \"created\": \"2024-01-01\",<br>            \"ready\": \"2024-01-03\",<br>            \"dev_start\": \"2024-01-05\",<br>            \"dev_done\": \"2024-01-08\",<br>            \"test_start\": \"2024-01-09\",<br>            \"test_done\": \"2024-01-10\",<br>            \"done\": \"2024-01-10\",<br>        }<br>    ]</p>\n\n<p>for ticket in tickets:<br>        created = datetime.datetime.strptime(ticket[\"created\"], \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}Y-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}m-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}d\")<br>        done = datetime.datetime.strptime(ticket[\"done\"], \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}Y-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}m-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}d\")</p>\n\n<p>lead_time = (done - created).days<br>        cycle_time = (done - datetime.datetime.strptime(<br>            ticket[\"dev_start\"], \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}Y-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}m-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}d\"<br>        )).days</p>\n\n<p>print(f\"{ticket[\'id\']}: Lead={lead_time}d, Cycle={cycle_time}d\")</p>\n\n<p># Throughput<br>def throughput(team_tickets):<br>    completed_last_30d = sum(<br>        1 for t in team_tickets <br>        if is_done_recently(t, 30)<br>    )<br>    return completed_last_30d<br></code></pre></p>\n\n<h3>Classes of Service</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Class</th><th>Priority</th><th>WIP</th><th>Lead Time Target</th></tr>\n<tr><td>Expedite</td><td>Crítica</td><td>1</td><td>&lt; 1 dia</td></tr>\n<tr><td>Fixed Date</td><td>Alta</td><td>2</td><td>Na data</td></tr>\n<tr><td>Standard</td><td>Normal</td><td>∞</td><td>&lt; 5 dias</td></tr>\n<tr><td>Intangible</td><td>Baixa</td><td>∞</td><td>Quando possível</td></tr>\n</table></figure>\n\n<hr>\n<h2>XP (Extreme Programming) e QA</h2>\n\n<h3>Práticas XP</h3>\n\n<h4>Pair Programming</h4>\n\n<pre><code># Pair Programming Roles\n\n<h2>Driver</h2><ol><li>Escreve o código</li>\n<li>Focado na implementação</li>\n<li>Compartilha tela</li>\n</ol>\n<h2>Navigator</h2><ol><li>Revisa código em tempo real</li>\n<li>Pensa estrategicamente</li>\n<li>Busca melhorias</li>\n<li>Agenda refatoração</li>\n</ol>\n<h2>Dicas</h2><ol><li>Troque papéis a cada 30-60 minutos</li>\n<li>Mantenha comunicação aberta</li>\n<li>Ambos são responsáveis pela qualidade</li>\n</ol>\n<h2>Benefícios</h2><ol><li>15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} mais lento, mas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos bugs</li>\n<li>Transferência de conhecimento</li>\n<li>Catches bugs em tempo real</li>\n</ol></code></pre>\n\n<h4>TDD em XP</h4>\n\n<pre><code># Ciclo TDD em XP\n# Red -&gt; Green -&gt; Refactor (em pares!)\n\n<p># 1. RED: Escrever teste que falha<br>def test_calcular_imposto():<br>    resultado = calcular_imposto(100, 0.1)<br>    assert resultado == 10</p>\n\n<p># 2. GREEN: Fazer passar (mínimo)<br>def calcular_imposto(valor, taxa):<br>    return 10  # Hardcoded</p>\n\n<p># 3. REFACTOR: Melhorar (em par)<br>def calcular_imposto(valor, taxa):<br>    return valor * taxa<br></code></pre></p>\n\n<h4>Continuous Integration</h4>\n\n<pre><code># CI Pipeline XP Style\nname: XP CI\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  test:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p># 1. Commit pequeno<br>      # 2. Build e test<br>      - run: pip install pytest pytest-cov</p>\n\n<p># 3. Todos testes passando<br>      - run: pytest -v --cov=src --cov-fail-under=80</p>\n\n<p># 4. Integrar frequentemente<br>      - name: Merge if green<br>        if: github.ref == \'main\'<br>        run: echo \"Ready to merge\"<br></code></pre></p>\n\n<hr>\n<h2>Métricas Ágeis de QA</h2>\n\n<h3>Defect Metrics</h3>\n\n<pre><code># Defect Metrics\nclass DefectMetrics:\n    def __init__(self, sprints):\n        self.sprints = sprints\n\n<p>def defect_leakage(self, sprint):<br>        \"\"\"Defeitos encontrados em produção vs. antes\"\"\"<br>        prod_bugs = sprint.bugs_found_in_prod<br>        total_bugs = sprint.total_bugs</p>\n\n<p>return (prod_bugs / total_bugs) * 100 if total_bugs else 0</p>\n\n<p>def defect_densities(self, sprints):<br>        \"\"\"Densidade de defeitos por feature\"\"\"<br>        return {<br>            sprint.name: len(sprint.defects) / sprint.stories_completed<br>            for sprint in sprints<br>        }</p>\n\n<p>def escape_rate(self, sprint):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos que escaparam para prod\"\"\"<br>        escaped = sprint.defects_found_after_release<br>        total = sprint.total_defects</p>\n\n<p>return (escaped / total * 100) if total else 0</p>\n\n<p># Targets<br># Defect Leakage: &lt; 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br># Defect Density: &lt; 0.5 per story<br># Escape Rate: &lt; 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br></code></pre></p>\n\n<h3>Test Velocity</h3>\n\n<pre><code># Test Velocity Metrics\n\n<p>metrics:<br>  - name: \"Tests Written per Sprint\"<br>    target: 50<br>    current: 47</p>\n\n<p>- name: \"Automation Coverage\"<br>    target: \"80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br>    current: \"72{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</p>\n\n<p>- name: \"Test Execution Time\"<br>    target: \"&lt; 30 min&quot;<br>    current: \"35 min\"</p>\n\n<p>- name: \"Test Maintenance Effort\"<br>    target: \"&lt; 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}&quot;<br>    current: \"25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br></code></pre></p>\n\n<hr>\n<h2>Checklist de Práticas Ágeis para QA</h2>\n\n<h3>Sprint</h3><ol><li>[ ] Participar de planning</li>\n<li>[ ] Identificar riscos de teste</li>\n<li>[ ] Atualizar testes para histórias</li>\n<li>[ ] Executar testes</li>\n<li>[ ] Reportar bugs</li>\n<li>[ ] Participar de review</li>\n<li>[ ] Retrospectiva de QA</li>\n</ol>\n<h3>Continuous</h3><ol><li>[ ] Manter testes atualizados</li>\n<li>[ ] Pair testing quando possível</li>\n<li>[ ] Code reviews</li>\n<li>[ ] CI/CD passing</li>\n<li>[ ] Métricas atualizadas</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>QA em agile requer adaptação constante e colaboração. As chaves são:<br><ol><li><strong>Integração</strong> - QA não é fase separada</li><br><li><strong>Comunicação</strong> - Time completo é responsável</li><br><li><strong>Automação</strong> - Habilita velocidade</li><br><li><strong>Métricas</strong> - Medir para melhorar</li><br><li><strong>Melhoria</strong> - Retrospectivas e adaptação</li></ol></p>', 'Metodologias Ágeis e QA: Scrum, Kanban e XP na Prática', '', 'publish', 'closed', 'open', '', '19agileqa', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/19agileqa/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('196', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda a testar bancos de dados: consultas SQL, integridade de dados, migrations, performance e testes de integração com banco de dados.</p>\n\n<hr>\n<h2>Introdução aos Testes de Banco de Dados</h2>\n\n<p>Testar banco de dados é essencial para garantir que dados são armazenados, recuperados e manipulados corretamente. Inclui testes de schema, queries, migrations e performance.</p>\n\n<h3>Por Que Testar Banco de Dados?</h3>\n\n<ul><li>Garantir integridade de dados</li><ol><li>Validar constraints e triggers</li>\n<li>Verificar performance de queries</li>\n<li>Proteger contra regressions</li>\n<li>Validar migrations</li></ol></ul>\n\n<hr>\n<h2>Tipos de Testes de Banco de Dados</h2>\n\n<h3>1. Testes de Schema</h3>\n\n<pre><code># Testes de Schema\ndef test_schema_has_required_tables(postgres):\n    \"\"\"Verifica que tabelas existem\"\"\"\n    result = postgres.run(\"\"\"\n        SELECT table_name \n        FROM information_schema.tables \n        WHERE table_schema = \'public\'\n    \"\"\")\n\n<p>tables = [row[0] for row in result.fetchall()]</p>\n\n<p>assert \'users\' in tables<br>    assert \'products\' in tables<br>    assert \'orders\' in tables</p>\n\n<p>def test_users_table_columns(postgres):<br>    \"\"\"Verifica colunas da tabela users\"\"\"<br>    result = postgres.run(\"\"\"<br>        SELECT column_name, data_type, is_nullable<br>        FROM information_schema.columns<br>        WHERE table_name = \'users\'<br>        ORDER BY ordinal_position<br>    \"\"\")</p>\n\n<p>columns = {row[0]: {\'type\': row[1], \'nullable\': row[2]} <br>               for row in result.fetchall()}</p>\n\n<p>assert \'id\' in columns<br>    assert columns[\'id\'][\'type\'] == \'integer\'<br>    assert \'email\' in columns<br>    assert columns[\'email\'][\'is_nullable\'] == \'NO\'</p>\n\n<p>def test_primary_keys(postgres):<br>    \"\"\"Verifica primary keys\"\"\"<br>    result = postgres.run(\"\"\"<br>        SELECT tc.table_name, kcu.column_name<br>        FROM information_schema.table_constraints tc<br>        JOIN information_schema.key_column_usage kcu<br>            ON tc.constraint_name = kcu.constraint_name<br>        WHERE tc.constraint_type = \'PRIMARY KEY\'<br>    \"\"\")</p>\n\n<p>primary_keys = {row[0]: row[1] for row in result.fetchall()}</p>\n\n<p>assert primary_keys[\'users\'] == \'id\'<br>    assert primary_keys[\'products\'] == \'id\'<br></code></pre></p>\n\n<h3>2. Testes de Constraints</h3>\n\n<pre><code>def test_unique_constraint_email(postgres):\n    \"\"\"Email deve ser único\"\"\"\n    # Insert primeiro usuário\n    postgres.run(\"\"\"\n        INSERT INTO users (name, email, password)\n        VALUES (\'User 1\', \'test@example.com\', \'hash\')\n    \"\"\")\n\n<p># Tentar inserir email duplicado<br>    with pytest.raises(Exception) as exc:<br>        postgres.run(\"\"\"<br>            INSERT INTO users (name, email, password)<br>            VALUES (\'User 2\', \'test@example.com\', \'hash2\')<br>        \"\"\")</p>\n\n<p>assert \'unique constraint\' in str(exc.value).lower()</p>\n\n<p>def test_foreign_key_constraint(postgres):<br>    \"\"\"Order deve referenciar user válido\"\"\"<br>    with pytest.raises(Exception):<br>        postgres.run(\"\"\"<br>            INSERT INTO orders (user_id, total)<br>            VALUES (99999, 100.00)  # user_id não existe<br>        \"\"\")</p>\n\n<p>def test_check_constraint(postgres):<br>    \"\"\"Preço deve ser positivo\"\"\"<br>    with pytest.raises(Exception):<br>        postgres.run(\"\"\"<br>            INSERT INTO products (name, price)<br>            VALUES (\'Invalid Product\', -10.00)<br>        \"\"\")</p>\n\n<p>def test_not_null_constraint(postgres):<br>    \"\"\"Nome do usuário não pode ser nulo\"\"\"<br>    with pytest.raises(Exception):<br>        postgres.run(\"\"\"<br>            INSERT INTO users (email, password)<br>            VALUES (\'test@example.com\', \'hash\')<br>        \"\"\")<br></code></pre></p>\n\n<h3>3. Testes de Queries</h3>\n\n<pre><code>def test_select_users_by_email(postgres):\n    \"\"\"Busca usuário por email\"\"\"\n    # Setup\n    postgres.run(\"\"\"\n        INSERT INTO users (name, email, password)\n        VALUES (\'João Silva\', \'joao@example.com\', \'hash\')\n    \"\"\")\n\n<p># Execute<br>    result = postgres.run(\"\"\"<br>        SELECT name, email <br>        FROM users <br>        WHERE email = \'joao@example.com\'<br>    \"\"\")</p>\n\n<p># Assert<br>    assert len(result.fetchall()) == 1<br>    row = result.fetchone()<br>    assert row[0] == \'João Silva\'<br>    assert row[1] == \'joao@example.com\'</p>\n\n<p>def test_join_orders_with_users(postgres):<br>    \"\"\"Join orders com users\"\"\"<br>    # Setup<br>    user_id = insert_user(postgres, \'João\', \'joao@example.com\')<br>    insert_order(postgres, user_id, 100.00)</p>\n\n<p># Execute<br>    result = postgres.run(\"\"\"<br>        SELECT u.name, u.email, o.total<br>        FROM users u<br>        JOIN orders o ON u.id = o.user_id<br>        WHERE u.id = :user_id<br>    \"\"\", {\'user_id\': user_id})</p>\n\n<p>row = result.fetchone()<br>    assert row[0] == \'João\'<br>    assert row[2] == 100.00</p>\n\n<p>def test_aggregate_query(postgres):<br>    \"\"\"Query com agregação\"\"\"<br>    # Setup<br>    user_id = insert_user(postgres, \'João\', \'joao@example.com\')<br>    insert_order(postgres, user_id, 100.00)<br>    insert_order(postgres, user_id, 200.00)</p>\n\n<p># Execute<br>    result = postgres.run(\"\"\"<br>        SELECT SUM(total) as total_sum, COUNT(*) as order_count<br>        FROM orders<br>        WHERE user_id = :user_id<br>    \"\"\", {\'user_id\': user_id})</p>\n\n<p>row = result.fetchone()<br>    assert row[0] == 300.00<br>    assert row[1] == 2<br></code></pre></p>\n\n<h3>4. Testes de Migrations</h3>\n\n<pre><code>import subprocess\nimport os\n\n<p>def test_migration_up(postgres):<br>    \"\"\"Executa migration up\"\"\"<br>    result = subprocess.run(<br>        [\'python\', \'manage.py\', \'migrate\'],<br>        capture_output=True,<br>        text=True<br>    )</p>\n\n<p>assert result.returncode == 0<br>    assert \'Migration complete\' in result.stdout or \'No migrations to apply\' in result.stdout</p>\n\n<p>def test_migration_down(postgres):<br>    \"\"\"Rollback migration\"\"\"<br>    migration_name = \'add_phone_to_users\'</p>\n\n<p># Rollback<br>    result = subprocess.run(<br>        [\'python\', \'manage.py\', \'migrate\', migration_name, \'down\'],<br>        capture_output=True,<br>        text=True<br>    )</p>\n\n<p>assert result.returncode == 0</p>\n\n<p># Verificar que coluna foi removida<br>    result = postgres.run(\"\"\"<br>        SELECT column_name <br>        FROM information_schema.columns <br>        WHERE table_name = \'users\' AND column_name = \'phone\'<br>    \"\"\")</p>\n\n<p>assert len(result.fetchall()) == 0</p>\n\n<p>def test_data_integrity_after_migration(postgres):<br>    \"\"\"Verifica integridade após migration\"\"\"<br>    # Setup data<br>    postgres.run(\"\"\"<br>        INSERT INTO users (name, email, password)<br>        VALUES (\'Test\', \'test@example.com\', \'hash\')<br>    \"\"\")</p>\n\n<p># Run migration<br>    subprocess.run([\'python\', \'manage.py\', \'migrate\'], check=True)</p>\n\n<p># Verify data intact<br>    result = postgres.run(\"\"\"<br>        SELECT COUNT(*) FROM users WHERE email = \'test@example.com\'<br>    \"\"\")</p>\n\n<p>assert result.fetchone()[0] == 1<br></code></pre></p>\n\n<hr>\n<h2>TestContainers para Testes de DB</h2>\n\n<pre><code># conftest.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\n\n<p>@pytest.fixture(scope=\'session\')<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as pg:<br>        # Setup schema<br>        db_url = pg.get_connection_url()</p>\n\n<p># Run migrations<br>        subprocess.run([\'python\', \'manage.py\', \'migrate\'], check=True)</p>\n\n<p>yield pg</p>\n\n<p># Teardown</p>\n\n<p>@pytest.fixture<br>def clean_db(postgres):<br>    \"\"\"Limpa dados antes de cada teste\"\"\"<br>    db = psycopg2.connect(postgres.get_connection_url())<br>    cursor = db.cursor()</p>\n\n<p># Disable triggers para speed<br>    cursor.execute(\"SET session_replication_role = \'replica\'\")</p>\n\n<p># Truncate tables (exceto immutable)<br>    cursor.execute(\"\"\"<br>        TRUNCATE TABLE orders, users, products CASCADE<br>    \"\"\")</p>\n\n<p>db.commit()<br>    cursor.close()<br>    db.close()</p>\n\n<p>yield</p>\n\n<p>@pytest.fixture<br>def sample_data(postgres, clean_db):<br>    \"\"\"Popula dados de exemplo\"\"\"<br>    db = psycopg2.connect(postgres.get_connection_url())<br>    cursor = db.cursor()</p>\n\n<p># Insert users<br>    cursor.execute(\"\"\"<br>        INSERT INTO users (name, email, password)<br>        VALUES <br>            (\'User 1\', \'user1@example.com\', \'hash1\'),<br>            (\'User 2\', \'user2@example.com\', \'hash2\')<br>        RETURNING id<br>    \"\"\")<br>    user_ids = [row[0] for row in cursor.fetchall()]</p>\n\n<p># Insert products<br>    cursor.execute(\"\"\"<br>        INSERT INTO products (name, price, stock)<br>        VALUES <br>            (\'Product A\', 10.00, 100),<br>            (\'Product B\', 20.00, 50)<br>        RETURNING id<br>    \"\"\")<br>    product_ids = [row[0] for row in cursor.fetchall()]</p>\n\n<p>db.commit()<br>    cursor.close()<br>    db.close()</p>\n\n<p>yield {<br>        \'user_ids\': user_ids,<br>        \'product_ids\': product_ids<br>    }<br></code></pre></p>\n\n<hr>\n<h2>Testes de NoSQL</h2>\n\n<h3>MongoDB</h3>\n\n<pre><code>from pymongo import MongoClient\nfrom datetime import datetime\n\n<p>@pytest.fixture<br>def mongodb():<br>    with MongoDBContainer(\"mongo:7\") as mongo:<br>        client = MongoClient(mongo.get_connection_url())<br>        yield client[\'testdb\']<br>        client.close()</p>\n\n<p>def test_mongodb_insert(mongodb):<br>    \"\"\"Insere e busca documento\"\"\"<br>    result = mongodb.users.insert_one({<br>        \'name\': \'João\',<br>        \'email\': \'joao@example.com\',<br>        \'created_at\': datetime.now()<br>    })</p>\n\n<p>assert result.inserted_id is not None</p>\n\n<p>found = mongodb.users.find_one({\'email\': \'joao@example.com\'})<br>    assert found[\'name\'] == \'João\'</p>\n\n<p>def test_mongodb_aggregation(mongodb):<br>    \"\"\"Testa aggregation pipeline\"\"\"<br>    # Insert orders<br>    mongodb.orders.insert_many([<br>        {\'user_id\': 1, \'total\': 100, \'status\': \'completed\'},<br>        {\'user_id\': 1, \'total\': 200, \'status\': \'completed\'},<br>        {\'user_id\': 2, \'total\': 50, \'status\': \'pending\'},<br>    ])</p>\n\n<p>pipeline = [<br>        {\'$match\': {\'status\': \'completed\'}},<br>        {\'$group\': {\'_id\': \'$user_id\', \'total\': {\'$sum\': \'$total\'}}}<br>    ]</p>\n\n<p>results = list(mongodb.orders.aggregate(pipeline))</p>\n\n<p>assert len(results) == 1<br>    assert results[0][\'total\'] == 300<br></code></pre></p>\n\n<h3>Redis</h3>\n\n<pre><code>import redis\n\n<p>@pytest.fixture<br>def redis_client():<br>    with RedisContainer(\"redis:7\") as redis:<br>        client = redis.get_connection_url(client_class=redis.Redis)<br>        yield client</p>\n\n<p>def test_redis_cache(redis_client):<br>    \"\"\"Testa caching com Redis\"\"\"<br>    # Set value<br>    redis_client.setex(\'user:1:name\', 3600, \'João\')</p>\n\n<p># Get value<br>    name = redis_client.get(\'user:1:name\')</p>\n\n<p>assert name == \'João\'</p>\n\n<p>def test_redis_sorted_set(redis_client):<br>    \"\"\"Testa sorted set para ranking\"\"\"<br>    # Add scores<br>    redis_client.zadd(\'leaderboard\', {\'user1\': 100, \'user2\': 200, \'user3\': 150})</p>\n\n<p># Get top 3<br>    top = redis_client.zrevrange(\'leaderboard\', 0, 2, withscores=True)</p>\n\n<p>assert top[0][0] == \'user2\'<br>    assert top[0][1] == 200<br>    assert len(top) == 3<br></code></pre></p>\n\n<hr>\n<h2>Performance Testing de Queries</h2>\n\n<pre><code>import time\n\n<p>def test_query_performance(postgres, sample_data):<br>    \"\"\"Verifica que query executa em menos de 100ms\"\"\"<br>    start = time.time()</p>\n\n<p>result = postgres.run(\"\"\"<br>        SELECT u.name, COUNT(o.id) as order_count, SUM(o.total) as total<br>        FROM users u<br>        LEFT JOIN orders o ON u.id = o.user_id<br>        GROUP BY u.id<br>        ORDER BY total DESC<br>        LIMIT 100<br>    \"\"\")</p>\n\n<p>elapsed = (time.time() - start) * 1000  # ms</p>\n\n<p>assert elapsed &lt; 100, f&quot;Query took {elapsed}ms, expected &lt; 100ms&quot;</p>\n\n<p># Log para monitoramento<br>    print(f\"Query executed in {elapsed}ms\")</p>\n\n<p>def test_index_usage(postgres):<br>    \"\"\"Verifica que índice está sendo usado\"\"\"<br>    result = postgres.run(\"\"\"<br>        EXPLAIN ANALYZE<br>        SELECT * FROM users WHERE email = \'test@example.com\'<br>    \"\"\")</p>\n\n<p>explain_output = result.fetchall()<br>    explain_text = \' \'.join([row[0] for row in explain_output])</p>\n\n<p>assert \'Index Scan\' in explain_text or \'Bitmap Index Scan\' in explain_text<br>    assert \'Seq Scan\' not in explain_text  # Bad!<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testar banco de dados é crucial para garantir integridade, performance e confiabilidade dos dados. As chaves são:<br><ol><li><strong>Testar schema</strong> - Valide estrutura</li><br><li><strong>Testar constraints</strong> - Garanta regras de negócio</li><br><li><strong>Testar queries</strong> - Verifique funcionalidade</li><br><li><strong>Testar migrations</strong> - Previna regressions</li><br><li><strong>Testar performance</strong> - Queries devem ser rápidas</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Usar TestContainers em vez de DB real?</strong>  <br>R: Sim! TestContainers oferece DB isolado, descartável e rápido para testes.</p>\n\n<p><strong>P: Como testar migrations?</strong>  <br>R: Teste UP e DOWN, verifice integridade de dados após migration.</p>\n\n<p><strong>P: Mock vs DB real para testes?</strong>  <br>R: DB real para queries complexas e joins. Mock para unit tests isolados.</p>', 'Testes de Banco de Dados: SQL, NoSQL e Data Integrity', '', 'publish', 'closed', 'open', '', '20testesbancodados', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/20testesbancodados/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('197', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda a implementar testes de integração eficazes: APIs, serviços, bancos de dados e microsserviços. Guia completo com estratégias e exemplos práticos.</p>\n\n<hr>\n<h2>O Que São Testes de Integração?</h2>\n\n<p>Testes de integração verificam que diferentes módulos ou serviços funcionam corretamente quando combinados. São o meio termo entre unit tests (testam unidades isoladas) e E2E tests (testam sistema completo).</p>\n\n<h3>Quando Usar Testes de Integração</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Situação</th><th>Teste Recomendado</th></tr>\n<tr><td>Testar uma função isolada</td><td>Unit</td></tr>\n<tr><td>Testar integração API ↔ Database</td><td>Integração</td></tr>\n<tr><td>Testar múltiplos serviços juntos</td><td>Integração</td></tr>\n<tr><td>Testar fluxo completo do usuário</td><td>E2E</td></tr>\n<tr><td>Testar sistema inteiro em produção-like</td><td>Sistema</td></tr>\n</table></figure>\n\n<hr>\n<h2>Tipos de Testes de Integração</h2>\n\n<h3>1. Testes de Integração de APIs</h3>\n\n<pre><code># test_integration_api.py\nimport requests\nimport pytest\n\n<p>class TestOrderAPI:</p>\n\n<p>@pytest.fixture(autouse=True)<br>    def setup(self):<br>        self.base_url = \"http://localhost:8000/api/v1\"<br>        self.session = requests.Session()</p>\n\n<p># Setup: criar usuário de teste<br>        response = self.session.post(f\"{self.base_url}/users\", json={<br>            \"name\": \"Test User\",<br>            \"email\": f\"test_{uuid.uuid4()}@example.com\",<br>            \"password\": \"testpass123\"<br>        })<br>        self.user_id = response.json()[\"id\"]<br>        self.token = response.json()[\"token\"]<br>        self.session.headers.update({\"Authorization\": f\"Bearer {self.token}\"})</p>\n\n<p>def test_create_order_flow(self):<br>        \"\"\"Testa fluxo completo: criar usuário -&gt; adicionar produto -&gt; fazer pedido\"\"\"</p>\n\n<p># 1. Listar produtos<br>        products_response = self.session.get(f\"{self.base_url}/products\")<br>        assert products_response.status_code == 200<br>        products = products_response.json()[\"items\"]<br>        product_id = products[0][\"id\"]</p>\n\n<p># 2. Adicionar ao carrinho<br>        cart_response = self.session.post(f\"{self.base_url}/cart/items\", json={<br>            \"product_id\": product_id,<br>            \"quantity\": 2<br>        })<br>        assert cart_response.status_code == 201</p>\n\n<p># 3. Verificar carrinho<br>        cart = self.session.get(f\"{self.base_url}/cart\").json()<br>        assert len(cart[\"items\"]) == 1<br>        assert cart[\"items\"][0][\"quantity\"] == 2</p>\n\n<p># 4. Criar pedido<br>        order_response = self.session.post(f\"{self.base_url}/orders\", json={<br>            \"shipping_address\": \"Rua Teste, 123\",<br>            \"payment_method\": \"credit_card\"<br>        })<br>        assert order_response.status_code == 201<br>        order = order_response.json()</p>\n\n<p># 5. Verificar pedido criado<br>        assert order[\"status\"] == \"pending\"<br>        assert order[\"total\"] == products[0][\"price\"] * 2<br></code></pre></p>\n\n<h3>2. Testes de Integração com Banco de Dados</h3>\n\n<pre><code># test_integration_database.py\nimport psycopg2\nfrom decimal import Decimal\n\n<p>@pytest.fixture<br>def db_connection():<br>    connection = psycopg2.connect(<br>        host=\"localhost\",<br>        database=\"testdb\",<br>        user=\"test\",<br>        password=\"test\"<br>    )<br>    yield connection<br>    connection.close()</p>\n\n<p>@pytest.fixture<br>def clean_db(db_connection):<br>    \"\"\"Limpa tabelas antes de cada teste\"\"\"<br>    cursor = db_connection.cursor()</p>\n\n<p>cursor.execute(\"\"\"<br>        TRUNCATE TABLE orders, cart_items, products, users<br>        RESTART IDENTITY CASCADE<br>    \"\"\")<br>    db_connection.commit()<br>    cursor.close()</p>\n\n<p>yield db_connection</p>\n\n<p>def test_user_order_integration(clean_db):<br>    \"\"\"Testa integração usuário -&gt; pedido\"\"\"<br>    cursor = clean_db.cursor()</p>\n\n<p># 1. Criar usuário<br>    cursor.execute(\"\"\"<br>        INSERT INTO users (name, email, password_hash)<br>        VALUES ({6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s)<br>        RETURNING id<br>    \"\"\", (\"João\", \"joao@example.com\", \"hash123\"))<br>    user_id = cursor.fetchone()[0]</p>\n\n<p># 2. Criar produto<br>    cursor.execute(\"\"\"<br>        INSERT INTO products (name, price, stock)<br>        VALUES ({6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s)<br>        RETURNING id<br>    \"\"\", (\"Camiseta\", Decimal(\"49.90\"), 100))<br>    product_id = cursor.fetchone()[0]</p>\n\n<p># 3. Criar pedido<br>    cursor.execute(\"\"\"<br>        INSERT INTO orders (user_id, total, status)<br>        VALUES ({6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s)<br>        RETURNING id<br>    \"\"\", (user_id, Decimal(\"49.90\"), \"pending\"))<br>    order_id = cursor.fetchone()[0]</p>\n\n<p># 4. Verificar integridade<br>    cursor.execute(\"\"\"<br>        SELECT u.name, o.id, o.total<br>        FROM users u<br>        JOIN orders o ON u.id = o.user_id<br>        WHERE u.id = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s<br>    \"\"\", (user_id,))</p>\n\n<p>result = cursor.fetchone()<br>    assert result[0] == \"João\"<br>    assert result[1] == order_id<br>    assert result[2] == Decimal(\"49.90\")</p>\n\n<p>clean_db.commit()</p>\n\n<p>def test_product_inventory_update(clean_db):<br>    \"\"\"Testa que estoque é decrementado\"\"\"<br>    cursor = clean_db.cursor()</p>\n\n<p># Setup: criar produto com estoque 10<br>    cursor.execute(\"\"\"<br>        INSERT INTO products (name, price, stock)<br>        VALUES ({6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s)<br>        RETURNING id<br>    \"\"\", (\"Tênis\", Decimal(\"199.90\"), 10))<br>    product_id = cursor.fetchone()[0]</p>\n\n<p># Action: decrementar estoque (simula venda)<br>    cursor.execute(\"\"\"<br>        UPDATE products <br>        SET stock = stock - 2<br>        WHERE id = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s<br>    \"\"\", (product_id,))</p>\n\n<p># Assert: estoque correto<br>    cursor.execute(\"SELECT stock FROM products WHERE id = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s\", (product_id,))<br>    assert cursor.fetchone()[0] == 8<br></code></pre></p>\n\n<h3>3. Testes de Microsserviços</h3>\n\n<pre><code># test_integration_microservices.py\nimport requests\nfrom unittest.mock import patch, Mock\n\n<p>class TestOrderServiceIntegration:<br>    \"\"\"Testa integração entre Order Service e Payment/Gateway Service\"\"\"</p>\n\n<p>@pytest.fixture<br>    def mock_payment_gateway(self):<br>        \"\"\"Mock do serviço de pagamento\"\"\"<br>        with patch(\'services.payment_gateway.requests.post\') as mock:<br>            mock.return_value = Mock(<br>                status_code=200,<br>                json=lambda: {<br>                    \"transaction_id\": \"tx_123\",<br>                    \"status\": \"approved\",<br>                    \"amount\": 99.90<br>                }<br>            )<br>            yield mock</p>\n\n<p>def test_order_with_payment(self, mock_payment_gateway):<br>        \"\"\"Testa que pedido processa corretamente com pagamento\"\"\"<br>        # Call order service<br>        response = requests.post(<br>            \"http://localhost:8001/api/orders\",<br>            json={<br>                \"user_id\": 1,<br>                \"items\": [{\"product_id\": 1, \"quantity\": 1}],<br>                \"payment\": {<br>                    \"method\": \"credit_card\",<br>                    \"card_token\": \"tok_test\"<br>                }<br>            }<br>        )</p>\n\n<p>assert response.status_code == 201<br>        order = response.json()</p>\n\n<p># Verifica que pagamento foi chamado<br>        mock_payment_gateway.assert_called_once()</p>\n\n<p># Verifica resultado<br>        assert order[\"status\"] == \"confirmed\"<br>        assert \"transaction_id\" in order[\"payment\"]</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def service_containers():<br>    \"\"\"Start containers para serviços reais\"\"\"<br>    containers = {<br>        \'user_service\': start_container(\'user-service:latest\'),<br>        \'product_service\': start_container(\'product-service:latest\'),<br>        \'order_service\': start_container(\'order-service:latest\'),<br>    }</p>\n\n<p>wait_for_services(containers)</p>\n\n<p>yield containers</p>\n\n<p>stop_containers(containers)<br></code></pre></p>\n\n<h3>4. Testes de Contrato (Consumer-Driven)</h3>\n\n<pre><code># test_contract_consumer.py\nfrom pact import Consumer, Provider\n\n<p>def test_consumer_driven_contract():<br>    \"\"\"Testa contrato definido pelo consumer\"\"\"</p>\n\n<p>pact = Consumer(\'OrderService\').has_pact_with(<br>        Provider(\'ProductService\')<br>    )<br>    pact.start_service()</p>\n\n<p>try:<br>        (pact<br>         .given(\'product with id 1 exists\')<br>         .upon_receiving(\'a request for product details\')<br>         .with_request(\'GET\', \'/products/1\')<br>         .will_respond_with(200, body={<br>             \'id\': 1,<br>             \'name\': \'Test Product\',<br>             \'price\': 99.99,<br>             \'in_stock\': True<br>         })<br>         .with_request(\'GET\', \'/products/999\')<br>         .will_respond_with(404, body={<br>             \'error\': \'Product not found\'<br>         })<br>         .verify())<br>    finally:<br>        pact.stop_service()<br></code></pre></p>\n\n<hr>\n<h2>TestContainers para Integração</h2>\n\n<pre><code># conftest.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\n\n<p>@pytest.fixture(scope=\"module\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as pg:<br>        # Run migrations<br>        run_migrations(pg.get_connection_url())<br>        yield pg</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def redis():<br>    with RedisContainer(\"redis:7\") as rd:<br>        yield rd</p>\n\n<p>@pytest.fixture<br>def integration_app(postgres, redis):<br>    \"\"\"Aplica com todas dependências\"\"\"<br>    app = create_app(<br>        database_url=postgres.get_connection_url(),<br>        redis_url=redis.get_connection_url()<br>    )<br>    app.config[\'TESTING\'] = True</p>\n\n<p>with app.app_context():<br>        yield app</p>\n\n<p>@pytest.fixture<br>def clean_data(postgres):<br>    \"\"\"Limpa dados entre testes\"\"\"<br>    cursor = postgres.get_connection().cursor()<br>    cursor.execute(\"\"\"<br>        TRUNCATE TABLE orders, users, products, sessions<br>        RESTART IDENTITY CASCADE<br>    \"\"\")<br>    postgres.get_connection().commit()<br>    cursor.close()</p>\n\n<p>yield postgres<br></code></pre></p>\n\n<hr>\n<h2>Testes de Integração de Mensageria</h2>\n\n<pre><code># test_integration_messaging.py\nimport pika\nimport json\n\n<p>@pytest.fixture<br>def rabbitmq():<br>    with RabbitMQContainer(\"rabbitmq:3\") as rmq:<br>        yield rmq</p>\n\n<p>def test_message_publishing(rabbitmq):<br>    \"\"\"Testa publicação e consumo de mensagens\"\"\"<br>    connection = pika.BlockingConnection(<br>        pika.URLParameters(rabbitmq.get_connection_url())<br>    )<br>    channel = connection.channel()</p>\n\n<p># Declare queue<br>    channel.queue_declare(queue=\'order_events\', durable=True)</p>\n\n<p># Publish message<br>    message = {<br>        \'event\': \'order_created\',<br>        \'order_id\': 123,<br>        \'user_id\': 456,<br>        \'total\': 99.90<br>    }<br>    channel.basic_publish(<br>        exchange=\'\',<br>        routing_key=\'order_events\',<br>        body=json.dumps(message)<br>    )</p>\n\n<p># Consume message<br>    method, properties, body = channel.basic_get(queue=\'order_events\')<br>    received = json.loads(body)</p>\n\n<p>assert received[\'event\'] == \'order_created\'<br>    assert received[\'order_id\'] == 123</p>\n\n<p>connection.close()<br></code></pre></p>\n\n<hr>\n<h2>Estratégias de Integração</h2>\n\n<h3>Bottom-Up</h3>\n\n<pre><code>[DAL] → [BLL] → [API]\n  ↓\n testes de unidade\n</code></pre>\n\n<h3>Top-Down</h3>\n\n<pre><code>[UI] → [API] → [Services]\n  ↑\n stubs\n</code></pre>\n\n<h3>Sandwich</h3>\n\n<pre><code>[UI] → [API] → [Services] → [DAL]\n   ↑          ↓\n  stubs       drivers\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de integração são essenciais para garantir que componentes funcionam juntos. As chaves são:<br><ol><li><strong>Selecionar escopo adequado</strong> - Nem demais, nem de menos</li><br><li><strong>Usar TestContainers</strong> - Isolamento e repeatability</li><br><li><strong>Testar contratos</strong> - Consumer-driven para microservices</li><br><li><strong>Manter dados limpos</strong> - Setup e teardown</li><br><li><strong>Executar frequentemente</strong> - CI/CD integrado</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Quantos testes de integração devo ter?</strong>  <br>R: Cobertura adequada das interfaces críticas. Priorize integrações com maior risco.</p>\n\n<p><strong>P: Testes de integração são lentos?</strong>  <br>R: Sim, mas TestContainers e paralelização ajudam. Priorize velocidade.</p>\n\n<p><strong>P: Usar mocks ou serviços reais?</strong>  <br>R: Mocks para dependências externas lentas/indisponíveis. Reais para DB e cache locais.</p>', 'Testes de Integração: Conectando Componentes', '', 'publish', 'closed', 'open', '', '21testesintegracao', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/21testesintegracao/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('198', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda mutation testing: técnica avançada para avaliar e melhorar a qualidade dos testes unitários. Ferramentas e implementação prática.</p>\n\n<hr>\n<h2>O Que é Mutation Testing?</h2>\n\n<p>Mutation testing é uma técnica que avalia a qualidade dos testes unitários introduzindo pequenas mudanças (mutações) no código-fonte e verificando se os testes detectam essas mudanças.</p>\n\n<h3>Analogia</h3>\n\n<pre><code>Código Original: if (age &gt;= 18) → permitido\nMutação 1: if (age &gt; 18) → ainda passa? Bug!\nMutação 2: if (age &gt;= 0) → ainda passa? Bug!\n</code></pre>\n\n<p>Se seus testes passam mesmo com mutações, eles não estão realmente testando o código.</p>\n\n<hr>\n<h2>Por Que Mutation Testing?</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Com Coverage Tradicional</th><th>Com Mutation Testing</th></tr>\n<tr><td><strong>O que mede</strong></td><td>Linhas executadas</td><td>Testes que detectam bugs</td></tr>\n<tr><td><strong>Confiança</strong></td><td>Baixa</td><td>Alta</td></tr>\n<tr><td><strong>Bug detection</strong></td><td>Não verifica</td><td>Verifica</td></tr>\n</table></figure>\n\n<h3>Como Funciona</h3>\n<ol><li><strong>Generate Mutations</strong>: Criar variantes do código</li>\n<li><strong>Run Tests</strong>: Executar suite contra cada mutante</li>\n<li><strong>Classify Results</strong>: Identificar se mutante foi \"matado\"</li>\n<li><strong>Calculate Score</strong>: {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de mutantes mortos</li>\n</ol>\n<hr>\n<h2>Tipos de Mutações</h2>\n\n<h3>Arithmetic Mutations</h3>\n\n<pre><code># Original\nresult = a + b\n\n<p># Mutations<br>result = a - b    # +<br>result = a * b    # +<br>result = a / b    # +<br>result = a ** b   # +<br>result = a {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} b    # +<br></code></pre></p>\n\n<h3>Relational Mutations</h3>\n\n<pre><code># Original\nif (x &gt; 10)\n\n<p># Mutations<br>if (x &gt;= 10)    # &gt;<br>if (x <br>if (x <br>if (x == 10)    # &gt;<br>if (x != 10)    # &gt;<br></code></pre></p>\n\n<h3>Logical Mutations</h3>\n\n<pre><code># Original\nif (is_valid and has_permission)\n\n<p># Mutations<br>if (is_valid or has_permission)      # and → or<br>if (not is_valid and has_permission) # negação<br>if (is_valid and not has_permission) # negação<br></code></pre></p>\n\n<h3>Conditional Boundary</h3>\n\n<pre><code># Original\nwhile (count &lt; 100)\n\n<p># Mutations<br>while (count &lt;= 100)    # &lt; → &lt;=<br>while (count &gt; 100)     # <br></code></pre></p>\n\n<hr>\n<h2>Ferramentas de Mutation Testing</h2>\n\n<h3>Para Diferentes Linguagens</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Ferramentas</th></tr>\n<tr><td><strong>Python</strong></td><td>mutmut, Cosmic Ray, mutatest</td></tr>\n<tr><td><strong>Java</strong></td><td>PITest (pitest)</td></tr>\n<tr><td><strong>JavaScript</strong></td><td>Stryker Mutator</td></tr>\n<tr><td><strong>C#</strong></td><td>NinjaTurtles, Pitest.NET</td></tr>\n<tr><td><strong>Ruby</strong></td><td>Mutant</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementação Prática</h2>\n\n<h3>Python com mutmut</h3>\n\n<pre><code># Instalação\npip install mutmut\n\n<p># Configuração (pyproject.toml ou .mutmut.toml)<br>[mutmut]<br>paths_to_mutate = src/<br>test_command = pytest -x<br>backup_command = git checkout<br></code></pre></p>\n\n<pre><code># Executar mutation testing\nmutmut run\n\n<p># Ver resultados<br>mutmut results</p>\n\n<p># Mostrar mutants sobrevientes<br>mutmut show survived<br></code></pre></p>\n\n<pre><code># Exemplo: Código a ser testado\n# src/calculator.py\ndef calcular_desconto(valor: float, percentual: float) -&gt; float:\n    \"\"\"Aplica desconto percentual a um valor.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual não pode exceder 100\")\n\n<p>desconto = valor * (percentual / 100)<br>    return valor - desconto</p>\n\n<p># src/test_calculator.py<br>import pytest<br>from calculator import calcular_desconto</p>\n\n<p>def test_desconto_basico():<br>    \"\"\"Testa desconto simples de 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\"\"<br>    assert calcular_desconto(100, 10) == 90.0</p>\n\n<p>def test_desconto_zero():<br>    \"\"\"Testa que desconto de 0{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} mantém valor\"\"\"<br>    assert calcular_desconto(100, 0) == 100.0</p>\n\n<p>def test_desconto_100_porcento():<br>    \"\"\"Testa que desconto de 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} retorna 0\"\"\"<br>    assert calcular_desconto(100, 100) == 0.0</p>\n\n<p>def test_desconto_negativo_deve_falhar():<br>    \"\"\"Desconto negativo deve lançar erro\"\"\"<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, -10)</p>\n\n<p>def test_desconto_acima_100_deve_falhar():<br>    \"\"\"Desconto acima de 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} deve lançar erro\"\"\"<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 110)<br></code></pre></p>\n\n<h3>Java com PITest</h3>\n\n<pre><code><!-- pom.xml -->\n\n    org.pitest\n    pitest-maven\n    1.15.8\n    \n        \n            org.pitest\n            pitest-junit5-plugin\n            1.15.8\n        \n    \n    \n        \n            com.example.*\n        \n        \n            com.example.*Test\n        \n    \n\n</code></pre>\n\n<pre><code># Executar\nmvn org.pitest:pitest-maven:mutationCoverage\n</code></pre>\n\n<h3>JavaScript com Stryker</h3>\n\n<pre><code># Instalação\nnpm install -D @stryker-mutator/core\n\n<p># Configuração (stryker.conf.js)<br>module.exports = {<br>  testRunner: \'jest\',<br>  mutate: [\'src/<em>*/</em>.js\'],<br>  reporters: [\'html\', \'clear-text\'],<br>  jest: {<br>    projectType: \'react\'<br>  }<br>}<br></code></pre></p>\n\n<pre><code># Executar\nnpx stryker run\n</code></pre>\n\n<hr>\n<h2>Interpretando Resultados</h2>\n\n<h3>Score de Mutação</h3>\n\n<pre><code>Mutation Score = (Mutantes Mortos / Total de Mutantes) × 100\n\n<p>Interpretação:<br><ul><li>90-100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: Excelente (muitos bugs detectados)</li><ol><li>80-90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: Bom</li><br><li>60-80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: Precisa melhorar</li><br><li>&lt;60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: Suite fraca</li><br></ol></code></pre></p>\n\n<h3>Exemplo de Relatório</h3>\n\n<pre><code>=============== MUTATION TESTING ===============\n\n<p>Total Mutants: 25<br>Killed: 23<br>Survived: 2<br>Timeout: 0<br>Skipped: 0</p>\n\n<p>Score: 92{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</p>\n\n<p>=============== SURVIVING MUTANTS ===============<br><ol><li>src/calculator.py:32</li><br></ol>   - Changed &gt; to &gt;=<br>   - Still passes: test_desconto_100_porcento<br>   <ol><li>src/validator.py:45</li><br></ol>   - Changed &amp;&amp; to ||<br>   - Still passes: test_validate_multiple_conditions</p>\n\n<p>=============== RECOMMENDATIONS ===============<br><ol><li>Adicione teste para valor exatamente 18</li><br><li>Teste edge case para validação AND/OR</li></ol></ul><br></code></pre></p>\n\n<hr>\n<h2>Melhores Práticas</h2>\n\n<h3>1. Combine com Code Coverage</h3>\n\n<pre><code># Mutation testing complementa coverage\n# Coverage 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} não significa testes bons\n# Mutation testing revela gaps\n</code></pre>\n\n<h3>2. Priorize Módulos Críticos</h3>\n\n<pre><code># Execute mutation testing em módulos críticos\nmutmut run --paths src/payment/,src/auth/\n</code></pre>\n\n<h3>3. Corrija Mutantes Sobrevientes</h3>\n\n<pre><code># Mutante sobreviente indica teste fraco\ndef test_critical_path():\n    # Este teste não detecta mudança de &gt; para &gt;=\n    result = processar_idade(18)\n    assert result == \"adulto\"  # Passa mesmo com &gt;=\n\n<p># Adicione edge case<br>def test_critical_path_18_anos():<br>    result = processar_idade(18)<br>    assert result == \"adulto\"<br>    assert processar_idade(17) != \"adulto\"  # Detecta mudança &gt; para &gt;=<br></code></pre></p>\n\n<h3>4. Automatize no CI</h3>\n\n<pre><code># GitHub Actions\nname: Mutation Testing\n\n<p>on:<br>  schedule:<br>    - cron: \'0 2 <em> </em> 0\'  # Semanalmente</p>\n\n<p>jobs:<br>  mutation:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run mutation tests<br>        run: |<br>          pip install mutmut<br>          mutmut run --paths-to-mutate src/<br>          mutmut results</p>\n\n<p>- name: Check score<br>        run: |<br>          SCORE=$(mutmut results --only-result)<br>          if [ \"$SCORE\" -lt 80 ]; then<br>            echo \"Mutation score below 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: $SCORE\"<br>            exit 1<br>          fi<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Mutation testing é uma técnica poderosa para avaliar qualidade real dos testes. As chaves são:<br><ol><li><strong>Entender conceito</strong> - Muta código, verifica se testes detectam</li><br><li><strong>Usar ferramentas</strong> - mutmut, PITest, Stryker</li><br><li><strong>Interpretar resultados</strong> - Score alto = testes fortes</li><br><li><strong>Criar testes para mutantes sobrevientes</strong> - Melhoria contínua</li><br><li><strong>Automatizar</strong> - Execute regularmente no CI</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Mutation testing substitui coverage?</strong>  <br>R: Não. Coverage mostra linhas executadas; mutation mostra se testes detectam bugs.</p>\n\n<p><strong>P: É lento?</strong>  <br>R: Sim! Pode ser 10-100x mais lento que testes normais. Use CI/discrete.</p>\n\n<p><strong>P: Qual score é bom?</strong>  <br>R: 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}+ é bom, 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}+ é excelente.</p>\n\n<p><strong>P: Vale o esforço?</strong>  <br>R: Para código crítico, sim. Para código simples, talvez não.</p>', 'Mutation Testing: Melhorando a Qualidade dos Testes', '', 'publish', 'closed', 'open', '', '22mutationtesting', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/22mutationtesting/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('199', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda visual regression testing: screenshots comparison, ferramentas como Applitools, Percy e Cypress Percy. Como detectar mudanças visuais automaticamente.</p>\n\n<hr>\n<h2>O Que É Visual Regression Testing?</h2>\n\n<p>Visual regression testing captura screenshots de interfaces e os compara com baselines para detectar mudanças visuais não intencionais (regressões).</p>\n\n<h3>Por Que Importa?</h3>\n\n<ul><li>Detectar mudanças em CSS/HTML</li><ol><li>Prevenir \"pixel perfect\" regressions</li>\n<li>Garantir consistência cross-browser</li>\n<li>Automatizar verificação de design</li></ol></ul>\n\n<hr>\n<h2>Abordagens</h2>\n\n<h3>1. Pixel-to-Pixel Comparison</h3>\n\n<pre><code># Simple screenshot comparison\nimport PIL.Image\nimport numpy as np\n\n<p>def compare_images(baseline_path, current_path):<br>    baseline = PIL.Image.open(baseline_path)<br>    current = PIL.Image.open(current_path)</p>\n\n<p># Convert to numpy arrays<br>    baseline_array = np.array(baseline)<br>    current_array = np.array(current)</p>\n\n<p># Calculate difference<br>    diff = np.abs(baseline_array.astype(float) - current_array.astype(float))</p>\n\n<p># Count different pixels<br>    different_pixels = np.sum(diff &gt; 0)<br>    total_pixels = diff.size</p>\n\n<p>change_percentage = (different_pixels / total_pixels) * 100</p>\n\n<p>return {<br>        \'match\': change_percentage &lt; 0.1,  # Less than 0.1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} change<br>        \'change_percentage\': change_percentage,<br>        \'different_pixels\': different_pixels<br>    }<br></code></pre></p>\n\n<h3>2. DOM-based Comparison</h3>\n\n<pre><code>// Playwright com screenshot comparison\nconst { chromium } = require(\'playwright\');\n\n<p>async function compareScreenshots(page, url, selector) {<br>    // Baseline<br>    await page.goto(url);<br>    await page.waitForSelector(selector);<br>    const baseline = await page.locator(selector).screenshot();</p>\n\n<p>// Current<br>    await page.goto(url);<br>    await page.waitForSelector(selector);<br>    const current = await page.locator(selector).screenshot();</p>\n\n<p>// Compare<br>    return await page.evaluate(([b, c]) =&gt; {<br>        // Canvas comparison<br>        const canvas = document.createElement(\'canvas\');<br>        // ... comparison logic<br>    }, [baseline, current]);<br>}<br></code></pre></p>\n\n<hr>\n<h2>Ferramentas</h2>\n\n<h3>Applitools (Líder de Mercado)</h3>\n\n<pre><code># pytest + Applitools\nfrom applitools.selenium import Eyes, RunnerOptions\nfrom selenium import webdriver\n\n<p>@pytest.fixture<br>def eyes():<br>    eyes = Eyes(RunnerOptions().test_name(\"Login Page\"))<br>    eyes.api_key = \"YOUR_API_KEY\"<br>    eyes.force_full_page_screenshot = True<br>    yield eyes</p>\n\n<p>@pytest.fixture<br>def driver(eyes):<br>    driver = webdriver.Chrome()<br>    driver.get(\"https://example.com\")<br>    yield driver<br>    eyes.abort_async()<br>    driver.quit()</p>\n\n<p>def test_login_page_visual(driver, eyes):<br>    eyes.open(driver, \"MyApp\", \"Login Page Test\")<br>    driver.get(\"https://example.com/login\")<br>    eyes.check_window(\"Login Form\")<br>    eyes.close_async()<br></code></pre></p>\n\n<pre><code>// Java/Selenium + Applitools\nimport com.applitools.eyes.selenium.Eyes;\nimport org.openqa.selenium.WebDriver;\n\n<p>@ExtendWith(ApplitoolsFieldExtension.class)<br>class VisualTests {</p>\n\n<p>@Eyes<br>    Eyes eyes;</p>\n\n<p>@Test<br>    void loginPageTest(WebDriver driver) {<br>        driver.get(\"https://example.com/login\");<br>        eyes.checkWindow(\"Login Form\");</p>\n\n<p>// Fill form<br>        driver.findElement(By.id(\"email\")).sendKeys(\"test@example.com\");<br>        eyes.checkWindow(\"Form Filled\");</p>\n\n<p>// Submit<br>        driver.findElement(By.id(\"submit\")).click();<br>        eyes.checkWindow(\"After Submit\");<br>    }<br>}<br></code></pre></p>\n\n<h3>Cypress Percy</h3>\n\n<pre><code># Instalação\nnpm install @percy/cypress --save-dev\n</code></pre>\n\n<pre><code>// cypress/integration/visual.spec.js\nimport { percySnapshot } from \'@percy/cypress\';\n\n<p>describe(\'Visual Regression\', () =&gt; {<br>    it(\'homepage looks correct\', () =&gt; {<br>        cy.visit(\'/\');<br>        percySnapshot(\'Homepage\');<br>    });</p>\n\n<p>it(\'login page\', () =&gt; {<br>        cy.visit(\'/login\');<br>        percySnapshot(\'Login Page\', { widths: [768, 1280, 1920] });<br>    });</p>\n\n<p>it(\'product page with different themes\', () =&gt; {<br>        cy.visit(\'/product/1\');</p>\n\n<p>// Light theme<br>        percySnapshot(\'Product Page - Light\');</p>\n\n<p>// Dark theme<br>        cy.get(\'[data-theme=\"dark\"]\').click();<br>        percySnapshot(\'Product Page - Dark\');<br>    });<br>});<br></code></pre></p>\n\n<h3>Playwright + Screenshot Comparison</h3>\n\n<pre><code>// playwright.config.js\nconst { defineConfig } = require(\'@playwright/test\');\n\n<p>module.exports = defineConfig({<br>    testDir: \'./visual-tests\',<br>    screenshotDir: \'./screenshots\',<br>    updateSnapshots: process.argv.includes(\'--update-snapshots\')<br>});</p>\n\n<p>// visual-tests/homepage.spec.js<br>const { test, expect } = require(\'@playwright/test\');</p>\n\n<p>test(\'homepage visual\', async ({ page }) =&gt; {<br>    await page.goto(\'https://example.com\');<br>    await page.waitForLoadState(\'networkidle\');</p>\n\n<p>const screenshot = await page.screenshot();</p>\n\n<p>// Compare with baseline<br>    const baseline = await page.goto(\'https://example.com\');<br>    const baselineScreenshot = await baseline.screenshot();</p>\n\n<p>const match = await page.evaluate(<br>        ([current, baseline]) =&gt; {<br>            // Simple diff percentage<br>            return current.length === baseline.length;<br>        },<br>        [screenshot, baselineScreenshot]<br>    );</p>\n\n<p>expect(match).toBeTruthy();<br>});<br></code></pre></p>\n\n<hr>\n<h2>Configuração por Framework</h2>\n\n<h3>Cypress com cypress-image-snapshot</h3>\n\n<pre><code>npm install --save-dev cypress-image-snapshot\n</code></pre>\n\n<pre><code>// cypress/support/index.js\nconst { addMatchImageSnapshotCommand } = require(\'cypress-image-snapshot/command\');\naddMatchImageSnapshotCommand({\n    failureThreshold: 0.03,\n    failureThresholdType: \'percent\',\n    customSnapshotsDir: \'./cypress/snapshots\'\n});\n\n<p>Cypress.Commands.add(\'getByTestId\', (testId) =&gt; {<br>    return cy.get(<code>[data-testid=\"${testId}\"]</code>);<br>});<br></code></pre></p>\n\n<pre><code>// cypress/integration/button.spec.js\ndescribe(\'Button Component\', () =&gt; {\n    it(\'primary button renders correctly\', () =&gt; {\n        cy.visit(\'/button\');\n        cy.getByTestId(\'primary-button\')\n            .matchImageSnapshot(\'primary-button-default\');\n    });\n\n<p>it(\'button hover state\', () =&gt; {<br>        cy.visit(\'/button\');<br>        cy.getByTestId(\'primary-button\')<br>            .trigger(\'mouseover\')<br>            .matchImageSnapshot(\'primary-button-hover\');<br>    });</p>\n\n<p>it(\'button disabled state\', () =&gt; {<br>        cy.visit(\'/button?disabled=true\');<br>        cy.getByTestId(\'primary-button\')<br>            .matchImageSnapshot(\'primary-button-disabled\');<br>    });<br>});<br></code></pre></p>\n\n<h3>Jest com jest-image-snapshot</h3>\n\n<pre><code>npm install --save-dev jest-image-snapshot\n</code></pre>\n\n<pre><code>// setupTests.js\nconst { toMatchImageSnapshot } = require(\'jest-image-snapshot\');\n\n<p>expect.extend({ toMatchImageSnapshot });</p>\n\n<p>// Component.test.jsx<br>import { render } from \'@testing-library/react\';<br>import Button from \'./Button\';</p>\n\n<p>test(\'Button renders correctly\', () =&gt; {<br>    const { container } = render(<Button>Click me</Button>);</p>\n\n<p>expect(container.firstChild).toMatchImageSnapshot({<br>        customSnapshotIdentifier: \'button-default\'<br>    });<br>});<br></code></pre></p>\n\n<hr>\n<h2>Estratégias de Visual Testing</h2>\n\n<h3>1. Full Page vs Component</h3>\n\n<pre><code>// Full page - everything\ncy.visit(\'/homepage\');\ncy.percySnapshot(\'Homepage Full\');\n\n<p>// Specific component<br>cy.visit(\'/homepage\');<br>cy.percySnapshot(\'Homepage Header\', {<br>    blackout: [\'.ads\', \'.sidebar\']  // Ignore dynamic content<br>});</p>\n\n<p>// Specific element<br>cy.get(\'.main-content\')<br>    .percySnapshotElement(\'Main Content Only\');<br></code></pre></p>\n\n<h3>2. Responsive Testing</h3>\n\n<pre><code>const viewports = [\n    { name: \'mobile\', width: 375, height: 667 },\n    { name: \'tablet\', width: 768, height: 1024 },\n    { name: \'desktop\', width: 1280, height: 720 },\n    { name: \'large\', width: 1920, height: 1080 }\n];\n\n<p>viewports.forEach(viewport =&gt; {<br>    it(<code>renders correctly on ${viewport.name}</code>, () =&gt; {<br>        cy.viewport(viewport.width, viewport.height);<br>        cy.visit(\'/\');<br>        cy.percySnapshot(<code>${viewport.name}-homepage</code>);<br>    });<br>});<br></code></pre></p>\n\n<h3>3. Ignore Dynamic Content</h3>\n\n<pre><code>// Applitools - Ignore regions\neyes.checkWindow(\'Dashboard\', {\n    ignore: [\n        { element: \'#dynamic-widget-1\' },\n        { element: \'#ads-banner\' },\n        { region: { left: 0, top: 0, width: 200, height: 100 } }\n    ]\n});\n\n<p>// Percy - Blackout<br>cy.percySnapshot(\'Dashboard\', {<br>    blackout: [\'[data-testid=\"ad-banner\"]\', \'.cookie-consent\']<br>});<br></code></pre></p>\n\n<hr>\n<h2>CI/CD Integration</h2>\n\n<pre><code># GitHub Actions\nname: Visual Regression Tests\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  visual-tests:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Percy<br>        uses: browser-actions/run-percy@latest<br>        with:<br>          percy-token: ${{ secrets.PERCY_TOKEN }}</p>\n\n<p>- name: Run visual tests<br>        run: npm run test:visual</p>\n\n<p>- name: Upload snapshots<br>        uses: actions/upload-artifact@v4<br>        if: failure()<br>        with:<br>          name: visual-diffs<br>          path: visual-test-results/<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Visual regression testing detecta mudanças visuais automaticamente. As chaves são:<br><ol><li><strong>Escolher ferramenta</strong> - Applitools, Percy, oubuilt-in</li><br><li><strong>Configurar ignores</strong> - Ignorar conteúdo dinâmico</li><br><li><strong>Testar responsivo</strong> - Múltiplos viewports</li><br><li><strong>Integrar CI</strong> - Executar em cada PR</li><br><li><strong>Revisar diffs</strong> - Aprovar ou corrigir</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Como lidar com conteúdo dinâmico?</strong>  <br>R: Use blackout/ignore para elementos variáveis.</p>\n\n<p><strong>P: Qual threshold usar?</strong>  <br>R: 0.1-3{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dependendo da tolerância. Testes strict = 0{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}.</p>\n\n<p><strong>P: Atualizar snapshots automaticamente?</strong>  <br>R: Apenas quando mudanças são intencionais, com code review.</p>', 'Visual Regression Testing: Detectando Mudanças Visuais', '', 'publish', 'closed', 'open', '', '23visualtesting', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/23visualtesting/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('200', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Domine Selenium WebDriver: setup, locators, Page Objects, waits, debugging e melhores práticas para automação de testes web.</p>\n\n<hr>\n<h2>Introdução ao Selenium WebDriver</h2>\n\n<p>Selenium WebDriver é a ferramenta mais popular para automação de testes web. Permite controlar browsers programaticamente para executar ações e verificar resultados.</p>\n\n<h3>Arquitetura</h3>\n\n<pre><code>┌─────────────┐    JSON Wire Protocol    ┌─────────────┐\n│    Tests    │ ←──────────────────────→ │   Browser   │\n│  (Python)   │                          │  (Chrome)   │\n└─────────────┘                          └─────────────┘\n       ↑                                        ↑\n       │                                        │\n       └────────── WebDriver API ───────────────┘\n</code></pre>\n\n<hr>\n<h2>Setup</h2>\n\n<h3>Instalação</h3>\n\n<pre><code># Python\npip install selenium webdriver-manager\n\n<p># Java<br><br>    org.seleniumhq.selenium<br>    selenium-java<br>    4.15.0<br></p>\n\n<p># JavaScript<br>npm install selenium-webdriver<br></code></pre></p>\n\n<h3>Setup Rápido</h3>\n\n<pre><code>from selenium import webdriver\nfrom selenium.webdriver.chrome.service import Service\nfrom webdriver_manager.chrome import ChromeDriverManager\n\n<p># Setup automático<br>driver = webdriver.Chrome(<br>    service=Service(ChromeDriverManager().install())<br>)</p>\n\n<p>driver.get(\"https://example.com\")<br>print(driver.title)<br>driver.quit()<br></code></pre></p>\n\n<hr>\n<h2>Locators</h2>\n\n<h3>Priority de Locators</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Prioridade</th><th>Locator</th><th>Exemplo</th><th>Confiabilidade</th></tr>\n<tr><td>1</td><td>ID</td><td><code>By.ID, \"username\"</code></td><td>Mais confiável</td></tr>\n<tr><td>2</td><td>Name</td><td><code>By.NAME, \"email\"</code></td><td>Bom</td></tr>\n<tr><td>3</td><td>Data Test ID</td><td><code>By.CSS, \"[data-testid=\'btn\']\"</code></td><td>Excelente</td></tr>\n<tr><td>4</td><td>Class</td><td><code>By.CLASS_NAME, \"btn-primary\"</code></td><td>Médio</td></tr>\n<tr><td>5</td><td>XPath</td><td><code>By.XPATH, \"//button[@id=\'submit\']\"</code></td><td>Flexível</td></tr>\n<tr><td>6</td><td>CSS</td><td><code>By.CSS_SELECTOR, \"#submit\"</code></td><td>Rápido</td></tr>\n<tr><td>7</td><td>Link Text</td><td><code>By.LINK_TEXT, \"Click here\"</code></td><td>Texto âncora</td></tr>\n<tr><td>8</td><td>Partial Link</td><td><code>By.PARTIAL_LINK_TEXT, \"here\"</code></td><td>Texto parcial</td></tr>\n</table></figure>\n\n<h3>Exemplos de Locators</h3>\n\n<pre><code>from selenium.webdriver.common.by import By\n\n<p># By ID (mais rápido)<br>driver.find_element(By.ID, \"username\")<br>driver.find_element(By.ID, \"password\")<br>driver.find_element(By.ID, \"login-button\")</p>\n\n<p># By Name<br>driver.find_element(By.NAME, \"email\")<br>driver.find_element(By.NAME, \"search\")</p>\n\n<p># By XPath (absoluto - evitar)<br>driver.find_element(By.XPATH, \"/html/body/div[2]/form/input[1]\")</p>\n\n<p># XPath relativo (preferir)<br>driver.find_element(By.XPATH, \"//input[@id=\'username\']\")<br>driver.find_element(By.XPATH, \"//button[contains(text(), \'Login\')]\")<br>driver.find_element(By.XPATH, \"//div[@class=\'form\']//input[@name=\'email\']\")</p>\n\n<p># XPath com múltiplas condições<br>driver.find_element(By.XPATH, <br>    \"//button[@type=\'submit\' and contains(@class, \'btn-primary\')]\")</p>\n\n<p># CSS Selector<br>driver.find_element(By.CSS_SELECTOR, \"#username\")<br>driver.find_element(By.CSS_SELECTOR, \".form-group .form-control\")<br>driver.find_element(By.CSS_SELECTOR, \"input[name=\'email\']\")<br>driver.find_element(By.CSS_SELECTOR, \"button[type=\'submit\']\")</p>\n\n<p># Link Text<br>driver.find_element(By.LINK_TEXT, \"Forgot Password?\")<br>driver.find_element(By.PARTIAL_LINK_TEXT, \"Forgot\")</p>\n\n<p># Data Test ID (recomendado para testes)<br>driver.find_element(By.CSS_SELECTOR, \"[data-testid=\'login-button\']\")<br></code></pre></p>\n\n<p>###Locator Strategies</p>\n\n<pre><code># Hierarquia de preferências\nLOCATOR_STRATEGY = [\n    (\"data-testid\", lambda x: By.CSS_SELECTOR, f\"[data-testid=\'{x}\']\"),\n    (\"id\", lambda x: By.ID, x),\n    (\"name\", lambda x: By.NAME, x),\n    (\"aria-label\", lambda x: By.CSS_SELECTOR, f\"[aria-label=\'{x}\']\"),\n    (\"text\", lambda x: By.XPATH, f\"//*[contains(text(), \'{x}\')]\"),\n    (\"css\", lambda x: By.CSS_SELECTOR, x),\n]\n\n<p>def find_element(driver, locator_type, locator_value):<br>    \"\"\"Encontra elemento usando estratégia otimizada\"\"\"<br>    by, value = LOCATOR_STRATEGY<a href=\"locator_value\">locator_type</a><br>    return driver.find_element(by, value)<br></code></pre></p>\n\n<hr>\n<h2>Interações Básicas</h2>\n\n<pre><code># Navegação\ndriver.get(\"https://example.com\")\ndriver.back()\ndriver.forward()\ndriver.refresh()\ndriver.title  # Page title\ndriver.current_url  # Current URL\n\n<p># Localizar e interagir<br>element = driver.find_element(By.ID, \"username\")<br>element.send_keys(\"user@example.com\")<br>element.clear()</p>\n\n<p># Click<br>driver.find_element(By.ID, \"submit-button\").click()</p>\n\n<p># Dropdowns<br>from selenium.webdriver.support.ui import Select</p>\n\n<p>dropdown = Select(driver.find_element(By.ID, \"country\"))<br>dropdown.select_by_visible_text(\"Brazil\")<br>dropdown.select_by_value(\"br\")<br>dropdown.select_by_index(1)</p>\n\n<p># Checkboxes<br>checkbox = driver.find_element(By.ID, \"accept-terms\")<br>if not checkbox.is_selected():<br>    checkbox.click()</p>\n\n<p># Radio buttons<br>radio = driver.find_element(By.CSS_SELECTOR, \"input[name=\'plan\'][value=\'premium\']\")<br>if not radio.is_selected():<br>    radio.click()<br></code></pre></p>\n\n<hr>\n<h2>Waits</h2>\n\n<h3>Wait Implícito vs Explícito</h3>\n\n<pre><code># ❌ NÃO USE: Wait implícito (global, aplicado a todos)\ndriver.implicitly_wait(10)  # Espera 10s para cada elemento\n\n<p># ✅ USE: Wait explícito (específico por situação)<br>from selenium.webdriver.support.ui import WebDriverWait<br>from selenium.webdriver.support import expected_conditions as EC</p>\n\n<p># Espera elemento ficar clicável<br>button = WebDriverWait(driver, 10).until(<br>    EC.element_to_be_clickable((By.ID, \"submit\"))<br>)<br>button.click()<br></code></pre></p>\n\n<h3>Expected Conditions</h3>\n\n<pre><code>from selenium.webdriver.support import expected_conditions as EC\n\n<p># Elemento presente no DOM<br>EC.presence_of_element_located((By.ID, \"username\"))</p>\n\n<p># Elemento visível<br>EC.visibility_of_element_located((By.ID, \"welcome-message\"))</p>\n\n<p># Elemento clicável<br>EC.element_to_be_clickable((By.ID, \"submit-button\"))</p>\n\n<p># Texto presente<br>EC.text_to_be_present_in_element((By.CLASS_NAME, \"message\"), \"Success\")</p>\n\n<p># URL contém<br>EC.url_contains(\"dashboard\")</p>\n\n<p># Título contém<br>EC.title_contains(\"Dashboard\")</p>\n\n<p># Nova janela abre<br>EC.new_window_is_opened(original_handles)</p>\n\n<p># Alerta presente<br>EC.alert_is_present()</p>\n\n<p># Loading spinners disappear<br>EC.invisibility_of_element_located((By.CLASS_NAME, \"spinner\"))<br></code></pre></p>\n\n<h3>Wait Customizado</h3>\n\n<pre><code># Wait para elemento com texto específico\ndef wait_for_text(driver, locator, text, timeout=10):\n    \"\"\"Espera até elemento conter texto específico\"\"\"\n    return WebDriverWait(driver, timeout).until(\n        EC.text_to_be_present_in_element(locator, text)\n    )\n\n<p># Wait para página carregar completamente<br>def wait_for_page_load(driver, timeout=30):<br>    \"\"\"Espera documento.readyState ser \'complete\'\"\"\"<br>    def document_ready(driver):<br>        return driver.execute_script(\"return document.readyState\") == \"complete\"<br>    WebDriverWait(driver, timeout).until(document_ready)</p>\n\n<p># Wait para requisição AJAX<br>def wait_for_ajax(driver, timeout=10):<br>    \"\"\"Espera requisições AJAX terminarem\"\"\"<br>    def ajax_complete(driver):<br>        return driver.execute_script(<br>            \"return jQuery.active == 0\"<br>        )<br>    WebDriverWait(driver, timeout).until(ajax_complete)<br></code></pre></p>\n\n<hr>\n<h2>Page Object Pattern</h2>\n\n<pre><code># pages/base_page.py\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n<p>class BasePage:<br>    def __init__(self, driver):<br>        self.driver = driver<br>        self.wait = WebDriverWait(driver, 10)</p>\n\n<p>def _find(self, locator):<br>        return self.wait.until(<br>            EC.presence_of_element_located(locator)<br>        )</p>\n\n<p>def _click(self, locator):<br>        self.wait.until(<br>            EC.element_to_be_clickable(locator)<br>        ).click()</p>\n\n<p>def _input(self, locator, text):<br>        element = self.wait.until(<br>            EC.presence_of_element_located(locator)<br>        )<br>        element.clear()<br>        element.send_keys(text)</p>\n\n<p>def _get_text(self, locator):<br>        return self.wait.until(<br>            EC.visibility_of_element_located(locator)<br>        ).text</p>\n\n<p>def is_displayed(self, locator):<br>        try:<br>            return self.wait.until(<br>                EC.visibility_of_element_located(locator)<br>            ).is_displayed()<br>        except:<br>            return False</p>\n\n<p># pages/login_page.py<br>from selenium.webdriver.common.by import By<br>from .base_page import BasePage</p>\n\n<p>class LoginPage(BasePage):<br>    URL = \"https://example.com/login\"</p>\n\n<p># Locators<br>    EMAIL_INPUT = (By.ID, \"email\")<br>    PASSWORD_INPUT = (By.ID, \"password\")<br>    LOGIN_BUTTON = (By.ID, \"login-button\")<br>    ERROR_MESSAGE = (By.CLASS_NAME, \"error-message\")<br>    FORGOT_PASSWORD_LINK = (By.LINK_TEXT, \"Forgot Password?\")</p>\n\n<p>def load(self):<br>        self.driver.get(self.URL)<br>        return self</p>\n\n<p>def login(self, email, password):<br>        self._input(self.EMAIL_INPUT, email)<br>        self._input(self.PASSWORD_INPUT, password)<br>        self._click(self.LOGIN_BUTTON)<br>        from pages.dashboard_page import DashboardPage<br>        return DashboardPage(self.driver)</p>\n\n<p>def get_error_message(self):<br>        return self._get_text(self.ERROR_MESSAGE)</p>\n\n<p>def click_forgot_password(self):<br>        self._click(self.FORGOT_PASSWORD_LINK)<br>        from pages.forgot_password_page import ForgotPasswordPage<br>        return ForgotPasswordPage(self.driver)</p>\n\n<p># pages/dashboard_page.py<br>from .base_page import BasePage<br>from selenium.webdriver.common.by import By</p>\n\n<p>class DashboardPage(BasePage):<br>    WELCOME_MESSAGE = (By.CLASS_NAME, \"welcome-message\")<br>    USER_NAME = (By.CSS_SELECTOR, \"[data-testid=\'user-name\']\")<br>    LOGOUT_BUTTON = (By.ID, \"logout-button\")</p>\n\n<p>def get_welcome_message(self):<br>        return self._get_text(self.WELCOME_MESSAGE)</p>\n\n<p>def get_user_name(self):<br>        return self._get_text(self.USER_NAME)</p>\n\n<p>def logout(self):<br>        self._click(self.LOGOUT_BUTTON)<br>        from pages.login_page import LoginPage<br>        return LoginPage(self.driver)<br></code></pre></p>\n\n<hr>\n<h2>Testando Exemplos</h2>\n\n<pre><code># tests/test_login.py\nimport pytest\nfrom pages.login_page import LoginPage\nfrom pages.dashboard_page import DashboardPage\n\n<p>class TestLogin:</p>\n\n<p>@pytest.fixture(autouse=True)<br>    def setup(self, driver):<br>        self.driver = driver<br>        self.login_page = LoginPage(driver)</p>\n\n<p>def test_login_with_valid_credentials(self):<br>        \"\"\"Deve fazer login e ir para dashboard\"\"\"<br>        dashboard = self.login_page.load().login(<br>            email=\"user@example.com\",<br>            password=\"password123\"<br>        )</p>\n\n<p>assert dashboard.get_welcome_message() == \"Welcome!\"<br>        assert dashboard.get_user_name() == \"John Doe\"</p>\n\n<p>def test_login_with_invalid_credentials(self):<br>        \"\"\"Deve exibir mensagem de erro\"\"\"<br>        self.login_page.load()<br>        self.login_page.login(<br>            email=\"invalid@example.com\",<br>            password=\"wrongpassword\"<br>        )</p>\n\n<p>assert \"Invalid credentials\" in self.login_page.get_error_message()</p>\n\n<p>def test_forgot_password_flow(self):<br>        \"\"\"Deve navegar para recuperação de senha\"\"\"<br>        forgot_page = self.login_page.load().click_forgot_password()</p>\n\n<p>assert forgot_page.is_displayed()<br>        assert \"Reset Password\" in forgot_page.get_title()<br></code></pre></p>\n\n<hr>\n<h2>Headless Mode</h2>\n\n<pre><code>from selenium.webdriver.chrome.options import Options\n\n<p>options = Options()<br>options.add_argument(\"--headless\")<br>options.add_argument(\"--no-sandbox\")<br>options.add_argument(\"--disable-dev-shm-usage\")<br>options.add_argument(\"--disable-gpu\")</p>\n\n<p>driver = webdriver.Chrome(options=options)<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Selenium WebDriver é poderoso para automação web. As chaves são:<br><ol><li><strong>Use locators estáveis</strong> - data-testid &gt; ID &gt; XPath</li><br><li><strong>Waits explícitos</strong> - Sempre prefira sobre implícitos</li><br><li><strong>Page Objects</strong> - Separe locators e ações</li><br><li><strong>Evite sleeps</strong> - Use expected conditions</li><br><li><strong>Debug com screenshots</strong> - Capture estado em falhas</li></ol></p>', 'Selenium WebDriver: Guia Completo para Automação Web', '', 'publish', 'closed', 'open', '', '24seleniumwebdriver', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/24seleniumwebdriver/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('201', '0', '2026-07-04 23:07:29', '2026-07-05 02:07:29', '<p><strong>Meta Description:</strong> Aprenda a projetar e testar APIs REST: HTTP methods, status codes, versionamento, autenticação, documentação e segurança.</p>\n\n<hr>\n<h2>Princípios REST</h2>\n\n<h3>Constraints REST</h3>\n<ol><li><strong>Client-Server</strong>: Separação de interesses</li>\n<li><strong>Stateless</strong>: Cada requisição contém toda informação</li>\n<li><strong>Cacheable</strong>: Respostas podem ser cacheadas</li>\n<li><strong>Uniform Interface</strong>: Interface consistente</li>\n<li><strong>Layered System</strong>: Arquitetura em camadas</li>\n</ol>\n<hr>\n<h2>HTTP Methods</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Método</th><th>Semântica</th><th>Idempotente</th><th>Safe</th></tr>\n<tr><td>GET</td><td>Ler recurso</td><td>Sim</td><td>Sim</td></tr>\n<tr><td>POST</td><td>Criar recurso</td><td>Não</td><td>Não</td></tr>\n<tr><td>PUT</td><td>Substituir recurso</td><td>Sim</td><td>Não</td></tr>\n<tr><td>PATCH</td><td>Atualizar parcialmente</td><td>Não</td><td>Não</td></tr>\n<tr><td>DELETE</td><td>Remover recurso</td><td>Sim</td><td>Não</td></tr>\n<tr><td>HEAD</td><td>Ler headers</td><td>Sim</td><td>Sim</td></tr>\n<tr><td>OPTIONS</td><td>Verbos suportados</td><td>Sim</td><td>Sim</td></tr>\n</table></figure>\n\n<hr>\n<h2>Status Codes</h2>\n\n<h3>2xx Success</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Código</th><th>Significado</th><th>Uso</th></tr>\n<tr><td>200</td><td>OK</td><td>GET, PUT, PATCH bem-sucedido</td></tr>\n<tr><td>201</td><td>Created</td><td>POST que cria recurso</td></tr>\n<tr><td>202</td><td>Accepted</td><td>Async processing</td></tr>\n<tr><td>204</td><td>No Content</td><td>DELETE bem-sucedido</td></tr>\n</table></figure>\n\n<h3>3xx Redirection</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Código</th><th>Significado</th><th>Uso</th></tr>\n<tr><td>301</td><td>Moved Permanently</td><td>Redirect permanente</td></tr>\n<tr><td>302</td><td>Found</td><td>Redirect temporário</td></tr>\n<tr><td>304</td><td>Not Modified</td><td>Cache válido</td></tr>\n</table></figure>\n\n<h3>4xx Client Error</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Código</th><th>Significado</th><th>Uso</th></tr>\n<tr><td>400</td><td>Bad Request</td><td>Dados inválidos</td></tr>\n<tr><td>401</td><td>Unauthorized</td><td>Não autenticado</td></tr>\n<tr><td>403</td><td>Forbidden</td><td>Sem permissão</td></tr>\n<tr><td>404</td><td>Not Found</td><td>Recurso não existe</td></tr>\n<tr><td>409</td><td>Conflict</td><td>Conflito de estado</td></tr>\n<tr><td>422</td><td>Unprocessable</td><td>Validação falhou</td></tr>\n<tr><td>429</td><td>Too Many Requests</td><td>Rate limit</td></tr>\n</table></figure>\n\n<h3>5xx Server Error</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Código</th><th>Significado</th><th>Uso</th></tr>\n<tr><td>500</td><td>Internal Server Error</td><td>Erro genérico</td></tr>\n<tr><td>502</td><td>Bad Gateway</td><td>Gateway inválido</td></tr>\n<tr><td>503</td><td>Service Unavailable</td><td>Manutenção</td></tr>\n<tr><td>504</td><td>Gateway Timeout</td><td>Timeout</td></tr>\n</table></figure>\n\n<hr>\n<h2>Design de Endpoints</h2>\n\n<h3>Resource Naming</h3>\n\n<pre><code># BOAS PRÁTICAS\n\n<p># Recursos (substantivos, não verbos)<br>GET    /users              # Lista usuários<br>GET    /users/{id}         # Busca usuário<br>POST   /users              # Cria usuário<br>PUT    /users/{id}         # Atualiza usuário<br>DELETE /users/{id}         # Remove usuário</p>\n\n<p># Sub-recursos<br>GET    /users/{id}/orders          # Pedidos do usuário<br>GET    /users/{id}/orders/{orderId}  # Pedido específico<br>POST   /users/{id}/orders          # Cria pedido para usuário</p>\n\n<p># Evite:<br>GET /getUsers<br>POST /createUser<br>PUT /updateUserData<br></code></pre></p>\n\n<h3>Versionamento</h3>\n\n<pre><code># Via URL (mais comum)\nGET /v1/users\nGET /v2/users\n\n<p># Via Header<br>Accept: application/vnd.api.v2+json</p>\n\n<p># Via Query Param (evite)<br>GET /users?version=2<br></code></pre></p>\n\n<hr>\n<h2>Autenticação e Autorização</h2>\n\n<h3>Bearer Token (JWT)</h3>\n\n<pre><code># Flask API\nfrom flask import Flask, request, jsonify\nimport jwt\n\n<p>app = Flask(__name__)<br>SECRET_KEY = \"your-secret-key\"</p>\n\n<p>@app.route(\"/protected\")<br>def protected():<br>    token = request.headers.get(\"Authorization\", \"\").replace(\"Bearer \", \"\")</p>\n\n<p>if not token:<br>        return jsonify({\"error\": \"Token required\"}), 401</p>\n\n<p>try:<br>        payload = jwt.decode(token, SECRET_KEY, algorithms=[\"HS256\"])<br>        return jsonify({<br>            \"user_id\": payload[\"sub\"],<br>            \"role\": payload[\"role\"]<br>        })<br>    except jwt.ExpiredSignatureError:<br>        return jsonify({\"error\": \"Token expired\"}), 401<br>    except jwt.InvalidTokenError:<br>        return jsonify({\"error\": \"Invalid token\"}), 401</p>\n\n<p>@app.route(\"/login\", methods=[\"POST\"])<br>def login():<br>    # Validate credentials<br>    user = validate_credentials(request.json)</p>\n\n<p>token = jwt.encode({<br>        \"sub\": user.id,<br>        \"role\": user.role,<br>        \"exp\": datetime.utcnow() + timedelta(hours=1)<br>    }, SECRET_KEY, algorithm=\"HS256\")</p>\n\n<p>return jsonify({\"token\": token})<br></code></pre></p>\n\n<h3>OAuth 2.0</h3>\n\n<pre><code># Flask + OAuth\nfrom authlib.integrations.flask_client import OAuth\n\n<p>oauth = OAuth(app)<br>google = oauth.register(name=\'google\')</p>\n\n<p>@app.route(\"/login/google\")<br>def login_google():<br>    return google.authorize_redirect(redirect_uri=url_for(\"callback\", _external=True))</p>\n\n<p>@app.route(\"/callback/google\")<br>def callback():<br>    token = google.authorize_access_token()<br>    user_info = google.get(\"userinfo\").json()<br>    # Create session<br>    return jsonify(user_info)<br></code></pre></p>\n\n<hr>\n<h2>Documentação OpenAPI</h2>\n\n<pre><code># openapi.yaml\nopenapi: 3.0.3\ninfo:\n  title: E-commerce API\n  version: 1.0.0\n  description: API for e-commerce platform\n\n<p>servers:<br>  - url: https://api.exemplo.com/v1<br>    description: Production<br>  - url: https://staging.exemplo.com/v1<br>    description: Staging</p>\n\n<p>paths:<br>  /users:<br>    get:<br>      summary: List users<br>      parameters:<br>        - name: page<br>          in: query<br>          schema:<br>            type: integer<br>            default: 1<br>        - name: limit<br>          in: query<br>          schema:<br>            type: integer<br>            default: 20<br>            maximum: 100<br>      responses:<br>        \'200\':<br>          description: List of users<br>          content:<br>            application/json:<br>              schema:<br>                type: object<br>                properties:<br>                  data:<br>                    type: array<br>                    items:<br>                      $ref: \'#/components/schemas/User\'<br>                  pagination:<br>                    $ref: \'#/components/schemas/Pagination\'<br>        \'401\':<br>          $ref: \'#/components/responses/Unauthorized\'</p>\n\n<p>post:<br>      summary: Create user<br>      requestBody:<br>        required: true<br>        content:<br>          application/json:<br>            schema:<br>              $ref: \'#/components/schemas/CreateUser\'<br>      responses:<br>        \'201\':<br>          description: User created<br>          content:<br>            application/json:<br>              schema:<br>                $ref: \'#/components/schemas/User\'<br>        \'422\':<br>          $ref: \'#/components/responses/ValidationError\'</p>\n\n<p>components:<br>  schemas:<br>    User:<br>      type: object<br>      properties:<br>        id:<br>          type: integer<br>        name:<br>          type: string<br>        email:<br>          type: string<br>          format: email<br>        created_at:<br>          type: string<br>          format: date-time</p>\n\n<p>CreateUser:<br>      type: object<br>      required:<br>        - name<br>        - email<br>        - password<br>      properties:<br>        name:<br>          type: string<br>          minLength: 1<br>        email:<br>          type: string<br>          format: email<br>        password:<br>          type: string<br>          minLength: 8</p>\n\n<p>responses:<br>    Unauthorized:<br>      description: Authentication required<br>      content:<br>        application/json:<br>          schema:<br>            type: object<br>            properties:<br>              error:<br>                type: string</p>\n\n<p>ValidationError:<br>      description: Validation failed<br>      content:<br>        application/json:<br>          schema:<br>            type: object<br>            properties:<br>              errors:<br>                type: array<br>                items:<br>                  type: object<br>                  properties:<br>                    field:<br>                      type: string<br>                    message:<br>                      type: string<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>API REST bem desenhada é crucial para integrações. As chaves são:<br><ol><li><strong>HTTP semantics corretas</strong> - Métodos e status codes</li><br><li><strong>Recursos bem nomeados</strong> - Substantivos, não verbos</li><br><li><strong>Documentação completa</strong> - OpenAPI/Swagger</li><br><li><strong>Autenticação segura</strong> - JWT/OAuth</li><br><li><strong>Versionamento</strong> - Para evoluir sem quebrar</li></ol></p>', 'API REST: Boas Práticas de Design e Testes', '', 'publish', 'open', 'open', '', '25apirest', '', '', '2026-07-04 23:07:29', '2026-07-05 02:07:29', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/25apirest/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('202', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda a configurar CI/CD para QA: GitHub Actions, GitLab CI, Jenkins. Automação de testes, quality gates e deploy contínuo.</p>\n\n<hr>\n<h2>O Que é CI/CD?</h2>\n\n<h3>Continuous Integration (CI)</h3>\n\n<p>Desenvolvedores commitam código frequentemente (diariamente ou mais). Cada commit triggers build automático e suite de testes.</p>\n\n<h3>Continuous Delivery (CD)</h3>\n\n<p>Código que passa em todos os testes é automaticamente deployado para staging/produção.</p>\n\n<hr>\n<h2>GitHub Actions</h2>\n\n<h3>Estrutura Básica</h3>\n\n<pre><code># .github/workflows/ci.yml\nname: CI Pipeline\n\n<p>on:<br>  push:<br>    branches: [main, develop]<br>  pull_request:<br>    branches: [main]</p>\n\n<p>env:<br>  NODE_VERSION: \'18\'</p>\n\n<p>jobs:<br>  lint:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Node<br>        uses: actions/setup-node@v4<br>        with:<br>          node-version: ${{ env.NODE_VERSION }}<br>          cache: \'npm\'</p>\n\n<p>- name: Install dependencies<br>        run: npm ci</p>\n\n<p>- name: Run linter<br>        run: npm run lint</p>\n\n<p>- name: Run type check<br>        run: npm run type-check</p>\n\n<p>test:<br>    needs: lint<br>    runs-on: ubuntu-latest<br>    services:<br>      postgres:<br>        image: postgres:15<br>        env:<br>          POSTGRES_DB: test<br>          POSTGRES_USER: test<br>          POSTGRES_PASSWORD: test<br>        ports:<br>          - 5432:5432<br>        options: &gt;-<br>          --health-cmd pg_isready<br>          --health-interval 10s<br>          --health-timeout 5s<br>          --health-retries 5</p>\n\n<p>redis:<br>        image: redis:7<br>        ports:<br>          - 6379:6379</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Node<br>        uses: actions/setup-node@v4<br>        with:<br>          node-version: ${{ env.NODE_VERSION }}<br>          cache: \'npm\'</p>\n\n<p>- name: Install dependencies<br>        run: npm ci</p>\n\n<p>- name: Run unit tests<br>        run: npm run test:unit -- --coverage</p>\n\n<p>- name: Run integration tests<br>        env:<br>          DATABASE_URL: postgresql://test:test@localhost:5432/test<br>          REDIS_URL: redis://localhost:6379<br>        run: npm run test:integration</p>\n\n<p>- name: Upload coverage<br>        uses: codecov/codecov-action@v3<br>        with:<br>          files: ./coverage/lcov.info<br>          fail_ci_if_error: true</p>\n\n<p>e2e:<br>    needs: test<br>    runs-on: ubuntu-latest<br>    if: github.event_name == \'push\'</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Node<br>        uses: actions/setup-node@v4<br>        with:<br>          node-version: ${{ env.NODE_VERSION }}</p>\n\n<p>- name: Install dependencies<br>        run: npm ci</p>\n\n<p>- name: Install Playwright<br>        run: npx playwright install --with-deps</p>\n\n<p>- name: Run E2E tests<br>        run: npm run test:e2e</p>\n\n<p>- name: Upload test results<br>        uses: actions/upload-artifact@v4<br>        if: always()<br>        with:<br>          name: playwright-report<br>          path: playwright-report/</p>\n\n<p>security:<br>    needs: test<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Snyk<br>        uses: snyk/actions/node@master<br>        env:<br>          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}</p>\n\n<p>- name: Run SonarCloud<br>        uses: SonarSource/sonarcloud-github-action@master<br>        env:<br>          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}</p>\n\n<p>deploy-staging:<br>    needs: [test, security, e2e]<br>    runs-on: ubuntu-latest<br>    if: github.ref == \'refs/heads/develop\'<br>    environment: staging</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Deploy to Staging<br>        run: |<br>          echo \"Deploying to staging...\"<br>          kubectl apply -f k8s/staging/</p>\n\n<p>- name: Smoke tests<br>        run: |<br>          sleep 30<br>          curl -f https://staging.exemplo.com/health</p>\n\n<p>deploy-production:<br>    needs: [deploy-staging]<br>    runs-on: ubuntu-latest<br>    if: github.ref == \'refs/heads/main\'<br>    environment: production</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Deploy to Production<br>        run: |<br>          echo \"Deploying to production...\"<br>          kubectl apply -f k8s/production/<br></code></pre></p>\n\n<hr>\n<h2>GitLab CI</h2>\n\n<pre><code># .gitlab-ci.yml\nstages:\n  - lint\n  - test\n  - security\n  - deploy\n\n<p>variables:<br>  NODE_VERSION: \'18\'<br>  POSTGRES_DB: test<br>  POSTGRES_USER: test<br>  POSTGRES_PASSWORD: test</p>\n\n<p>lint:<br>  stage: lint<br>  image: node:$NODE_VERSION<br>  before_script:<br>    - npm ci<br>  script:<br>    - npm run lint<br>    - npm run type-check<br>  allow_failure: false</p>\n\n<p>test:unit:<br>  stage: test<br>  image: node:$NODE_VERSION<br>  services:<br>    - postgres:15<br>  before_script:<br>    - npm ci<br>  script:<br>    - npm run test:unit -- --coverage<br>  coverage: \'/Liness<em>:s</em>(d+.d+){6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}/\'<br>  artifacts:<br>    reports:<br>      junit: junit.xml<br>      coverage_report:<br>        coverage_format: cobertura<br>        path: coverage/cobertura-coverage.xml</p>\n\n<p>test:integration:<br>  stage: test<br>  image: node:$NODE_VERSION<br>  services:<br>    - postgres:15<br>    - redis:7<br>  before_script:<br>    - npm ci<br>  script:<br>    - npm run test:integration<br>  dependencies:<br>    - test:unit</p>\n\n<p>test:e2e:<br>  stage: test<br>  image: node:$NODE_VERSION<br>  before_script:<br>    - npm ci<br>    - npx playwright install --with-deps<br>  script:<br>    - npm run test:e2e<br>  dependencies:<br>    - test:integration<br>  allow_failure: true</p>\n\n<p>security:dependency-scanning:<br>  stage: security<br>  image: alpine:latest<br>  before_script:<br>    - apk add --no-cache curl<br>  script:<br>    - curl -sL https://getsentry.com/snippets/snyk-gitlab.sh | bash</p>\n\n<p>deploy:staging:<br>  stage: deploy<br>  script:<br>    - echo \"Deploying to staging\"<br>    - kubectl config use-context staging<br>    - kubectl apply -f k8s/staging/<br>  environment:<br>    name: staging<br>  only:<br>    - develop</p>\n\n<p>deploy:production:<br>  stage: deploy<br>  script:<br>    - echo \"Deploying to production\"<br>    - kubectl config use-context production<br>    - kubectl apply -f k8s/production/<br>  environment:<br>    name: production<br>  when: manual<br>  only:<br>    - main<br></code></pre></p>\n\n<hr>\n<h2>Quality Gates</h2>\n\n<h3>Implementação</h3>\n\n<pre><code>quality-gates:\n  stage: quality\n  image: node:$NODE_VERSION\n  before_script:\n    - npm ci\n  script:\n    - |\n      # Check coverage\n      COVERAGE=$(cat coverage/coverage.json | jq \'.total.lines.pct\')\n      echo \"Coverage: $COVERAGE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\n\n<p>if (( $(echo \"$COVERAGE &lt; 80&quot; | bc -l) )); then<br>        echo \"Coverage below 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} threshold\"<br>        exit 1<br>      fi</p>\n\n<p># Check test pass rate<br>      PASS_RATE=$(cat test-results.json | jq \'.passed / .total * 100\')<br>      echo \"Pass rate: $PASS_RATE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</p>\n\n<p>if (( $(echo \"$PASS_RATE &lt; 95&quot; | bc -l) )); then<br>        echo \"Pass rate below 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} threshold\"<br>        exit 1<br>      fi</p>\n\n<p># Check security<br>      if grep -q \"high|critical\" security-report.json; then<br>        echo \"Security vulnerabilities found\"<br>        exit 1<br>      fi</p>\n\n<p>echo \"All quality gates passed\"<br>  needs:<br>    - test<br>  allow_failure: false<br></code></pre></p>\n\n<hr>\n<h2>Test Reports</h2>\n\n<h3>JUnit XML Format</h3>\n\n<pre><code>\n\n  \n  \n    assert \'token\' not in response\n  \n\n</code></pre>\n\n<h3>GitHub Actions Upload</h3>\n\n<pre><code>- name: Upload JUnit test results\n  uses: actions/upload-artifact@v4\n  with:\n    name: test-results\n    path: test-results/junit.xml\n\n<ul><li>name: Publish Test Results</li></ul>\n  uses: dorny/test-reporter@v1\n  with:\n    name: Test Results\n    path: test-results/*.xml\n    reporter: java-junit\n    fail-on: test failures\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>CI/CD robusto é essencial para QA moderno. As chaves são:<br><ol><li><strong>Automação completa</strong> - Build, test, deploy</li><br><li><strong>Quality gates</strong> - Critérios objetivos para avançar</li><br><li><strong>Feedback rápido</strong> - Resultados em minutos</li><br><li><strong>Parallel execution</strong> - Speed up pipelines</li><br><li><strong>Reliable reporting</strong> - JUnit XML, cobertura, etc.</li></ol></p>', 'CI/CD para QA: Automação do Pipeline de Testes', '', 'publish', 'closed', 'open', '', '26cicdqa', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/26cicdqa/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('203', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda testes de carga e stress: JMeter, k6, Gatling. Como simular milhares de usuários e identificar gargalos de performance.</p>\n\n<hr>\n<h2>Tipos de Teste de Carga</h2>\n\n<h3>Load Testing</h3>\n\n<p>Verifica comportamento sob carga esperada.</p>\n\n<pre><code>Carga: 1000 usuários simultâneos\nDuração: 30 minutos\nMétrica: P95 &lt; 500ms\n</code></pre>\n\n<h3>Stress Testing</h3>\n\n<p>Vai além dos limites normais.</p>\n\n<pre><code>Carga: 1000 → 2000 → 5000 usuários\nObjetivo: Encontrar ponto de quebra\n</code></pre>\n\n<h3>Spike Testing</h3>\n\n<p>Picos súbitos de carga.</p>\n\n<pre><code>Normal: 500 usuários\nSpike: 5000 usuários em 5 segundos\nRecovery: 500 usuários\n</code></pre>\n\n<h3>Soak Testing</h3>\n\n<p>Carga sustentada por longo período.</p>\n\n<pre><code>Carga: 1000 usuários\nDuração: 8 horas\nObjetivo: Memory leaks, degradação\n</code></pre>\n\n<hr>\n<h2>k6 - Modern Load Testing</h2>\n\n<h3>Instalação</h3>\n\n<pre><code># macOS\nbrew install k6\n\n<p># Linux<br>sudo apt install k6</p>\n\n<p># Windows<br>choco install k6<br></code></pre></p>\n\n<h3>Script Básico</h3>\n\n<pre><code>// load-test.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },   // Ramp-up<br>    { duration: \'5m\', target: 100 },   // Steady<br>    { duration: \'2m\', target: 200 },   // Stress<br>    { duration: \'5m\', target: 200 },   // Steady<br>    { duration: \'2m\', target: 0 },     // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // &lt; 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} errors<br>    checks: [\'rate&gt;0.95\'],              // &gt; 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} checks pass<br>  },<br>};</p>\n\n<p>const BASE_URL = \'https://api.exemplo.com\';</p>\n\n<p>export default function () {<br>  // Login<br>  const loginRes = http.post(<code>${BASE_URL}/auth/login</code>, {<br>    email: \'user@example.com\',<br>    password: \'password123\',<br>  });</p>\n\n<p>check(loginRes, {<br>    \'login status 200\': (r) =&gt; r.status === 200,<br>    \'has token\': (r) =&gt; r.json(\'token\') !== undefined,<br>  });</p>\n\n<p>const token = loginRes.json(\'token\');</p>\n\n<p>// Get products<br>  const productsRes = http.get(<code>${BASE_URL}/products</code>, {<br>    headers: { \'Authorization\': <code>Bearer ${token}</code> },<br>  });</p>\n\n<p>check(productsRes, {<br>    \'products status 200\': (r) =&gt; r.status === 200,<br>    \'has products\': (r) =&gt; r.json(\'items\').length &gt; 0,<br>  });</p>\n\n<p>sleep(1);<br>}<br></code></pre></p>\n\n<h3>Cenários Complexos</h3>\n\n<pre><code>// scenarios.js\nimport http from \'k6/http\';\nimport { check, group } from \'k6/http\';\nimport { Rate, Trend } from \'k6/metrics\';\n\n<p>const errorRate = new Rate(\'errors\');<br>const apiLatency = new Trend(\'api_latency\');</p>\n\n<p>export const options = {<br>  scenarios: {<br>    // Smoke test<br>    smoke: {<br>      executor: \'constant-vus\',<br>      vus: 10,<br>      duration: \'1m\',<br>      tags: { test_type: \'smoke\' },<br>    },</p>\n\n<p>// Load test<br>    load: {<br>      executor: \'ramping-vus\',<br>      startVUs: 0,<br>      stages: [<br>        { duration: \'2m\', target: 100 },<br>        { duration: \'5m\', target: 100 },<br>        { duration: \'2m\', target: 0 },<br>      ],<br>      tags: { test_type: \'load\' },<br>    },</p>\n\n<p>// Stress test<br>    stress: {<br>      executor: \'ramping-arrival-rate\',<br>      startRate: 1,<br>      timeUnit: \'1s\',<br>      preAllocatedVUs: 100,<br>      maxVUs: 500,<br>      stages: [<br>        { duration: \'2m\', target: 10 },<br>        { duration: \'5m\', target: 50 },<br>        { duration: \'2m\', target: 100 },<br>        { duration: \'1m\', target: 0 },<br>      ],<br>      tags: { test_type: \'stress\' },<br>    },</p>\n\n<p>// Spike test<br>    spike: {<br>      executor: \'ramping-vus\',<br>      startVUs: 0,<br>      stages: [<br>        { duration: \'30s\', target: 100 },<br>        { duration: \'1m\', target: 1000 },  // Spike!<br>        { duration: \'30s\', target: 1000 },<br>        { duration: \'2m\', target: 0 },<br>      ],<br>      tags: { test_type: \'spike\' },<br>    },<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/health\');</p>\n\n<p>errorRate.add(res.status !== 200);<br>  apiLatency.add(res.timings.duration);<br>}<br></code></pre></p>\n\n<hr>\n<h2>JMeter - Enterprise Load Testing</h2>\n\n<h3>Instalação</h3>\n\n<pre><code># Download\nwget https://jmeter.apache.org/download_jmeter.cgi\n\n<p># Run<br>./bin/jmeter.sh<br></code></pre></p>\n\n<h3>Plano de Teste (GUI)</h3>\n\n<pre><code>Test Plan\n├── Thread Group (100 users, 10s ramp-up, loop 10)\n│   ├── HTTP Request Defaults\n│   │   └── Server: api.exemplo.com\n│   │\n│   ├── Once Only Controller\n│   │   └── Login Request\n│   │       └── POST /auth/login\n│   │\n│   ├── Recording Controller\n│   │   └── GET /products\n│   │   └── GET /products/{id}\n│   │   └── POST /orders\n│   │\n│   └── Listeners\n│       ├── Summary Report\n│       ├── View Results Tree\n│       ├── Aggregate Report\n│       └── Graph Results\n</code></pre>\n\n<h3>JMeter CLI</h3>\n\n<pre><code># Run non-GUI\njmeter -n -t test-plan.jmx -l results.jtl -e -o html-report\n\n<p># With specific properties<br>jmeter -n -t api-test.jmx <br>  -Jthreads=100 <br>  -Jrampup=10 <br>  -Jduration=300 <br>  -l results.jtl<br></code></pre></p>\n\n<h3>Distributed Testing</h3>\n\n<pre><code># jmeter-server (on slave machines)\njmeter-server -Djava.rmi.server.hostname=192.168.1.100\n\n<p># Run distributed<br>jmeter -n -t test.jmx <br>  -R192.168.1.100,192.168.1.101,192.168.1.102 <br>  -l results.jtl<br></code></pre></p>\n\n<hr>\n<h2>Gatling - Scala-based Load Testing</h2>\n\n<h3>Instalação</h3>\n\n<pre><code># Download\nwget https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/3.10.5/gatling-charts-highcharts-bundle-3.10.5.zip\nunzip gatling-charts-highcharts-bundle-3.10.5.zip\n</code></pre>\n\n<h3>Script Scala</h3>\n\n<pre><code>// src/test/scala/LoadSimulation.scala\npackage simulations\n\n<p>import io.gatling.core.Predef._<br>import io.gatling.http.Predef._<br>import io.gatling.jdbc.Predef._<br>import io.gatling.core.structure.ScenarioBuilder</p>\n\n<p>class ApiLoadSimulation extends Simulation {</p>\n\n<p>val httpProtocol = http<br>    .baseUrl(\"https://api.exemplo.com\")<br>    .acceptHeader(\"application/json\")<br>    .contentTypeHeader(\"application/json\")<br>    .disableCaching</p>\n\n<p>val userFeeder = csv(\"users.csv\").circular.random</p>\n\n<p>val loginScenario: ScenarioBuilder = scenario(\"Login Flow\")<br>    .feed(userFeeder)<br>    .exec(<br>      http(\"Login\")<br>        .post(\"/auth/login\")<br>        .body(StringBody(<br>          \"\"\"{\"email\":\"${email}\",\"password\":\"${password}\"}\"\"\"<br>        )).asJson<br>        .check(jsonPath(\"$.token\").saveAs(\"authToken\"))<br>    )<br>    .pause(1)<br>    .exec(<br>      http(\"Get Products\")<br>        .get(\"/products\")<br>        .header(\"Authorization\", \"Bearer ${authToken}\")<br>        .check(status.is(200))<br>    )<br>    .pause(1)<br>    .exec(<br>      http(\"Create Order\")<br>        .post(\"/orders\")<br>        .header(\"Authorization\", \"Bearer ${authToken}\")<br>        .body(StringBody(<br>          \"\"\"{\"productId\":1,\"quantity\":2}\"\"\"<br>        )).asJson<br>        .check(status.is(201))<br>    )</p>\n\n<p>setUp(<br>    loginScenario<br>      .inject(<br>        rampUsers(100).during(30.seconds),<br>        constantUsersPerSec(50).during(5.minutes),<br>        rampUsers(100).during(30.seconds)<br>      )<br>      .protocols(httpProtocol)<br>  )<br>  .assertions(<br>    global.responseTime.percentile(95).lt(500),<br>    global.successfulRequests.percent.gt(99)<br>  )<br>  .thresholds(<br>    http(\"Login\").responseTime.percentile(99).lt(1000)<br>  )<br>}<br></code></pre></p>\n\n<hr>\n<h2>Interpreting Results</h2>\n\n<h3>Key Metrics</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Significado</th><th>Target</th></tr>\n<tr><td><strong>P95 Latency</strong></td><td>95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições</td><td>&lt; 500ms</td></tr>\n<tr><td><strong>P99 Latency</strong></td><td>99{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições</td><td>&lt; 1s</td></tr>\n<tr><td><strong>Throughput</strong></td><td>Req/s</td><td>&gt; 1000</td></tr>\n<tr><td><strong>Error Rate</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} falhas</td><td>&lt; 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>CPU</strong></td><td>Utilização</td><td>&lt; 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Memory</strong></td><td>Utilização</td><td>&lt; 85{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n</table></figure>\n\n<h3>Finding Bottlenecks</h3>\n\n<pre><code>// k6 com métricas customizadas\nimport { Trend } from \'k6/metrics\';\n\n<p>const dbLatency = new Trend(\'db_query_duration\');<br>const externalLatency = new Trend(\'external_api_duration\');</p>\n\n<p>export default function () {<br>  const start = Date.now();<br>  // DB query<br>  const dbRes = http.get(<code>${BASE_URL}/db</code>);<br>  dbLatency.add(Date.now() - start);</p>\n\n<p>// External API<br>  const extStart = Date.now();<br>  const extRes = http.get(\'https://external-api.com/data\');<br>  externalLatency.add(Date.now() - extStart);<br>}<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de carga são essenciais para garantir performance. As chaves são:<br><ol><li><strong>Definir objetivos claros</strong> - SLAs e thresholds</li><br><li><strong>Simular realista</strong> - Dados e comportamento reais</li><br><li><strong>Monitorar infra</strong> - CPU, memória, rede</li><br><li><strong>Analisar resultados</strong> - P95, P99, throughput</li><br><li><strong>Testar regularmente</strong> - CI/CD integrado</li></ol></p>', 'Testes de Load/Stress: Garantindo Performance sob Carga', '', 'publish', 'closed', 'open', '', '27testesload', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/27testesload/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('204', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda a testar aplicações em Kubernetes: Helm, deployments, services, configmaps e como integrar testes ao ciclo de deploy em K8s.</p>\n\n<hr>\n<h2>Kubernetes para QA</h2>\n\n<h3>Por Que Kubernetes?</h3>\n\n<ul><li><strong>Isolamento</strong> - Cada ambiente isolado</li><ol><li><strong>Reproducibilidade</strong> - Ambientes idênticos</li>\n<li><strong>Escalabilidade</strong> - Teste com múltiplas réplicas</li>\n<li><strong>Orquestração</strong> - Deploys atômicos</li></ol></ul>\n\n<hr>\n<h2>Recursos Kubernetes</h2>\n\n<h3>Pod</h3>\n\n<pre><code># pod.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: api-test-pod\n  labels:\n    app: api\n    env: test\nspec:\n  containers:\n  - name: api\n    image: api:latest\n    ports:\n    - containerPort: 8080\n    env:\n    - name: DATABASE_URL\n      valueFrom:\n        secretKeyRef:\n          name: api-secrets\n          key: database-url\n    resources:\n      requests:\n        memory: \"256Mi\"\n        cpu: \"250m\"\n      limits:\n        memory: \"512Mi\"\n        cpu: \"500m\"\n    readinessProbe:\n      httpGet:\n        path: /health\n        port: 8080\n      initialDelaySeconds: 5\n      periodSeconds: 10\n    livenessProbe:\n      httpGet:\n        path: /health\n        port: 8080\n      initialDelaySeconds: 15\n      periodSeconds: 20\n</code></pre>\n\n<h3>Deployment</h3>\n\n<pre><code># deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: api-deployment\nspec:\n  replicas: 3\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxSurge: 1\n      maxUnavailable: 0\n  selector:\n    matchLabels:\n      app: api\n  template:\n    metadata:\n      labels:\n        app: api\n    spec:\n      containers:\n      - name: api\n        image: api:v1.0.0\n        ports:\n        - containerPort: 8080\n        env:\n        - name: ENV\n          value: \"production\"\n        livenessProbe:\n          httpGet:\n            path: /health\n            port: 8080\n        readinessProbe:\n          httpGet:\n            path: /ready\n            port: 8080\n</code></pre>\n\n<h3>Service</h3>\n\n<pre><code># service.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: api-service\nspec:\n  type: ClusterIP\n  selector:\n    app: api\n  ports:\n  - port: 80\n    targetPort: 8080\n    name: http\n</code></pre>\n\n<hr>\n<h2>Helm - Gerenciamento de Charts</h2>\n\n<h3>Estrutura</h3>\n\n<pre><code>myapp/\n├── Chart.yaml\n├── values.yaml\n├── charts/\n├── templates/\n│   ├── deployment.yaml\n│   ├── service.yaml\n│   ├── ingress.yaml\n│   ├── _helpers.tpl\n│   └── tests/\n│       └── test-connection.yaml\n└── README.md\n</code></pre>\n\n<h3>Chart.yaml</h3>\n\n<pre><code># Chart.yaml\napiVersion: v2\nname: myapp\ndescription: A Helm chart for MyApp\ntype: application\nversion: 1.0.0\nappVersion: \"1.0.0\"\nkeywords:\n  - web\n  - api\nhome: https://myapp.com\nmaintainers:\n  - name: DevOps Team\n    email: devops@myapp.com\ndependencies:\n  - name: postgresql\n    version: \"12.x\"\n    repository: \"https://charts.bitnami.com/bitnami\"\n    condition: postgresql.enabled\n</code></pre>\n\n<h3>values.yaml</h3>\n\n<pre><code># values.yaml\nreplicaCount: 3\n\n<p>image:<br>  repository: myapp/api<br>  tag: latest<br>  pullPolicy: IfNotPresent</p>\n\n<p>service:<br>  type: ClusterIP<br>  port: 80</p>\n\n<p>ingress:<br>  enabled: true<br>  className: \"nginx\"<br>  annotations:<br>    cert-manager.io/cluster-issuer: \"letsencrypt-prod\"<br>  hosts:<br>    - host: api.myapp.com<br>      paths:<br>        - path: /<br>          pathType: Prefix<br>  tls:<br>    - secretName: api-tls<br>      hosts:<br>        - api.myapp.com</p>\n\n<p>resources:<br>  limits:<br>    cpu: 500m<br>    memory: 512Mi<br>  requests:<br>    cpu: 100m<br>    memory: 256Mi</p>\n\n<p>autoscaling:<br>  enabled: true<br>  minReplicas: 2<br>  maxReplicas: 10<br>  targetCPUUtilizationPercentage: 70</p>\n\n<p>postgresql:<br>  enabled: true<br>  auth:<br>    database: myapp<br>    username: myapp<br>    password: changeme</p>\n\n<p>tests:<br>  enabled: true<br>  image: curlimages/curl:latest<br></code></pre></p>\n\n<h3>Test Template</h3>\n\n<pre><code># templates/tests/test-connection.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"myapp.fullname\" . }}-test-connection\"\n  labels:\n    helm.sh/hook: test\n    helm.sh/hook-delete-policy: before-hook-creation\n  annotations:\n    \"helm.sh/hook\": test\nspec:\n  containers:\n  - name: wget\n    image: \"{{ .Values.tests.image }}\"\n    command: [\'sh\', \'-c\']\n    args:\n      - |\n        echo \"Testing API health endpoint...\"\n        response=$(curl -f http://{{ include \"myapp.fullname\" . }}:{{ .Values.service.port }}/health || echo \"FAILED\")\n        echo \"Response: $response\"\n        if [ \"$response\" != \"OK\" ]; then\n          exit 1\n        fi\n  restartPolicy: Never\n</code></pre>\n\n<hr>\n<h2>Testando no Kubernetes</h2>\n\n<h3>Testes de Integração com Kind</h3>\n\n<pre><code># Criar cluster Kind\nkind create cluster --name qa-tests\n\n<p># Deploy app<br>kubectl apply -f deployment.yaml</p>\n\n<p># Run tests<br>kubectl run test-runner --image=myapp/test-runner -- curl http://api-service/health</p>\n\n<p># Ver resultado<br>kubectl logs test-runner</p>\n\n<p># Cleanup<br>kind delete cluster --name qa-tests<br></code></pre></p>\n\n<h3>kubectl Testing Commands</h3>\n\n<pre><code># Verificar pods\nkubectl get pods -l app=api\n\n<p># Ver logs<br>kubectl logs -l app=api --tail=100</p>\n\n<p># Port-forward para teste local<br>kubectl port-forward svc/api-service 8080:80</p>\n\n<p># Executar testes<br>kubectl exec -it api-pod -- python -m pytest tests/</p>\n\n<p># Ver events<br>kubectl get events --sort-by=\'.lastTimestamp\'<br></code></pre></p>\n\n<h3>Teste com cURL</h3>\n\n<pre><code>#!/bin/bash\n# test-api.sh\n\n<p>API_URL=\"http://api-service\"</p>\n\n<p>echo \"Testing API endpoints...\"</p>\n\n<p># Health check<br>echo \"1. Health check...\"<br>response=$(curl -s -o /dev/null -w \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}{http_code}\" $API_URL/health)<br>if [ \"$response\" != \"200\" ]; then<br>  echo \"FAILED: Health check returned $response\"<br>  exit 1<br>fi<br>echo \"OK\"</p>\n\n<p># Teste de endpoint<br>echo \"2. GET /users...\"<br>response=$(curl -s $API_URL/users)<br>if echo \"$response\" | grep -q \"users\"; then<br>  echo \"OK\"<br>else<br>  echo \"FAILED\"<br>  exit 1<br>fi</p>\n\n<p>echo \"All tests passed!\"<br></code></pre></p>\n\n<hr>\n<h2>CI/CD com Kubernetes</h2>\n\n<h3>GitHub Actions</h3>\n\n<pre><code># .github/workflows/k8s-tests.yml\nname: Kubernetes Tests\n\n<p>on:<br>  push:<br>    branches: [main, develop]</p>\n\n<p>jobs:<br>  test:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup kubectl<br>        uses: azure/setup-kubectl@v3</p>\n\n<p>- name: Configure kubectl<br>        run: |<br>          echo \"${{ secrets.KUBE_CONFIG }}\" | base64 -d &gt; kubeconfig<br>          export KUBECONFIG=kubeconfig</p>\n\n<p>- name: Deploy to test<br>        run: |<br>          helm upgrade --install myapp ./chart <br>            --namespace test <br>            --create-namespace <br>            --values ./chart/values-test.yaml <br>            --wait --timeout 5m</p>\n\n<p>- name: Wait for pods<br>        run: |<br>          kubectl wait --for=condition=ready pod -l app=myapp <br>            -n test --timeout=300s</p>\n\n<p>- name: Run API tests<br>        run: |<br>          kubectl exec -n test deploy/myapp -- <br>            python -m pytest tests/ -v --junit-xml=/tmp/results.xml</p>\n\n<p>- name: Run integration tests<br>        run: |<br>          kubectl run test-runner -n test <br>            --image=myapp/test-runner <br>            --rm -it --restart=Never <br>            -- curl -f http://myapp/health</p>\n\n<p>- name: Collect test results<br>        uses: actions/upload-artifact@v4<br>        with:<br>          name: test-results<br>          path: /tmp/results.xml</p>\n\n<p>- name: Cleanup<br>        if: always()<br>        run: helm uninstall myapp -n test<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Kubernetes facilita testes em ambientes controlados. As chaves são:<br><ol><li><strong>Containerização</strong> - Ambientes reproduzíveis</li><br><li><strong>Helm charts</strong> - Deploys versionados</li><br><li><strong>Test hooks</strong> - Testes no ciclo de deploy</li><br><li><strong>CI/CD integration</strong> - Automação completa</li><br><li><strong>Monitoring</strong> - Observabilidade em testes</li></ol></p>', 'Kubernetes e QA: Testes em Ambientes Containerizados', '', 'publish', 'closed', 'open', '', '28kubernetesqa', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/28kubernetesqa/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('205', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda a monitorar qualidade de software: métricas de QA, dashboards de teste, KPIs deDevOps e como usar dados para melhoria contínua.</p>\n\n<hr>\n<h2>Por Que Monitorar Qualidade?</h2>\n\n<ul><li><strong>Visibilidade</strong> - Entender estado atual</li><ol><li><strong>Tendências</strong> - Identificar melhoras/pioras</li>\n<li><strong>Decisões</strong> - Base para ação</li>\n<li><strong>Accountability</strong> - Responsabilidade clara</li>\n</ol>\n<hr>\n<h2>Métricas de QA</h2>\n\n<h3>Cobertura de Testes</h3>\n\n<pre><code># Métricas de cobertura\nmetrics = {\n    \"line_coverage\": calculate_line_coverage(),\n    \"branch_coverage\": calculate_branch_coverage(),\n    \"function_coverage\": calculate_function_coverage(),\n\n<p>\"covered_lines\": 450,<br>    \"total_lines\": 500,<br>    \"uncovered_lines\": [12, 45, 78],  # Linhas críticas</p>\n\n<p>\"coverage_trend\": {<br>        \"week_1\": 65,<br>        \"week_2\": 68,<br>        \"week_3\": 72,<br>        \"week_4\": 78<br>    }<br>}</p>\n\n<p># Dashboard metrics<br>def calculate_coverage_metrics():<br>    return {<br>        \"current\": get_current_coverage(),<br>        \"target\": 80,<br>        \"delta\": get_current_coverage() - 80,<br>        \"trend\": get_coverage_trend(weeks=4)<br>    }<br></code></pre></p>\n\n<h3>Defect Metrics</h3>\n\n<pre><code>class DefectMetrics:\n    def __init__(self, sprint_data):\n        self.sprint = sprint_data\n\n<p>def defect_leakage_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos encontrados em produção\"\"\"<br>        prod = len([d for d in self.sprint.defects if d.found_in == \'production\'])<br>        total = len(self.sprint.defects)<br>        return (prod / total) * 100 if total &gt; 0 else 0</p>\n\n<p>def defect_density(self):<br>        \"\"\"Defeitos por story point\"\"\"<br>        return len(self.sprint.defects) / self.sprint.story_points_completed</p>\n\n<p>def mean_time_to_detect(self):<br>        \"\"\"Tempo médio para detectar defeito\"\"\"<br>        return sum(d.time_to_detect for d in self.sprint.defects) / len(self.sprint.defects)</p>\n\n<p>def mean_time_to_fix(self):<br>        \"\"\"Tempo médio para corrigir\"\"\"<br>        return sum(d.time_to_fix for d in self.sprint.defects) / len(self.sprint.defects)</p>\n\n<p>def escape_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos escapados para produção\"\"\"<br>        escaped = len([d for d in self.sprint.defects if d.escaped_to_prod])<br>        total = len(self.sprint.defects)<br>        return (escaped / total) * 100 if total &gt; 0 else 0</p>\n\n<p>def defect_by_severity(self):<br>        return {<br>            \"critical\": len([d for d in self.sprint.defects if d.severity == \'critical\']),<br>            \"high\": len([d for d in self.sprint.defects if d.severity == \'high\']),<br>            \"medium\": len([d for d in self.sprint.defects if d.severity == \'medium\']),<br>            \"low\": len([d for d in self.sprint.defects if d.severity == \'low\'])<br>        }</p>\n\n<p>def defect_by_type(self):<br>        return {<br>            \"functional\": len([d for d in self.sprint.defects if d.type == \'functional\']),<br>            \"performance\": len([d for d in self.sprint.defects if d.type == \'performance\']),<br>            \"security\": len([d for d in self.sprint.defects if d.type == \'security\']),<br>            \"ux\": len([d for d in self.sprint.defects if d.type == \'ux\'])<br>        }<br></code></pre></p>\n\n<h3>Test Execution Metrics</h3>\n\n<pre><code>class TestExecutionMetrics:\n    def __init__(self, execution_history):\n        self.history = execution_history\n\n<p>def pass_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de testes passando\"\"\"<br>        passed = len([t for t in self.history if t.status == \'passed\'])<br>        total = len(self.history)<br>        return (passed / total) * 100 if total &gt; 0 else 0</p>\n\n<p>def flaky_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de testes flaky\"\"\"<br>        flaky = len([t for t in self.history if t.is_flaky])<br>        total = len(self.history)<br>        return (flaky / total) * 100 if total &gt; 0 else 0</p>\n\n<p>def execution_time(self):<br>        \"\"\"Tempo de execução total\"\"\"<br>        return sum(t.duration for t in self.history)</p>\n\n<p>def execution_time_trend(self):<br>        \"\"\"Tendência de tempo de execução\"\"\"<br>        return self.history.group_by(\'date\').avg(\'duration\')</p>\n\n<p>def coverage_trend(self):<br>        \"\"\"Tendência de cobertura\"\"\"<br>        return self.history.group_by(\'date\').avg(\'coverage\')</p>\n\n<p>def blocked_tests(self):<br>        \"\"\"Testes bloqueados\"\"\"<br>        return [t for t in self.history if t.status == \'blocked\']</p>\n\n<p>def skipped_tests(self):<br>        \"\"\"Testes pulados\"\"\"<br>        return [t for t in self.history if t.status == \'skipped\']<br></code></pre></p>\n\n<hr>\n<h2>DORA Metrics</h2>\n\n<h3>Deployment Frequency</h3>\n\n<pre><code>def deployment_frequency():\n    \"\"\"\n    Target: On-demand ou múltiplas vezes por dia\n    \"\"\"\n    deployments = get_deployments(last_30_days=True)\n\n<p>return {<br>        \"count\": len(deployments),<br>        \"frequency\": len(deployments) / 30,  # por dia<br>        \"target\": \"&gt;1/day\",<br>        \"status\": \"elite\" if len(deployments) &gt;= 30 else \"high\" if len(deployments) &gt;= 5 else \"medium\"<br>    }<br></code></pre></p>\n\n<h3>Lead Time for Changes</h3>\n\n<pre><code>def lead_time_for_changes():\n    \"\"\"\n    Target: &lt;1 hora (elite)\n    &quot;&quot;&quot;\n    changes = get_code_changes()\n\n<p>lead_times = []<br>    for change in changes:<br>        commit_time = change.commit_timestamp<br>        deploy_time = change.deployed_timestamp<br>        lead_time = (deploy_time - commit_time).total_seconds() / 3600  # horas<br>        lead_times.append(lead_time)</p>\n\n<p>return {<br>        \"median_hours\": statistics.median(lead_times),<br>        \"p95_hours\": statistics.quantiles(lead_times, n=20)[18],  # P95<br>        \"target\": \"&lt;1 hour&quot;,<br>        \"status\": \"elite\" if statistics.median(lead_times) &lt; 1 else &quot;high&quot;<br>    }<br></code></pre></p>\n\n<h3>Time to Restore</h3>\n\n<pre><code>def time_to_restore():\n    \"\"\"\n    Target: &lt;1 hora (elite)\n    &quot;&quot;&quot;\n    incidents = get_incidents(last_30_days=True)\n\n<p>restore_times = []<br>    for incident in incidents:<br>        restore_hours = (incident.resolved_at - incident.detected_at).total_seconds() / 3600<br>        restore_times.append(restore_hours)</p>\n\n<p>return {<br>        \"median_hours\": statistics.median(restore_times),<br>        \"p99_hours\": max(restore_times),  # P99 worst case<br>        \"target\": \"&lt;1 hour&quot;,<br>        \"incidents_count\": len(incidents)<br>    }<br></code></pre></p>\n\n<h3>Change Failure Rate</h3>\n\n<pre><code>def change_failure_rate():\n    \"\"\"\n    Target: &lt;15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} (elite)\n    &quot;&quot;&quot;\n    deployments = get_deployments(last_30_days=True)\n    failed = len([d for d in deployments if d.failed or d.rolled_back])\n\n<p>return {<br>        \"failed_count\": failed,<br>        \"total_count\": len(deployments),<br>        \"rate_percent\": (failed / len(deployments)) * 100 if deployments else 0,<br>        \"target\": \"&lt;15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}&quot;,<br>        \"status\": \"elite\" if failed / len(deployments) &lt; 0.15 else &quot;high&quot;<br>    }<br></code></pre></p>\n\n<hr>\n<h2>Dashboard Design</h2>\n\n<h3>Grafana Dashboard</h3>\n\n<pre><code># dashboard.json\n{\n  \"dashboard\": {\n    \"title\": \"QA Metrics Dashboard\",\n    \"panels\": [\n      {\n        \"title\": \"Test Pass Rate\",\n        \"type\": \"stat\",\n        \"targets\": [\n          {\n            \"expr\": \"sum(test_results{status=\'passed\'}) / sum(test_results) * 100\"\n          }\n        ],\n        \"fieldConfig\": {\n          \"defaults\": {\n            \"unit\": \"percent\",\n            \"thresholds\": {\n              \"mode\": \"absolute\",\n              \"steps\": [\n                {\"value\": 0, \"color\": \"red\"},\n                {\"value\": 90, \"color\": \"yellow\"},\n                {\"value\": 95, \"color\": \"green\"}\n              ]\n            }\n          }\n        }\n      },\n      {\n        \"title\": \"Test Execution Time\",\n        \"type\": \"timeseries\",\n        \"targets\": [\n          {\n            \"expr\": \"rate(test_execution_seconds_sum[5m]) / rate(test_execution_seconds_count[5m])\"\n          }\n        ],\n        \"fieldConfig\": {\n          \"defaults\": {\n            \"unit\": \"s\",\n            \"custom\": {\n              \"lineWidth\": 2,\n              \"fillOpacity\": 10\n            }\n          }\n        }\n      },\n      {\n        \"title\": \"Coverage Trend\",\n        \"type\": \"timeseries\",\n        \"targets\": [\n          {\n            \"expr\": \"test_coverage_percent\",\n            \"legendFormat\": \"Coverage {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\n          }\n        ]\n      },\n      {\n        \"title\": \"DORA Metrics\",\n        \"type\": \"table\",\n        \"targets\": [\n          {\n            \"expr\": \"deployment_frequency\"\n          },\n          {\n            \"expr\": \"lead_time_hours\"\n          },\n          {\n            \"expr\": \"time_to_restore_hours\"\n          },\n          {\n            \"expr\": \"change_failure_rate_percent\"\n          }\n        ]\n      },\n      {\n        \"title\": \"Defect Trends\",\n        \"type\": \"timeseries\",\n        \"targets\": [\n          {\n            \"expr\": \"rate(defects_created_total[1h])\",\n            \"legendFormat\": \"Created\"\n          },\n          {\n            \"expr\": \"rate(defects_resolved_total[1h])\",\n            \"legendFormat\": \"Resolved\"\n          }\n        ]\n      },\n      {\n        \"title\": \"Flaky Tests\",\n        \"type\": \"table\",\n        \"targets\": [\n          {\n            \"expr\": \"flaky_tests\",\n            \"format\": \"table\"\n          }\n        ]\n      }\n    ],\n    \"refresh\": \"5m\",\n    \"time\": {\n      \"from\": \"now-7d\",\n      \"to\": \"now\"\n    }\n  }\n}\n</code></pre>\n\n<hr>\n<h2>Relatórios</h2>\n\n<h3>Sprint Quality Report</h3>\n\n<pre><code># Sprint Quality Report - Sprint 42\n\n<h2>Resumo Executivo</h2><ol><li>Sprint durou: 14 dias</li>\n<li>Velocity: 42 story points</li>\n<li>Defect density: 0.4/story point</li>\n</ol>\n<h2>Métricas de Teste</h2>\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Sprint Atual</th><th>Sprint Anterior</th><th>Target</th></tr>\n<tr><td>Test Pass Rate</td><td>97{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&gt;95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Coverage</td><td>78{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>75{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Execution Time</td><td>25 min</td><td>28 min</td><td>&lt;30 min</td></tr>\n<tr><td>Flaky Tests</td><td>2{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>3{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&lt;2{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n</table></figure>\n\n<h2>DORA Metrics</h2>\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Valor</th><th>Status</th></tr>\n<tr><td>Deployment Frequency</td><td>12/day</td><td>Elite</td></tr>\n<tr><td>Lead Time</td><td>2h</td><td>High</td></tr>\n<tr><td>MTTR</td><td>45min</td><td>Elite</td></tr>\n<tr><td>Change Failure Rate</td><td>8{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>Elite</td></tr>\n</table></figure>\n\n<h2>Defeitos</h2><ol><li>Total criados: 17</li>\n<li>Total resolvidos: 15</li>\n<li>Em aberto: 2 (1 medium, 1 low)</li>\n<li>Em produção: 1</li>\n</ol>\n<h2>Riscos</h2>\n⚠️ Cobertura abaixo do target\n⚠️ 1 defeito crítico em produção\n\n<h2>Ações</h2><ol><li>[ ] Aumentar cobertura para 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</li>\n<li>[ ] Investigar causa do defeito em produção</li>\n<li>[ ] Revisar testes flaky</li></ol></ul>\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Monitoramento é essencial para melhoria contínua. As chaves são:<br><ol><li><strong>Definir métricas certas</strong> - Alinhadas com objetivos</li><br><li><strong>Coletar automaticamente</strong> - CI/CD integration</li><br><li><strong>Visualizar claramente</strong> - Dashboards efetivos</li><br><li><strong>Analisar tendências</strong> - Não apenas snapshots</li><br><li><strong>Agir sobre dados</strong> - Métricas sem ação não valem nada</li></ol></p>', 'Monitoramento de Qualidade: Métricas e Dashboards', '', 'publish', 'closed', 'open', '', '29monitoramentoqualidade', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/29monitoramentoqualidade/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('206', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda GitOps: infraestrutura como código, testes de infraestrutura, Terraform, Ansible e como garantir qualidade em configs.</p>\n\n<hr>\n<h2>O Que é GitOps?</h2>\n\n<p>GitOps usa Git como fonte única de verdade para infraestrutura e configurações. Changes são feitos via Git commits, não manualmente.</p>\n\n<h3>Princípios</h3>\n<ol><li><strong>Tudo no Git</strong> - Código, configs, infraestrutura</li>\n<li><strong>Automação</strong> - CI/CD reconcile com Git</li>\n<li><strong>Idempotência</strong> - mesmo resultado sempre</li>\n<li><strong>Auditoria</strong> - histórico completo de mudanças</li>\n</ol>\n<hr>\n<h2>Terraform - Infraestrutura como Código</h2>\n\n<h3>Setup</h3>\n\n<pre><code># main.tf\nterraform {\n  required_version = \"&gt;= 1.0\"\n\n<p>required_providers {<br>    aws = {<br>      source  = \"hashicorp/aws\"<br>      version = \"~&gt; 5.0\"<br>    }<br>  }</p>\n\n<p>backend \"s3\" {<br>    bucket = \"my-terraform-state\"<br>    key    = \"prod/terraform.tfstate\"<br>    region = \"us-east-1\"<br>  }<br>}</p>\n\n<p>provider \"aws\" {<br>  region = var.aws_region<br>}</p>\n\n<p># Variables<br>variable \"aws_region\" {<br>  description = \"AWS region\"<br>  type        = string<br>  default     = \"us-east-1\"<br>}</p>\n\n<p>variable \"environment\" {<br>  description = \"Environment name\"<br>  type        = string<br>  validation {<br>    condition     = contains([\"dev\", \"staging\", \"prod\"], var.environment)<br>    error_message = \"Environment must be dev, staging, or prod.\"<br>  }<br>}<br></code></pre></p>\n\n<h3>Recursos</h3>\n\n<pre><code># modules/api-service/main.tf\nvariable \"environment\" {}\nvariable \"app_name\" {}\nvariable \"desired_count\" { default = 2 }\nvariable \"instance_type\" { default = \"t3.micro\" }\n\n<p>resource \"aws_ecs_cluster\" \"main\" {<br>  name = \"${var.app_name}-${var.environment}\"</p>\n\n<p>setting {<br>    name  = \"containerInsights\"<br>    value = \"enabled\"<br>  }<br>}</p>\n\n<p>resource \"aws_ecs_task_definition\" \"api\" {<br>  family                   = \"${var.app_name}-api\"<br>  network_mode             = \"awsvpc\"<br>  requires_compatibilities = [\"FARGATE\"]<br>  cpu                      = \"256\"<br>  memory                   = \"512\"</p>\n\n<p>container_definitions = jsonencode([<br>    {<br>      name      = \"api\"<br>      image     = \"${var.app_name}:latest\"<br>      essential = true</p>\n\n<p>portMappings = [{<br>        containerPort = 8080<br>        protocol      = \"tcp\"<br>      }]</p>\n\n<p>environment = [<br>        { name = \"ENV\", value = var.environment }<br>      ]</p>\n\n<p>logConfiguration = {<br>        logDriver = \"awslogs\"<br>        options = {<br>          \"awslogs-group\"         = \"/ecs/${var.app_name}\"<br>          \"awslogs-region\"        = \"us-east-1\"<br>          \"awslogs-stream-prefix\" = \"ecs\"<br>        }<br>      }<br>    }<br>  ])<br>}</p>\n\n<p>resource \"aws_ecs_service\" \"api\" {<br>  name            = \"${var.app_name}-api-${var.environment}\"<br>  cluster         = aws_ecs_cluster.main.id<br>  task_definition = aws_ecs_task_definition.api.arn<br>  desired_count   = var.desired_count</p>\n\n<p>deployment_controller {<br>    type = \"ECS\"<br>  }</p>\n\n<p>deployment_maximum_percent         = 200<br>  deployment_minimum_healthy_percent = 100</p>\n\n<p>load_balancer {<br>    target_group_arn = aws_lb_target_group.api.arn<br>    container_name   = \"api\"<br>    container_port   = 8080<br>  }</p>\n\n<p>depends_on = [aws_lb.api]<br>}<br></code></pre></p>\n\n<hr>\n<h2>Testando Infraestrutura</h2>\n\n<h3>Terratest (Go)</h3>\n\n<pre><code>// api_service_test.go\npackage test\n\n<p>import (<br>    \"testing\"<br>    \"github.com/gruntwork-io/terratest/modules/terraform\"<br>    \"github.com/stretchr/testify/assert\"<br>    \"github.com/gruntwork-io/terratest/modules/aws\"<br>    \"time\"<br>)</p>\n\n<p>func TestAPIService(t *testing.T) {<br>    // Setup<br>    terraformOptions := &amp;terraform.Options{<br>        TerraformDir: \"../modules/api-service\",<br>        Vars: map[string]interface{}{<br>            \"environment\": \"test\",<br>            \"app_name\":    \"myapp\",<br>            \"desired_count\": 2,<br>        },<br>        BackendConfig: map[string]interface{}{<br>            \"bucket\": \"my-test-tfstate\",<br>            \"key\":    \"test/terraform.tfstate\",<br>        },<br>    }</p>\n\n<p>defer terraform.Destroy(t, terraformOptions)<br>    terraform.InitAndApply(t, terraformOptions)</p>\n\n<p>// Get outputs<br>    clusterName := terraform.Output(t, terraformOptions, \"cluster_name\")<br>    serviceName := terraform.Output(t, terraformOptions, \"service_name\")</p>\n\n<p>// Assertions<br>    assert.NotEmpty(t, clusterName)<br>    assert.NotEmpty(t, serviceName)</p>\n\n<p>// Wait for service to be stable<br>    aws.WaitForServiceToStabilize(t, \"us-east-1\", clusterName, serviceName, 10*time.Minute)</p>\n\n<p>// Get service details<br>    service := aws.GetEcsServiceDetails(t, \"us-east-1\", clusterName, serviceName)<br>    assert.Equal(t, int32(2), *service.DesiredCount)</p>\n\n<p>// Verify load balancer<br>    lbArn := terraform.Output(t, terraformOptions, \"lb_arn\")<br>    assert.NotEmpty(t, lbArn)<br>}<br></code></pre></p>\n\n<h3>Checkov (Security Scanning)</h3>\n\n<pre><code># .github/workflows/security-scan.yml\nname: Infrastructure Security Scan\n\n<p>on:<br>  pull_request:<br>    paths:<br>      - \'**.tf\'<br>      - \'<strong>/terrform/</strong>\'</p>\n\n<p>jobs:<br>  security-scan:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Checkov<br>        uses: bridgecrewio/checkov-action@master<br>        with:<br>          directory: .<br>          framework: terraform<br>          output_format: sarif<br>          output_file_path: results.sarif</p>\n\n<p>- name: Upload to GitHub Security<br>        uses: github/codeql-action/upload-sarif@v2<br>        with:<br>          sarif_file: results.sarif<br></code></pre></p>\n\n<pre><code># CLI\ncheckov -d ./infrastructure --framework terraform\n\n<p># Com fail<br>checkov -d ./infrastructure --check CK_VPC_SG_1</p>\n\n<p># Skip específico<br>checkov -d ./infrastructure --skip-check CK_VPC_SG_1<br></code></pre></p>\n\n<h3>Sentinel (Policy as Code)</h3>\n\n<pre><code># policies/api-service.sentinel\nimport \"tfplan/v2\" as tfplan\n\n<p># Validate environment<br>validate_environment = func() {<br>    violations = []</p>\n\n<p>for tfplan.resource_changes as rc {<br>        if rc.type is \"aws_ecs_service\" {<br>            environment = rc.change.after.environment<br>            if environment is \"production\" {<br>                desired_count = rc.change.after.desired_count<br>                if desired_count &lt; 2 {<br>                    append(violations, rc.name)<br>                }<br>            }<br>        }<br>    }</p>\n\n<p>return violations<br>}</p>\n\n<p>main = rule {<br>    validate_environment() is []<br>}<br></code></pre></p>\n\n<hr>\n<h2>Ansible - Configuração</h2>\n\n<h3>Playbook</h3>\n\n<pre><code># playbooks/deploy-api.yml\n<hr>\n<ul><li>name: Deploy API Service</li></ul>\n  hosts: api_servers\n  become: yes\n  vars:\n    app_version: \"1.2.3\"\n    deploy_path: \"/opt/myapp\"\n\n<p>tasks:<br>    - name: Ensure deploy directory exists<br>      file:<br>        path: \"{{ deploy_path }}\"<br>        state: directory<br>        owner: www-data<br>        group: www-data<br>        mode: \'0755\'</p>\n\n<p>- name: Deploy application<br>      template:<br>        src: \"app.conf.j2\"<br>        dest: \"{{ deploy_path }}/config.conf\"<br>        owner: www-data<br>        group: www-data<br>        mode: \'0644\'<br>      notify: Restart API</p>\n\n<p>- name: Pull latest image<br>      docker_image:<br>        name: myapp/api<br>        tag: \"{{ app_version }}\"<br>        source: pull<br>        force_source: yes</p>\n\n<p>- name: Ensure API is running<br>      docker_container:<br>        name: api<br>        image: \"myapp/api:{{ app_version }}\"<br>        state: started<br>        restart_policy: always<br>        ports:<br>          - \"8080:8080\"<br>        env:<br>          ENV: \"{{ app_environment }}\"<br>          DATABASE_URL: \"{{ db_connection_string }}\"<br>        volumes:<br>          - \"{{ deploy_path }}/config.conf:/app/config.conf:ro\"</p>\n\n<p>- name: Wait for API to be healthy<br>      uri:<br>        url: \"http://localhost:8080/health\"<br>        status_code: 200<br>      register: result<br>      until: result.status == 200<br>      retries: 30<br>      delay: 5</p>\n\n<p>handlers:<br>    - name: Restart API<br>      docker_container:<br>        name: api<br>        state: restarted<br></code></pre></p>\n\n<h3>Molecule (Testing Ansible)</h3>\n\n<pre><code># molecule/default/molecule.yml\n<hr>\ndependency:\n  name: galaxy\ndriver:\n  name: docker\nplatforms:\n  - name: instance\n    image: \"geerlingguy/docker-${MOLECULE_DISTRO:-centos7}\"\n    command: \"\"\n    volumes:\n      - /sys/fs/cgroup:/sys/fs/cgroup:ro\n    privileged: true\nprovisioner:\n  name: ansible\n  lint: |\n    ansible-lint\nverifier:\n  name: testinfra\n  lint:\n    - flake8\n</code></pre>\n\n<pre><code># molecule/default/tests/test_default.py\nimport os\nimport pytest\n\n<p>def test_api_installed(host):<br>    api = host.file(\"/opt/myapp\")<br>    assert api.exists<br>    assert api.is_directory</p>\n\n<p>def test_api_config(host):<br>    config = host.file(\"/opt/myapp/config.conf\")<br>    assert config.exists<br>    assert config.user == \"www-data\"</p>\n\n<p>def test_api_service(host):<br>    service = host.service(\"api\")<br>    assert service.is_running<br>    assert service.is_enabled</p>\n\n<p>def test_api_health(host):<br>    response = host.run(\"curl -f http://localhost:8080/health\")<br>    assert response.rc == 0<br>    assert \"healthy\" in response.stdout<br></code></pre></p>\n\n<hr>\n<h2>ArgoCD - GitOps</h2>\n\n<h3>Application</h3>\n\n<pre><code># argocd/application.yaml\napiVersion: argoproj.io/v1alpha1\nkind: Application\nmetadata:\n  name: myapp-api\n  namespace: argocd\n  finalizers:\n    - resources-finalizer.argocd.argoproj.io\nspec:\n  project: default\n  source:\n    repoURL: https://github.com/myorg/manifests.git\n    targetRevision: HEAD\n    path: apps/api-service/overlays/production\n  destination:\n    server: https://kubernetes.default.svc\n    namespace: production\n  syncPolicy:\n    automated:\n      prune: true\n      selfHeal: true\n      allowEmpty: false\n    syncOptions:\n      - CreateNamespace=true\n      - PruneLast=true\n    retry:\n      limit: 5\n      backoff:\n        duration: 5s\n        factor: 2\n        maxDuration: 3m\n  ignoreDifferences:\n    - group: apps\n      kind: Deployment\n      jsonPointers:\n        - /spec/replicas\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>GitOps garante infraestrutura versionada e testável. As chaves são:<br><ol><li><strong>Tudo no Git</strong> - Audit trail completo</li><br><li><strong>Testar infraestrutura</strong> - Terratest, Checkov, Molecule</li><br><li><strong>Automação</strong> - ArgoCD reconcile</li><br><li><strong>Policy as Code</strong> - Validate with Sentinel</li><br><li><strong>Drift detection</strong> - Detect unauthorized changes</li></ol></p>', 'GitOps e Qualidade: Infraestrutura como Código Testável', '', 'publish', 'closed', 'open', '', '30gitopsqa', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/30gitopsqa/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('207', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda a testar acessibilidade: WCAG 2.1, ARIA, screen readers, testes automatizados e manuais para garantir que seu site é acessível a todos.</p>\n\n<hr>\n<h2>O Que é Acessibilidade?</h2>\n\n<p>Acessibilidade web garante que pessoas com deficiências podem usar websites. No Brasil, a <strong>Lei Brasileira de Inclusão (Lei 13.146/2015)</strong> exige acessibilidade em sites públicos e de empresas.</p>\n\n<h3>Por Que Importa?</h3>\n\n<ul><li><strong>Inclusão</strong>: 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} da população tem algum tipo de deficiência</li><ol><li><strong>Legal</strong>: Conformidade com LGPD e leis</li>\n<li><strong>SEO</strong>: Sites acessíveis rankeiam melhor</li>\n<li><strong>UX</strong>: Boas práticas beneficiam todos</li>\n</ol>\n<hr>\n<h2>WCAG 2.1 - 4 Princípios</h2>\n\n<h3>1. Perceivable (Perceptível)</h3>\n\n<pre><code><!-- Imagens com alt text -->\n<img src=\"logo.png\" alt=\"Empresa X - Página inicial\">\n\n<p><!-- Vídeos com legendas --><br><video><br>  <track kind=\"subtitles\" src=\"legendas.vtt\" srclang=\"pt\" label=\"Português\"><br></video></p>\n\n<p><!-- Contrast adequado --><br><br>  .text {<br>    color: #1a1a1a;        /<em> Pior: #767676 = 4.5:1 em fundo branco </em>/<br>    background: #ffffff;   /<em> Melhor: #1a1a1a = 21:1 em fundo branco </em>/<br>  }<br><br></code></pre></p>\n\n<h3>2. Operable (Operável)</h3>\n\n<pre><code><!-- Navegação por teclado -->\n<nav>\n  <a href=\"#main\" class=\"skip-link\">Pular para conteúdo principal</a>\n  <a href=\"#menu\">Menu</a>\n  <a href=\"#search\">Busca</a>\n</nav>\n\n<p><br>.skip-link {<br>  position: absolute;<br>  top: -40px;<br>  left: 0;<br>  background: #000;<br>  color: #fff;<br>  padding: 8px;<br>  z-index: 100;<br>}<br>.skip-link:focus {<br>  top: 0;<br>}<br></p>\n\n<p><!-- Focus visível --><br>:focus {<br>  outline: 3px solid #005fcc;<br>  outline-offset: 2px;<br>}<br></code></pre></p>\n\n<h3>3. Understandable (Compreensível)</h3>\n\n<pre><code><!-- Labels em inputs -->\n<label for=\"email\">Email</label>\n\n<span id=\"email-hint\">Formato: usuario@dominio.com</span>\n\n<p><!-- Erros claros --><br><div class=\"error\" role=\"alert\"><br>  <span id=\"password-error\">Senha deve ter:</span><br>  <ul aria-labelledby=\"password-error\"><br>    <li id=\"error-length\">Mínimo 8 caracteres</li><br>    <li id=\"error-number\">Pelo menos 1 número</li><br>  </ul><br></div><br></code></pre></p>\n\n<h3>4. Robust (Robusto)</h3>\n\n<pre><code><!-- HTML semântico -->\n<header role=\"banner\">\n  <nav role=\"navigation\" aria-label=\"Menu principal\">\n  <main role=\"main\">\n  <article role=\"article\">\n  <aside role=\"complementary\">\n  <footer role=\"contentinfo\">\n</code></pre>\n\n<hr>\n<h2>ARIA - Accessible Rich Internet Applications</h2>\n\n<h3>Roles</h3>\n\n<pre><code><!-- Landmarks -->\n<header role=\"banner\">\n<nav role=\"navigation\">\n<main role=\"main\">\n<aside role=\"complementary\">\n<footer role=\"contentinfo\">\n\n<p><!-- Widgets --><br><button role=\"button\" aria-expanded=\"false\"><br><div role=\"menu\" aria-label=\"Menu\"><br><div role=\"menuitem\"><br><div role=\"tablist\"><br><div role=\"tab\"><br><div role=\"tabpanel\"><br><div role=\"dialog\" aria-labelledby=\"dialog-title\"><br></code></pre></p>\n\n<h3>Estados e Propriedades</h3>\n\n<pre><code><!-- Expanded/Collapsed -->\n<button aria-expanded=\"false\" aria-controls=\"menu-content\">\n<div id=\"menu-content\" hidden>\n\n<p><!-- Selected --><br><br></p>\n\n<p><!-- Disabled --><br><button></p>\n\n<p><!-- Live Regions --><br><div aria-live=\"polite\">Notificação</div><br><div aria-live=\"assertive\">Erro</div><br><div><br></code></pre></p>\n\n<hr>\n<h2>Testes Automatizados</h2>\n\n<h3>axe-core</h3>\n\n<pre><code>// Playwright + axe\nconst { test, expect } = require(\'@playwright/test\');\nconst AxeBuilder = require(\'@axe-core/playwright\').default;\n\n<p>test(\'accessibility on login page\', async ({ page }) =&gt; {<br>  await page.goto(\'/login\');</p>\n\n<p>const accessibilityScanResults = await new AxeBuilder({ page })<br>    .withTags([\'wcag2a\', \'wcag2aa\', \'wcag21a\', \'wcag21aa\'])<br>    .analyze();</p>\n\n<p>// Log violations<br>  if (accessibilityScanResults.violations.length &gt; 0) {<br>    console.log(\'Violations found:\');<br>    accessibilityScanResults.violations.forEach(v =&gt; {<br>      console.log(<code>  - ${v.id}: ${v.description}</code>);<br>    });<br>  }</p>\n\n<p>// Fail if critical violations<br>  const critical = accessibilityScanResults.violations.filter(<br>    v =&gt; v.impact === \'critical\'<br>  );<br>  expect(critical.length, <code>${critical.length} critical violations</code>).toBe(0);<br>});<br></code></pre></p>\n\n<pre><code># pytest + axe\nimport pytest\nfrom playwright.sync_api import Page\n\n<p>def test_accessibility(page: Page):<br>    page.goto(\'/login\')</p>\n\n<p>results = page.run_axe()</p>\n\n<p>critical_violations = [<br>        v for v in results[\'violations\']<br>        if v[\'impact\'] in [\'critical\', \'serious\']<br>    ]</p>\n\n<p>assert len(critical_violations) == 0, (<br>        f\"Found {len(critical_violations)} critical accessibility violations\"<br>    )<br></code></pre></p>\n\n<h3>Lighthouse CI</h3>\n\n<pre><code># .github/workflows/a11y.yml\nname: Accessibility Tests\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  accessibility:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Lighthouse CI<br>        uses: treosh/lighthouse-ci-action@v10<br>        with:<br>          urls: |<br>            https://example.com/<br>            https://example.com/login<br>          budgetPath: ./lighthouse-budget.json<br>          uploadArtifacts: true<br>          temporaryPublicStorage: true</p>\n\n<p># lighthouse-budget.json<br>{<br>  \"ci\": {<br>    \"collect\": {<br>      \"startServerCommand\": \"npm run start\",<br>      \"url\": [<br>        \"http://localhost:8080/\"<br>      ]<br>    },<br>    \"assert\": {<br>      \"assertions\": {<br>        \"categories:accessibility\": [\"error\", {\"minScore\": 0.9}]<br>      }<br>    }<br>  }<br>}<br></code></pre></p>\n\n<hr>\n<h2>Testes Manuais</h2>\n\n<h3>Checklist de Testes Manuais</h3>\n\n<pre><code># Accessibility Testing Checklist\n\n<h2>Navegação por Teclado</h2><ol><li>[ ] Tab percorre todos os elementos interativos</li>\n<li>[ ] ordem de foco faz sentido</li>\n<li>[ ] Focus é sempre visível</li>\n<li>[ ] Links úteis no topo (skip link)</li>\n<li>[ ] ESC fecha modais</li>\n<li>[ ] Enter ativa botões e links</li>\n</ol>\n<h2>Imagens</h2><ol><li>[ ] Todas imagens têm alt text</li>\n<li>[ ] Alt text descreve conteúdo/função</li>\n<li>[ ] Imagens decorativas têm alt=\"\"</li>\n<li>[ ] Textos em imagens evitados</li>\n</ol>\n<h2>Contrastes</h2><ol><li>[ ] Texto normal: 4.5:1 mínimo</li>\n<li>[ ] Texto grande (18pt+): 3:1 mínimo</li>\n<li>[ ] Gráficos: 3:1</li>\n</ol>\n<h2>Formulários</h2><ol><li>[ ] Labels associados a inputs</li>\n<li>[ ] Erros descritos claramente</li>\n<li>[ ] Campos obrigatórios marcados</li>\n<li>[ ] Autocomplete quando aplicável</li>\n</ol>\n<h2>Semântica</h2><ol><li>[ ] Cabeçalhos em ordem (h1 &gt; h2 &gt; h3)</li>\n<li>[ ] Listas usam <ul>/<ol></li>\n<li>[ ] Tabelas têm headers</li>\n<li>[ ] Landmarks definidos</li>\n</ol>\n<h2>ARIA</h2><ol><li>[ ] ARIA usado quando HTML não é suficiente</li>\n<li>[ ] ARIA não sobrepõe semântica nativa</li>\n<li>[ ] Live regions atualizam corretamente</li>\n</ol></code></pre>\n\n<h3>Screen Reader Testing</h3>\n\n<pre><code># Screen Reader Testing\n\n<h2>VoiceOver (macOS)</h2><ol><li>Cmd + F5: Ativar VoiceOver</li>\n<li>Tab/Cmd + Option + Setas: Navegar</li>\n<li>Cmd + Option + U: Rotor</li>\n</ol>\n<h2>NVDA (Windows)</h2><ol><li>Insert + D: Ler documento</li>\n<li>Tab: Próximo elemento</li>\n<li>Insert + Espaço: Modo foco</li>\n</ol>\n<h2>Verificar:</h2><ol><li>[ ] Ordem de leitura faz sentido</li>\n<li>[ ] Imagens descritas</li>\n<li>[ ] Links têm contexto</li>\n<li>[ ] Formulários etiquetados</li>\n<li>[ ] Tabelas fazem sentido</li>\n<li>[ ] Headings navegáveis</li></ol></ul>\n</code></pre>\n\n<hr>\n<h2>Ferramentas</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Custo</th></tr>\n<tr><td><strong>axe DevTools</strong></td><td>Browser Extension</td><td>Grátis</td></tr>\n<tr><td><strong>WAVE</strong></td><td>Browser Extension</td><td>Grátis</td></tr>\n<tr><td><strong>Lighthouse</strong></td><td>DevTools/CLI</td><td>Grátis</td></tr>\n<tr><td><strong>AXE-core</strong></td><td>Library</td><td>Grátis</td></tr>\n<tr><td><strong>SiteImprove</strong></td><td>SaaS</td><td>Pago</td></tr>\n<tr><td><strong>Deque aXe</strong></td><td>Enterprise</td><td>Pago</td></tr>\n<tr><td><strong>Tenon.io</strong></td><td>API</td><td>Pago</td></tr>\n</table></figure>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Acessibilidade é fundamental para inclusão. As chaves são:<br><ol><li><strong>Semântica primeiro</strong> - Use HTML correto</li><br><li><strong>Teste automatizado</strong> - Capture issues rapidamente</li><br><li><strong>Teste manual</strong> - Screen readers e teclado</li><br><li><strong>WCAG compliance</strong> - Atingir nível AA mínimo</li><br><li><strong>Continuous testing</strong> - Integre ao CI/CD</li></ol></p>', 'Accessibility Testing: Garantindo Inclusão e Conformidade WCAG', '', 'publish', 'closed', 'open', '', '31accessibilitytesting', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/31accessibilitytesting/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('208', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda a usar Docker para QA: imagens otimizadas, docker-compose, multi-stage builds, e como containerizar sua suite de testes.</p>\n\n<hr>\n<h2>Por Que Docker para QA?</h2>\n\n<ul><li><strong>Ambientes consistentes</strong> - Same in dev, CI, prod</li><ol><li><strong>Isolamento</strong> - Testes não afetam sistema host</li>\n<li><strong>Reproducibilidade</strong> - Resultados consistentes</li>\n<li><strong>Escalabilidade</strong> - Múltiplos containers de teste</li>\n<li><strong>CI/CD integration</strong> - Fáceis de automatizar</li></ol></ul>\n\n<hr>\n<h2>Dockerfile para Testes</h2>\n\n<h3>Multi-Stage Build</h3>\n\n<pre><code># syntax=docker/dockerfile:1\n\n<p># Stage 1: Build<br>FROM node:18-alpine AS builder<br>WORKDIR /app</p>\n\n<p>COPY package*.json ./<br>RUN npm ci --only=production</p>\n\n<p>COPY . .<br>RUN npm run build</p>\n\n<p># Stage 2: Test<br>FROM node:18-alpine AS test<br>WORKDIR /app</p>\n\n<p># Copy dependencies only (layer caching)<br>COPY package*.json ./<br>RUN npm ci</p>\n\n<p># Copy source<br>COPY . .</p>\n\n<p># Install test dependencies<br>RUN npm ci --prefix .</p>\n\n<p># Copy built artifacts<br>COPY --from=builder /app/dist ./dist<br>COPY --from=builder /app/node_modules ./node_modules</p>\n\n<p># Run tests<br>CMD [\"npm\", \"test\"]</p>\n\n<p># Stage 3: Production<br>FROM node:18-alpine AS production<br>WORKDIR /app</p>\n\n<p>COPY --from=builder /app/dist ./dist<br>COPY --from=builder /app/node_modules ./node_modules<br>COPY --from=builder /app/package*.json ./</p>\n\n<p>USER node<br>EXPOSE 8080</p>\n\n<p>CMD [\"node\", \"dist/index.js\"]<br></code></pre></p>\n\n<h3>Python Tests</h3>\n\n<pre><code>FROM python:3.11-slim\n\n<p>WORKDIR /app</p>\n\n<p># Install system dependencies<br>RUN apt-get update &amp;&amp; apt-get install -y --no-install-recommends <br>    build-essential <br>    libpq-dev <br>    &amp;&amp; rm -rf /var/lib/apt/lists/*</p>\n\n<p># Copy requirements first (layer caching)<br>COPY requirements.txt .<br>RUN pip install --no-cache-dir -r requirements.txt</p>\n\n<p># Copy application<br>COPY . .</p>\n\n<p># Run tests with coverage<br>CMD [\"pytest\", \"-v\", \"--cov=src\", \"--cov-report=xml\", \"--cov-report=html\"]<br></code></pre></p>\n\n<hr>\n<h2>Docker Compose para Ambientes</h2>\n\n<h3>Desenvolvimento Local</h3>\n\n<pre><code># docker-compose.yml\nversion: \'3.8\'\n\n<p>services:<br>  app:<br>    build:<br>      context: .<br>      dockerfile: Dockerfile<br>    ports:<br>      - \"3000:3000\"<br>    environment:<br>      - NODE_ENV=development<br>      - DATABASE_URL=postgres://test:test@db:5432/test<br>      - REDIS_URL=redis://cache:6379<br>    depends_on:<br>      db:<br>        condition: service_healthy<br>      cache:<br>        condition: service_started<br>    volumes:<br>      - .:/app<br>      - /app/node_modules<br>    command: npm run dev</p>\n\n<p>db:<br>    image: postgres:15-alpine<br>    environment:<br>      POSTGRES_DB: test<br>      POSTGRES_USER: test<br>      POSTGRES_PASSWORD: test<br>    ports:<br>      - \"5432:5432\"<br>    volumes:<br>      - postgres_data:/var/lib/postgresql/data<br>      - ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init.sql<br>    healthcheck:<br>      test: [\"CMD-SHELL\", \"pg_isready -U test -d test\"]<br>      interval: 5s<br>      timeout: 5s<br>      retries: 5</p>\n\n<p>cache:<br>    image: redis:7-alpine<br>    ports:<br>      - \"6379:6379\"<br>    volumes:<br>      - redis_data:/data</p>\n\n<p>test:<br>    build:<br>      context: .<br>      dockerfile: Dockerfile.test<br>    environment:<br>      - DATABASE_URL=postgres://test:test@db:5432/test<br>      - REDIS_URL=redis://cache:6379<br>    depends_on:<br>      db:<br>        condition: service_healthy<br>      cache:<br>        condition: service_started<br>    volumes:<br>      - ./test-results:/app/test-results<br>    command: pytest -v --junitxml=/app/test-results/results.xml</p>\n\n<p>volumes:<br>  postgres_data:<br>  redis_data:<br></code></pre></p>\n\n<h3>CI Environment</h3>\n\n<pre><code># docker-compose.ci.yml\nversion: \'3.8\'\n\n<p>services:<br>  app:<br>    build:<br>      context: .<br>      target: test<br>    depends_on:<br>      postgres:<br>        condition: service_healthy<br>      redis:<br>        condition: service_started<br>    environment:<br>      DATABASE_URL: postgres://test:test@postgres:5432/test<br>      REDIS_URL: redis://redis:6379<br>    command: pytest -v --cov=src --cov-report=xml --cov-fail-under=80</p>\n\n<p>postgres:<br>    image: postgres:15-alpine<br>    environment:<br>      POSTGRES_DB: test<br>      POSTGRES_USER: test<br>      POSTGRES_PASSWORD: test<br>    healthcheck:<br>      test: [\"CMD-SHELL\", \"pg_isready -U test\"]<br>      interval: 5s<br>      timeout: 5s<br>      retries: 5</p>\n\n<p>redis:<br>    image: redis:7-alpine<br></code></pre></p>\n\n<hr>\n<h2>Testcontainers</h2>\n\n<pre><code># testcontainers_example.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\nfrom testcontainers.compose import DockerCompose\nimport psycopg2\n\n<p>@pytest.fixture(scope=\"module\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as pg:<br>        yield pg</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def redis():<br>    with RedisContainer(\"redis:7\") as rd:<br>        yield rd</p>\n\n<p>@pytest.fixture<br>def db_connection(postgres):<br>    conn = psycopg2.connect(postgres.get_connection_url())<br>    yield conn<br>    conn.close()</p>\n\n<p>def test_with_containers(postgres, redis):<br>    \"\"\"Test usando bancos containerizados\"\"\"<br>    # Use containers<br>    db_url = postgres.get_connection_url()<br>    redis_url = redis.get_connection_url()</p>\n\n<p># Your test logic here<br>    conn = psycopg2.connect(db_url)<br>    cursor = conn.cursor()<br>    cursor.execute(\"SELECT version();\")<br>    result = cursor.fetchone()<br>    assert \"PostgreSQL\" in result[0]<br></code></pre></p>\n\n<hr>\n<h2>Docker para Selenium Grid</h2>\n\n<pre><code># selenium-grid.yml\nversion: \'3.8\'\n\n<p>services:<br>  selenium-hub:<br>    image: selenium/hub:4.15<br>    ports:<br>      - \"4442:4442\"<br>      - \"4443:4443\"<br>      - \"4444:4444\"<br>    environment:<br>      SE_EVENT_BUS_HOST: selenium-hub<br>      SE_EVENT_BUS_PUBLISH_PORT: 4442<br>      SE_EVENT_BUS_SUBSCRIBE_PORT: 4443</p>\n\n<p>chrome:<br>    image: selenium/node-chrome:4.15<br>    depends_on:<br>      - selenium-hub<br>    environment:<br>      SE_EVENT_BUS_HOST: selenium-hub<br>      SE_EVENT_BUS_PUBLISH_PORT: 4442<br>      SE_EVENT_BUS_SUBSCRIBE_PORT: 4443<br>      SE_NODE_MAX_SESSIONS: 5<br>    shm_size: \'2gb\'</p>\n\n<p>firefox:<br>    image: selenium/node-firefox:4.15<br>    depends_on:<br>      - selenium-hub<br>    environment:<br>      SE_EVENT_BUS_HOST: selenium-hub<br>      SE_EVENT_BUS_PUBLISH_PORT: 4442<br>      SE_EVENT_BUS_SUBSCRIBE_PORT: 4443<br>      SE_NODE_MAX_SESSIONS: 3</p>\n\n<p>edge:<br>    image: selenium/node-edge:4.15<br>    depends_on:<br>      - selenium-hub<br>    environment:<br>      SE_EVENT_BUS_HOST: selenium-hub<br>      SE_EVENT_BUS_PUBLISH_PORT: 4442<br>      SE_EVENT_BUS_SUBSCRIBE_PORT: 4443<br>      SE_NODE_MAX_SESSIONS: 3<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Docker é essencial para QA moderno. As chaves são:<br><ol><li><strong>Multi-stage builds</strong> - Imagens otimizadas</li><br><li><strong>Docker Compose</strong> - Ambientes completos</li><br><li><strong>Testcontainers</strong> - DBs containerizados para testes</li><br><li><strong>Layer caching</strong> - Builds mais rápidos</li><br><li><strong>CI integration</strong> - Automação simplificada</li></ol></p>', 'Docker para QA: Containers para Testes e Ambientes', '', 'publish', 'closed', 'open', '', '31dockerqa', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/31dockerqa/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('209', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda a criar e usar fake services: mocking de APIs, databases, message queues. Como testar sem dependências externas.</p>\n\n<hr>\n<h2>Por Que Usar Fakes e Mocks?</h2>\n\n<ul><li><strong>Isolamento</strong>: Testes não dependem de serviços externos</li><ol><li><strong>Velocidade</strong>: Mocks são mais rápidos que serviços reais</li>\n<li><strong>Confiabilidade</strong>: Não há flaky tests por dependências</li>\n<li><strong>Cobertura</strong>: Testar edge cases difíceis de reproduzir</li></ol></ul>\n\n<hr>\n<h2>Tipos de Fakes</h2>\n\n<h3>1. Fake Objects</h3>\n\n<p>Simulam comportamento de objetos reais.</p>\n\n<pre><code># fakes/user_repository.py\nclass FakeUserRepository:\n    def __init__(self):\n        self.users = {}\n        self._id_counter = 1\n\n<p>def save(self, user):<br>        if not user.id:<br>            user.id = self._id_counter<br>            self._id_counter += 1<br>        self.users[user.id] = user<br>        return user</p>\n\n<p>def find_by_id(self, id):<br>        return self.users.get(id)</p>\n\n<p>def find_by_email(self, email):<br>        for user in self.users.values():<br>            if user.email == email:<br>                return user<br>        return None</p>\n\n<p>def delete(self, id):<br>        if id in self.users:<br>            del self.users[id]<br>            return True<br>        return False</p>\n\n<p># Uso em testes<br>def test_create_user():<br>    repo = FakeUserRepository()<br>    service = UserService(repo)</p>\n\n<p>user = service.create_user(\"João\", \"joao@example.com\")</p>\n\n<p>assert user.id is not None<br>    assert user.name == \"João\"<br>    assert repo.find_by_email(\"joao@example.com\") == user<br></code></pre></p>\n\n<h3>2. Fake APIs</h3>\n\n<p>Simulam endpoints HTTP.</p>\n\n<pre><code># fakes/http_fake.py\nimport json\nfrom http.server import HTTPServer, BaseHTTPRequestHandler\nfrom threading import Thread\nfrom typing import Dict, Callable\n\n<p>class FakeAPIHandler(BaseHTTPRequestHandler):<br>    routes: Dict[str, Callable] = {}</p>\n\n<p>def do_GET(self):<br>        self._handle_request(\'GET\')</p>\n\n<p>def do_POST(self):<br>        self._handle_request(\'POST\')</p>\n\n<p>def do_PUT(self):<br>        self._handle_request(\'PUT\')</p>\n\n<p>def do_DELETE(self):<br>        self._handle_request(\'DELETE\')</p>\n\n<p>def _handle_request(self, method):<br>        handler = self.routes.get((method, self.path))<br>        if handler:<br>            response = handler(self)<br>            self._send_response(response)<br>        else:<br>            self._send_response({\'error\': \'Not found\'}, 404)</p>\n\n<p>def _send_response(self, data, status=200):<br>        self.send_response(status)<br>        self.send_header(\'Content-Type\', \'application/json\')<br>        self.end_headers()<br>        self.wfile.write(json.dumps(data).encode())</p>\n\n<p>def log_message(self, format, *args):<br>        pass  # Silenciar logs</p>\n\n<p>class FakeAPIServer:<br>    def __init__(self, port=8080):<br>        self.port = port<br>        self.server = None<br>        self.thread = None<br>        self.routes = {}</p>\n\n<p>def register(self, method, path, handler):<br>        self.routes[(method, path)] = handler<br>        FakeAPIHandler.routes = self.routes</p>\n\n<p>def start(self):<br>        self.server = HTTPServer((\'localhost\', self.port), FakeAPIHandler)<br>        self.thread = Thread(target=self.server.serve_forever)<br>        self.thread.daemon = True<br>        self.thread.start()</p>\n\n<p>def stop(self):<br>        if self.server:<br>            self.server.shutdown()</p>\n\n<p># Uso<br>def payment_handler(request):<br>    return {<br>        \'transaction_id\': \'tx_123\',<br>        \'status\': \'approved\',<br>        \'amount\': 99.90<br>    }</p>\n\n<p>fake_api = FakeAPIServer(8080)<br>fake_api.register(\'POST\', \'/api/payment\', payment_handler)<br>fake_api.start()</p>\n\n<p># Seus testes aqui</p>\n\n<p>fake_api.stop()<br></code></pre></p>\n\n<h3>3. Fake Databases (SQLite)</h3>\n\n<pre><code># fakes/database.py\nimport sqlite3\nimport os\n\n<p>class FakeDatabase:<br>    def __init__(self, in_memory=True):<br>        if in_memory:<br>            self.conn = sqlite3.connect(\':memory:\')<br>        else:<br>            self.db_path = \'test.db\'<br>            self.conn = sqlite3.connect(self.db_path)</p>\n\n<p>self.conn.row_factory = sqlite3.Row<br>        self._create_tables()</p>\n\n<p>def _create_tables(self):<br>        cursor = self.conn.cursor()<br>        cursor.execute(\'\'\'<br>            CREATE TABLE users (<br>                id INTEGER PRIMARY KEY AUTOINCREMENT,<br>                name TEXT NOT NULL,<br>                email TEXT UNIQUE NOT NULL<br>            )<br>        \'\'\')<br>        cursor.execute(\'\'\'<br>            CREATE TABLE products (<br>                id INTEGER PRIMARY KEY AUTOINCREMENT,<br>                name TEXT NOT NULL,<br>                price REAL NOT NULL<br>            )<br>        \'\'\')<br>        self.conn.commit()</p>\n\n<p>def execute(self, query, params=None):<br>        cursor = self.conn.cursor()<br>        if params:<br>            cursor.execute(query, params)<br>        else:<br>            cursor.execute(query)<br>        self.conn.commit()<br>        return cursor</p>\n\n<p>def fetchone(self, query, params=None):<br>        cursor = self.execute(query, params)<br>        return cursor.fetchone()</p>\n\n<p>def fetchall(self, query, params=None):<br>        cursor = self.execute(query, params)<br>        return cursor.fetchall()</p>\n\n<p>def close(self):<br>        self.conn.close()<br>        if hasattr(self, \'db_path\') and os.path.exists(self.db_path):<br>            os.remove(self.db_path)</p>\n\n<p># Uso<br>def test_user_crud():<br>    db = FakeDatabase()</p>\n\n<p># Create<br>    db.execute(<br>        \'INSERT INTO users (name, email) VALUES (?, ?)\',<br>        (\'João\', \'joao@example.com\')<br>    )</p>\n\n<p># Read<br>    user = db.fetchone(\'SELECT * FROM users WHERE email = ?\', (\'joao@example.com\',))<br>    assert user[\'name\'] == \'João\'</p>\n\n<p>db.close()<br></code></pre></p>\n\n<hr>\n<h2>Mocking Libraries</h2>\n\n<h3>unittest.mock (Python)</h3>\n\n<pre><code>from unittest.mock import Mock, patch, MagicMock\n\n<p># Mock básico<br>def test_payment():<br>    mock_gateway = Mock()<br>    mock_gateway.charge.return_value = {\'status\': \'success\'}</p>\n\n<p>result = process_payment(100, mock_gateway)</p>\n\n<p>mock_gateway.charge.assert_called_once_with(100)<br>    assert result == \'success\'</p>\n\n<p># Patch<br>@patch(\'myapp.services.payment_gateway\')<br>def test_with_patch(mock_gateway):<br>    mock_gateway.charge.return_value = {\'status\': \'success\'}</p>\n\n<p>result = process_payment(100)</p>\n\n<p>mock_gateway.charge.assert_called_once()</p>\n\n<p># Spy (partial mock)<br>def test_spy():<br>    real_service = PaymentService()<br>    spy_service = Mock(wraps=real_service)</p>\n\n<p>spy_service.process(100)</p>\n\n<p>assert spy_service.process.called<br>    assert real_service.internal_method.called  # Real method foi chamado<br></code></pre></p>\n\n<h3>WireMock (Java/Server)</h3>\n\n<pre><code>// Java WireMock\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport static com.github.tomakehurst.wiremock.client.WireMock.*;\n\n<p>WireMockServer wireMock = new WireMockServer(8080);<br>wireMock.start();</p>\n\n<p>// Stub<br>wireMock.stubFor(post(urlEqualTo(\"/api/payment\"))<br>    .withRequestBody(containing(\"amount\"))<br>    .willReturn(aResponse()<br>        .withStatus(200)<br>        .withHeader(\"Content-Type\", \"application/json\")<br>        .withBody(\"{\"transaction_id\":\"tx_123\",\"status\":\"approved\"}\")));</p>\n\n<p>// Test<br>RestAssured.given()<br>    .contentType(\"application/json\")<br>    .body(\"{\"amount\":100}\")<br>.when()<br>    .post(\"http://localhost:8080/api/payment\")<br>.then()<br>    .statusCode(200)<br>    .body(\"status\", equalTo(\"approved\"));</p>\n\n<p>wireMock.stop();<br></code></pre></p>\n\n<h3>MSW (Mock Service Worker)</h3>\n\n<pre><code>// Mock API com MSW\nimport { setupWorker, rest } from \'msw\';\n\n<p>const handlers = [<br>  rest.post(\'/api/payment\', (req, res, ctx) =&gt; {<br>    return res(<br>      ctx.status(200),<br>      ctx.json({<br>        transaction_id: \'tx_123\',<br>        status: \'approved\',<br>        amount: req.body.amount<br>      })<br>    );<br>  }),</p>\n\n<p>rest.get(\'/api/users/:id\', (req, res, ctx) =&gt; {<br>    return res(<br>      ctx.status(200),<br>      ctx.json({<br>        id: req.params.id,<br>        name: \'João Silva\',<br>        email: \'joao@example.com\'<br>      })<br>    );<br>  }),</p>\n\n<p>rest.post(\'/api/users\', (req, res, ctx) =&gt; {<br>    return res(<br>      ctx.status(201),<br>      ctx.json({<br>        id: \'new-user-id\',<br>        ...req.body<br>      })<br>    );<br>  })<br>];</p>\n\n<p>export const worker = setupWorker(...handlers);</p>\n\n<p>// No test<br>import { worker } from \'./mocks/browser\';</p>\n\n<p>beforeAll(() =&gt; worker.start());<br>afterAll(() =&gt; worker.stop());</p>\n\n<p>test(\'payment flow\', async () =&gt; {<br>  render();</p>\n\n<p>// MSW intercepta requisição<br>  await userEvent.type(screen.getByLabelText(\'Valor\'), \'100\');<br>  await userEvent.click(screen.getByRole(\'button\', { name: /pagar/i }));</p>\n\n<p>expect(await screen.findByText(/transação aprovada/i)).toBeInTheDocument();<br>});<br></code></pre></p>\n\n<hr>\n<h2>TestContainers vs Fakes</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Aspecto</th><th>TestContainers</th><th>Fakes</th></tr>\n<tr><td><strong>Fidelidade</strong></td><td>Real service</td><td>Simulado</td></tr>\n<tr><td><strong>Velocidade</strong></td><td>Lento (minutos)</td><td>Rápido (ms)</td></tr>\n<tr><td><strong>Complexidade</strong></td><td>Alta</td><td>Baixa</td></tr>\n<tr><td><strong>Bugs encontrados</strong></td><td>Mais realistas</td><td>Menos</td></tr>\n<tr><td><strong>Manutenção</strong></td><td>Baixa</td><td>Alta (manter fakes)</td></tr>\n</table></figure>\n\n<h3>Quando Usar Cada</h3>\n\n<pre><code># Use FAKE quando:\n# - Precisa de respostas específicas/edge cases\n# - Performance é crítica\n# - Serviço externo é lento/não disponível\n# - Quer testar comportamento, não implementação\n\n<p># Use TestContainers quando:<br># - Precisa de comportamento real<br># - Testando integrações complexas<br># - Quer detectar problemas realistas<br># - Manutenção do fake seria muito complexa<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Mocks e fakes são essenciais para testes isolados. As chaves são:<br><ol><li><strong>Isolar</strong> - Testes não devem depender de externos</li><br><li><strong>Velocidade</strong> - Fakes são rápidos</li><br><li><strong>Verossimilhança</strong> - Fakes devem ser realistas</li><br><li><strong>Manutenção</strong> - Mocks automáticos vs manuais</li><br><li><strong>Combinar</strong> - Fakes + TestContainers quando necessário</li></ol></p>', 'Fake Services e Mocking: Isolando Dependências Externas', '', 'publish', 'closed', 'open', '', '32fakesmocks', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/32fakesmocks/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('210', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda testes de acessibilidade: WCAG 2.1, axe-core, Lighthouse, testes manuais e como garantir que seus apps são acessíveis.</p>\n\n<hr>\n<h2>Por Que Acessibilidade Importa?</h2>\n\n<ul><li><strong>1.3 bilhões</strong> de pessoas com deficiência no mundo</li><ol><li><strong>Leis</strong> como ADA, LGPD, EU Accessibility Act</li>\n<li><strong>SEO</strong> - Google prioriza sites acessíveis</li>\n<li><strong>Reputação</strong> - Marca inclusiva</li>\n<li><strong>Mercado</strong> - P público que você está excluindo</li>\n</ol>\n<hr>\n<h2>WCAG 2.1 - Princípios</h2>\n\n<h3>4 Princípios (POUR)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Princípio</th><th>Descrição</th></tr>\n<tr><td><strong>Perceivable</strong></td><td>Informações devem ser perceptíveis</td></tr>\n<tr><td><strong>Operable</strong></td><td>Interface deve ser operável</td></tr>\n<tr><td><strong>Understandable</strong></td><td>Informações e interface compreensíveis</td></tr>\n<tr><td><strong>Robust</strong></td><td>Conteúdo deve funcionar com tecnologias assistivas</td></tr>\n</table></figure>\n\n<h3>Níveis de Conformidade</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Nível</th><th>Significado</th><th>Requisito</th></tr>\n<tr><td><strong>A</strong></td><td>Básico</td><td>Mínimo, deve atender</td></tr>\n<tr><td><strong>AA</strong></td><td>Padrão</td><td>Recomendado, maioria das leis</td></tr>\n<tr><td><strong>AAA</strong></td><td>Avançado</td><td>Mais rigoroso, poucos достигают</td></tr>\n</table></figure>\n\n<hr>\n<h2>Ferramentas Automatizadas</h2>\n\n<h3>axe-core</h3>\n\n<pre><code>// Npm\nnpm install @axe-core/playwright\n\n<p>// Playwright integration<br>const { chromium } = require(\'playwright\');<br>const AxeBuilder = require(\'@axe-core/playwright\').default;</p>\n\n<p>async function runAccessibilityTest() {<br>    const browser = await chromium.launch();<br>    const page = await browser.newPage();</p>\n\n<p>await page.goto(\'https://example.com\');</p>\n\n<p>const results = await new AxeBuilder({ page })<br>        .withTags([\'wcag2a\', \'wcag2aa\', \'wcag21aa\'])<br>        .analyze();</p>\n\n<p>console.log(\'Violations:\', results.violations.length);<br>    results.violations.forEach(v =&gt; {<br>        console.log(<code>- ${v.id}: ${v.description}</code>);<br>    });</p>\n\n<p>await browser.close();<br>}<br></code></pre></p>\n\n<h3>Lighthouse CI</h3>\n\n<pre><code># GitHub Actions<ol><li>name: Lighthouse</li>\n</ol>  uses: treosh/lighthouse-ci-action@v10\n  with:\n    urls: https://example.com\n    budgetPath: ./lighthouserc.json\n    uploadArtifacts: true\n</code></pre>\n\n<pre><code>// lighthouserc.json\n{\n  \"ci\": {\n    \"collect\": {\n      \"settings\": {\n        \"staticDistDir\": \"./dist\"\n      }\n    },\n    \"assert\": {\n      \"assertions\": {\n        \"categories:accessibility\": [\"error\", {\"minScore\": 0.9}],\n        \"first-contentful-paint\": [\"warn\", { \"maxNumericValue\": 2000 }],\n        \"uses-passive-event-listeners\": \"off\"\n      }\n    }\n  }\n}\n</code></pre>\n\n<hr>\n<h2>Testes Manuais</h2>\n\n<h3>Checklist de Teclado</h3>\n\n<pre><code><h2>Navegação por Teclado</h2>\n\n<h3>Essential</h3><ol><li>[ ] Tab avança logicamente entre elementos</li>\n<li>[ ] Shift+Tab retorna ao elemento anterior</li>\n<li>[ ] Enter ativa botões e links</li>\n<li>[ ] Space ativa botões e checkboxes</li>\n<li>[ ] Escape fecha modais e dropdowns</li>\n<li>[ ] Setas navegam em menus</li>\n</ol>\n<h3>Skip Links</h3><ol><li>[ ] Link \"Skip to main content\" existe</li>\n<li>[ ] Link é visível quando focado</li>\n<li>[ ] Link funciona corretamente</li>\n</ol>\n<h3>Focus Indicators</h3><ol><li>[ ] Focus é sempre visível</li>\n<li>[ ] Estilo de focus não é apenas cor</li>\n<li>[ ] Focus não desaparece em nenhum elemento</li>\n</ol></code></pre>\n\n<h3>Checklist de Screen Reader</h3>\n\n<pre><code><h2>Screen Reader Testing</h2>\n\n<h3>Imagens</h3><ol><li>[ ] Alt text em todas imagens informativas</li>\n<li>[ ] Alt text é descritivo e útil</li>\n<li>[ ] Imagens decorativas têm alt=\"\"</li>\n<li>[ ] SVG complexos têm descriptions</li>\n</ol>\n<h3>Formulários</h3><ol><li>[ ] Labels associados corretamente (for/id)</li>\n<li>[ ] Placeholder não substitui label</li>\n<li>[ ] Erros anunciados</li>\n<li>[ ] Required fields marcados</li>\n</ol>\n<h3>Heading Structure</h3><ol><li>[ ] h1 é único na página</li>\n<li>[ ] Hierarquia lógica (h1 &gt; h2 &gt; h3)</li>\n<li>[ ] Sem saltos (h1 &gt; h3, pulando h2)</li>\n<li>[ ] Headings não são só visuais</li>\n</ol>\n<h3>Links e Botões</h3><ol><li>[ ] Links fazem sentido fora de contexto</li>\n<li>[ ] Botões descrevem ação</li>\n<li>[ ] Links novos/abrem em nova aba avisados</li></ol></ul>\n</code></pre>\n\n<hr>\n<h2>Implementando Acessibilidade</h2>\n\n<h3>ARIA Basics</h3>\n\n<pre><code><!-- Botão com acessibilidade -->\n<button aria-label=\"Fechar modal\" aria-expanded=\"false\" aria-controls=\"modal-content\">\n  <span aria-hidden=\"true\">×</span>\n</button>\n\n<p><!-- Modal com ARIA --><br>&lt;div <br>  role=\"dialog\" <br>  aria-labelledby=\"modal-title\"<br>  aria-describedby=\"modal-desc\"<br>  aria-modal=\"true\"<br>&gt;<br>  <h2 id=\"modal-title\">Confirmação</h2><br>  <p id=\"modal-desc\">Tem certeza que deseja excluir?</p><br>  <button>Cancelar</button><br>  <button>Excluir</button><br></div></p>\n\n<p><!-- Live region para updates --><br><div aria-live=\"polite\"><br>  <!-- Conteúdo atualizado dinamicamente --><br></div></p>\n\n<p><!-- Error message --><br><label for=\"email\">Email</label><br><br><span id=\"email-error\" class=\"error\" role=\"alert\"><br>  Email inválido<br></span><br></code></pre></p>\n\n<h3>CSS para Acessibilidade</h3>\n\n<pre><code>/<em> Focus visível </em>/\n*:focus {\n  outline: 3px solid #005fcc;\n  outline-offset: 2px;\n}\n\n<p>/<em> Esconde visualmente mas mantém para screen readers </em>/<br>.sr-only {<br>  position: absolute;<br>  width: 1px;<br>  height: 1px;<br>  padding: 0;<br>  margin: -1px;<br>  overflow: hidden;<br>  clip: rect(0, 0, 0, 0);<br>  white-space: nowrap;<br>  border: 0;<br>}</p>\n\n<p>/<em> Skip link </em>/<br>.skip-link {<br>  position: absolute;<br>  top: -40px;<br>  left: 0;<br>  background: #000;<br>  color: #fff;<br>  padding: 8px;<br>  z-index: 100;<br>}</p>\n\n<p>.skip-link:focus {<br>  top: 0;<br>}</p>\n\n<p>/<em> Contraste adequado </em>/<br>.text-primary {<br>  color: #1a1a1a; /<em> Não use #777777 com fundo branco </em>/<br>}</p>\n\n<p>/<em> Touch target mínimo </em>/<br>button, a, input[type=\"checkbox\"] {<br>  min-height: 44px;<br>  min-width: 44px;<br>}<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Acessibilidade é responsabilidade de todos. As chaves são:<br><ol><li><strong>Testar cedo</strong> - A11y mais barato no início</li><br><li><strong>Automatizar</strong> - axe-core, Lighthouse</li><br><li><strong>Testar manualmente</strong> - Teclado, screen reader</li><br><li><strong>Seguir WCAG</strong> - 2.1 AA como mínimo</li><br><li><strong>Incluir na cultura</strong> - A11y não é \"extra\"</li></ol></p>', 'Testes de Acessibilidade: WCAG e Inclusão Digital', '', 'publish', 'closed', 'open', '', '32testesacessibilidade', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/32testesacessibilidade/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('211', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda Chaos Engineering: princípios, ferramentas (Chaos Monkey, Gremlin), inject faults deliberadamente e garantir resiliência do sistema.</p>\n\n<hr>\n<h2>O Que é Chaos Engineering?</h2>\n\n<p>Chaos Engineering é a prática de injectar falhas deliberadamente em sistemas para testar resiliência e descobrir vulnerabilidades antes que elas causem problemas em produção.</p>\n\n<h3>Princípios</h3>\n<ol><li><strong>Hipótese primeiro</strong>: Defina o que você quer testar</li>\n<li><strong>Comece pequeno</strong>: Aumente gradualmente</li>\n<li><strong>Máximo impacto, mínimo dano</strong>: Controle o blast radius</li>\n<li><strong>Monitore sempre</strong>: Observe métricas durante experimentos</li>\n<li><strong>Automação</strong>: Execute experimentos continuamente</li>\n</ol>\n<hr>\n<h2>Prática de Chaos Engineering</h2>\n\n<h3>Ciclo de Experimentos</h3>\n\n<pre><code>┌─────────────────────────────────────┐\n│                                     │\n│  1. Define Hipótese                 │\n│     \"O sistema funciona se DB cair\"  │\n│                                     │\n│  2. Planeja Experimento             │\n│     \"DB node mata por 60s\"          │\n│                                     │\n│  3. Executa em Prod-like            │\n│     \"Staging environment\"           │\n│                                     │\n│  4. Observa Métricas                │\n│     \"Taxa de erro aumenta?\"          │\n│                                     │\n│  5. Analisa Resultados              │\n│     \"Sistema degradou graciosamente\"│\n│                                     │\n│  6. Melhora Sistema                 │\n│     \"Adicionar circuit breaker\"      │\n│                                     │\n└─────────────────────────────────────┘\n</code></pre>\n\n<h3>Hipóteses de Teste</h3>\n\n<pre><code># Hipóteses de Chaos Engineering\n\n<h2>1. Alta Disponibilidade</h2>\nHipótese: \"Se um node da API morrer, o sistema continuará funcionando\"\nExperimento: Matar 1 instance de API\nMétricas: Throughput, error rate, latency\nResultado Esperado: Throughput cai 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}, mas sem erros 5xx\n\n<h2>2. Database Resilience</h2>\nHipótese: \"Se o banco primário ficar indisponível, failover ocurrerrá automaticamente\"\nExperimento: Matar database primary\nMétricas: Time to failover, error rate\nResultado Esperado: Failover em &lt;60s, erros apenas durante transição\n\n<h2>3. Network Partition</h2>\nHipótese: \"Se rede entre serviços degrada, retry logic funcionará\"\nExperimento: Adicionar latência de 500ms\nMétricas: Retry count, timeout rate\nResultado Esperado: Retries com backoff, nenhum erro usuário final\n\n<h2>4. Memory Leak</h2>\nHipótese: \"Se memory leak ocurrer, sistema reiniciará corretamente\"\nExperimento: Simular leak por alocar memória\nMétricas: Memory usage, restart count\nResultado Esperado: Service restart gracefully\n</code></pre>\n\n<hr>\n<h2>Ferramentas</h2>\n\n<h3>Chaos Monkey</h3>\n\n<pre><code># Instalação\nbrew install chaos-monkey\n# ou\ndocker pull chaosmonkey/chaos-monkey\n\n<p># Configuração (chaos-monkey.json)<br>{<br>  \"enabled\": true,<br>  \"runScheme\": \"fixed\",<br>  \"startTime\": \"08:00\",<br>  \"endTime\": \"20:00\",<br>  \"daysOfWeek\": [\"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\"],<br>  \"kind\": \"exp-random\",<br>  \"services\": [<br>    {<br>      \"name\": \"api-service\",<br>      \"probability\": 30,<br>      \"attacks\": [\"kill-container\"]<br>    },<br>    {<br>      \"name\": \"payment-service\",<br>      \"probability\": 50,<br>      \"attacks\": [\"network-latency\"]<br>    }<br>  ]<br>}</p>\n\n<p># Executar<br>chaos-monkey run --config chaos-monkey.json<br></code></pre></p>\n\n<h3>Gremlin</h3>\n\n<pre><code># CLI Installation\ncurl - https://www.gremlin.com/gremlin-cli.tar.gz | tar -xz\nsudo mv gremlin /usr/local/bin/\n\n<p># Initialize<br>gremlin init --teamid YOUR_TEAM_ID --secret YOUR_SECRET</p>\n\n<p># Attack Examples</p>\n\n<p># 1. CPU Attack<br>gremlin attack cpu --length 60 --percent 100</p>\n\n<p># 2. Memory Attack<br>gremlin attack memory --length 60 --percent 50</p>\n\n<p># 3. IO Attack<br>gremlin attack io --length 60 --percent 100</p>\n\n<p># 4. Network Attack<br>gremlin attack network --delay 500 --loss 10 --percent 50</p>\n\n<p># 5. Process Kill<br>gremlin attack process --process-name nginx</p>\n\n<p># 6. DNS Attack<br>gremlin attack dns --hostname api.example.com --ip 127.0.0.1<br></code></pre></p>\n\n<h3>LitmusChaos (Kubernetes)</h3>\n\n<pre><code># Pod Delete Experiment\napiVersion: litmuschaos.io/v1alpha1\nkind: ChaosEngine\nmetadata:\n  name: pod-delete-chaos\n  namespace: litmus\nspec:\n  appinfo:\n    appns: production\n    applabel: \"app=api\"\n  chaosServiceAccount: litmus-admin\n  experiments:\n    - name: pod-delete\n      spec:\n        components:\n          env:\n            - name: TOTAL_CHAOS_DURATION\n              value: \'30\'\n            - name: CHAOS_INTERVAL\n              value: \'10\'\n            - name: FORCE\n              value: \'false\'\n</code></pre>\n\n<hr>\n<h2>Exemplos de Experimentos</h2>\n\n<h3>1. API Latency Injection</h3>\n\n<pre><code># Testando timeout e retry\nimport requests\nimport time\nimport random\n\n<p>def test_api_resilience():<br>    \"\"\"<br>    Hipótese: API cliente deve ter timeout e retry configurados<br>    \"\"\"<br>    base_url = \"http://api-service:8080\"<br>    timeouts = 0<br>    successes = 0<br>    retries = 0</p>\n\n<p>for i in range(100):<br>        try:<br>            response = requests.get(<br>                f\"{base_url}/data\",<br>                timeout=5,<br>                headers={\"X-Client-Id\": f\"test-{i}\"}<br>            )<br>            if response.status_code == 200:<br>                successes += 1<br>        except requests.Timeout:<br>            timeouts += 1<br>        except requests.ConnectionError:<br>            retries += 1</p>\n\n<p># Assertions<br>    assert successes &gt;= 90, f\"Only {successes}{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} success rate\"<br>    assert timeouts &lt;= 5, f&quot;Too many timeouts: {timeouts}&quot;<br></code></pre></p>\n\n<h3>2. Database Failover</h3>\n\n<pre><code># Teste manual de failover\n# 1. Identificar primary\npsql -h db-cluster -c \"SELECT pg_is_in_recovery();\"\n\n<p># 2. Simular failure no primary<br># (Em produção, usar orquestrador)</p>\n\n<p># 3. Verificar failover<br>psql -h db-cluster -c \"SELECT pg_is_in_recovery();\"<br># Deve retornar \'t\' no novo primary</p>\n\n<p># 4. Verificar aplicação<br>curl http://api-service:8080/health<br># Deve estar healthy após breve degradation<br></code></pre></p>\n\n<h3>3. Network Partition</h3>\n\n<pre><code># iptables para simular latência\n# Adicionar latência\niptables -A INPUT -p tcp --dport 5432 -m state --state NEW \n  -m recent --set --name DBPOSTGRES\n\n<p>iptables -A INPUT -p tcp --dport 5432 -m state --state NEW <br>  -m recent --update --seconds 1 --hitcount 10 --name DBPOSTGRES <br>  -j DROP</p>\n\n<p># Adicionar delay de 500ms<br>tc qdisc add dev eth0 root netem delay 500ms</p>\n\n<p># Remover (cleanup)<br>tc qdisc del dev eth0 root<br></code></pre></p>\n\n<h3>4. Container Kill</h3>\n\n<pre><code>#!/bin/bash\n# chaos-test.sh\n\n<p>echo \"=== Chaos Engineering Test ===\"<br>echo \"Target: Random API pod\"</p>\n\n<p># Get random API pod<br>POD=$(kubectl get pods -n production -l app=api <br>  -o jsonpath=\'{.items[0].metadata.name}\')</p>\n\n<p>echo \"Killing pod: $POD\"</p>\n\n<p># Get metrics before<br>kubectl top pods $POD -n production<br>ERROR_RATE_BEFORE=$(curl -s http://api-service/metrics | grep error_rate)</p>\n\n<p># Kill pod<br>kubectl delete pod $POD -n production</p>\n\n<p># Monitor recovery<br>echo \"Monitoring recovery...\"<br>for i in {1..30}; do<br>    RESPONSE=$(curl -s -o /dev/null -w \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}{http_code}\" http://api-service/health)<br>    if [ \"$RESPONSE\" == \"200\" ]; then<br>        echo \"Recovered after ${i} seconds\"<br>        break<br>    fi<br>    sleep 1<br>done</p>\n\n<p># Get metrics after<br>kubectl top pods -n production -l app=api<br>ERROR_RATE_AFTER=$(curl -s http://api-service/metrics | grep error_rate)</p>\n\n<p>echo \"Error rate before: $ERROR_RATE_BEFORE\"<br>echo \"Error rate after: $ERROR_RATE_AFTER\"</p>\n\n<p># Validate<br>if [ $i -lt 30 ]; then<br>    echo \"✅ Recovery successful\"<br>else<br>    echo \"❌ Recovery failed\"<br>    exit 1<br>fi<br></code></pre></p>\n\n<hr>\n<h2>SRE错误预算 (Error Budgets)</h2>\n\n<pre><code># Error Budget Calculator\nclass ErrorBudget:\n    def __init__(self, slo_percentage, window_days=30):\n        self.slo = slo_percentage / 100\n        self.window_hours = window_days <em> 24 </em> 60 * 60\n\n<p>def allowed_downtime(self):<br>        \"\"\"Tempo máximo de downtime permitido\"\"\"<br>        return (1 - self.slo) * self.window_hours</p>\n\n<p>def current_budget(self, actual_uptime):<br>        \"\"\"Orçamento restante\"\"\"<br>        budget_used = (1 - actual_uptime) * self.window_hours<br>        return self.allowed_downtime() - budget_used</p>\n\n<p>def budget_remaining_percentage(self, actual_uptime):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de orçamento restante\"\"\"<br>        budget = self.current_budget(actual_uptime)<br>        return (budget / self.allowed_downtime()) * 100</p>\n\n<p># Uso<br>budget = ErrorBudget(slo_percentage=99.9, window_days=30)<br>allowed = budget.allowed_downtime()<br>print(f\"Allowed downtime: {allowed/60:.1f} minutes per month\")</p>\n\n<p># Verificar se pode fazer chaos<br>actual_uptime = 0.998  # 99.8{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>remaining = budget.budget_remaining_percentage(actual_uptime)<br>print(f\"Budget remaining: {remaining:.1f}{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\")</p>\n\n<p>if remaining &gt; 50:<br>    print(\"✅ Safe to run chaos experiments\")<br>else:<br>    print(\"⚠️ Budget low, avoid chaos\")<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Chaos Engineeringprevine falhas em produção. As chaves são:<br><ol><li><strong>Comece com hipóteses</strong> - O que você quer provar?</li><br><li><strong>Amplitude controlada</strong> - Limite o blast radius</li><br><li><strong>Monitore</strong> - Observabilidade durante experimentos</li><br><li><strong>Automação</strong> - Execute continuamente</li><br><li><strong>Cultura</strong> - Aprenda com falhas, não puna</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Chaos Engineering é seguro?</strong>  <br>R: Sim, quando feito com controle de blast radius e rollback.</p>\n\n<p><strong>P: Quando começar?</strong>  <br>R: Quando você tiver observabilidade básica (métricas, logs, alertas).</p>\n\n<p><strong>P: Qual ambiente usar?</strong>  <br>R: Comece em staging, depois produção controlada.</p>', 'Chaos Engineering: Testando Resiliência e Confiabilidade', '', 'publish', 'closed', 'open', '', '33chaosengineering', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/33chaosengineering/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('212', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda Cucumber e Gherkin: escrever cenários BDD, step definitions, hooks, tags e como implementar desenvolvimento guiado por comportamento.</p>\n\n<hr>\n<h2>Cucumber Framework</h2>\n\n<p>Cucumber é uma ferramenta que permite escrever testes em linguagem natural (Gherkin) que são executados automaticamente.</p>\n\n<h3>Instalação</h3>\n\n<pre><code># Ruby\ngem install cucumber\n\n<p># Java (Maven)<br><br>    io.cucumber<br>    cucumber-java<br>    7.14.0<br></p>\n\n<p># Python<br>pip install behave</p>\n\n<p># JavaScript<br>npm install @cucumber/cucumber<br></code></pre></p>\n\n<hr>\n<h2>Gherkin - Linguagem</h2>\n\n<h3>Estrutura Básica</h3>\n\n<pre><code>Funcionalidade: Login de Usuário\n  Como um usuário registrado\n  Quero fazer login no sistema\n  Para acessar minha conta\n\n<p>Cenário: Login com credenciais válidas<br>    Dado que estou na página de login<br>    Quando preencho o campo email com \"usuario@exemplo.com\"<br>    E preencho o campo senha com \"senha123\"<br>    E clico no botão \"Entrar\"<br>    Então sou redirecionado para o dashboard<br>    E vejo a mensagem \"Bem-vindo, usuário\"</p>\n\n<p>Cenário: Login com credenciais inválidas<br>    Dado que estou na página de login<br>    Quando preencho o campo email com \"invalido@exemplo.com\"<br>    E preencho o campo senha com \"senhaerrada\"<br>    E clico no botão \"Entrar\"<br>    Então vejo a mensagem de erro \"Credenciais inválidas\"<br>    E permaneço na página de login<br></code></pre></p>\n\n<h3>Keywords</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Keyword</th><th>Usage</th></tr>\n<tr><td>Funcionalidade</td><td>Nome do recurso</td></tr>\n<tr><td>Cenário</td><td>Caso de uso</td></tr>\n<tr><td>Dado</td><td>Pré-condição</td></tr>\n<tr><td>Quando</td><td>Ação</td></tr>\n<tr><td>Então</td><td>Resultado esperado</td></tr>\n<tr><td>E</td><td>Adiciona condição</td></tr>\n<tr><td>Mas</td><td>Condição negativa</td></tr>\n<tr><td>Esquema do Cenário</td><td>Cenário com parâmetros</td></tr>\n<tr><td>Exemplos</td><td>Tabela de dados</td></tr>\n</table></figure>\n\n<hr>\n<h2>Step Definitions</h2>\n\n<h3>Python (Behave)</h3>\n\n<pre><code># features/steps/login_steps.py\nfrom behave import given, when, then\nfrom selenium.webdriver.common.by import By\n\n<p>@given(\'estou na página de login\')<br>def step_impl(context):<br>    context.browser.get(\'https://exemplo.com/login\')</p>\n\n<p>@when(\'preencho o campo email com \"{email}\"\')<br>def step_impl(context, email):<br>    element = context.browser.find_element(By.ID, \'email\')<br>    element.send_keys(email)</p>\n\n<p>@when(\'preencho o campo senha com \"{senha}\"\')<br>def step_impl(context, senha):<br>    element = context.browser.find_element(By.ID, \'password\')<br>    element.send_keys(senha)</p>\n\n<p>@when(\'clico no botão \"{texto}\"\')<br>def step_impl(context, texto):<br>    buttons = context.browser.find_elements(By.TAG_NAME, \'button\')<br>    for button in buttons:<br>        if button.text == texto:<br>            button.click()<br>            break</p>\n\n<p>@then(\'sou redirecionado para o dashboard\')<br>def step_impl(context):<br>    assert \'dashboard\' in context.browser.current_url</p>\n\n<p>@then(\'vejo a mensagem \"{texto}\"\')<br>def step_impl(context, texto):<br>    assert texto in context.browser.page_source<br></code></pre></p>\n\n<h3>Java (Cucumber)</h3>\n\n<pre><code>// src/test/java/steps/LoginSteps.java\npackage steps;\n\n<p>import io.cucumber.java.pt.*;<br>import org.openqa.selenium.By;<br>import static org.junit.Assert.*;</p>\n\n<p>public class LoginSteps {</p>\n\n<p>WebDriver driver = Hooks.driver;</p>\n\n<p>@Dado(\"estou na página de login\")<br>    public void estouNaPaginaDeLogin() {<br>        driver.get(\"https://exemplo.com/login\");<br>    }</p>\n\n<p>@Quando(\"preencho o campo email com {string}\")<br>    public void preenchoEmail(String email) {<br>        driver.findElement(By.id(\"email\")).sendKeys(email);<br>    }</p>\n\n<p>@Quando(\"preencho o campo senha com {string}\")<br>    public void preenchoSenha(String senha) {<br>        driver.findElement(By.id(\"password\")).sendKeys(senha);<br>    }</p>\n\n<p>@Quando(\"clico no botão {string}\")<br>    public void clicoNoBotao(String texto) {<br>        driver.findElement(By.xpath(\"//button[text()=\'\" + texto + \"\']\")).click();<br>    }</p>\n\n<p>@Então(\"sou redirecionado para o dashboard\")<br>    public void souRedirecionado() {<br>        assertTrue(driver.getCurrentUrl().contains(\"dashboard\"));<br>    }</p>\n\n<p>@Então(\"vejo a mensagem {string}\")<br>    public void vejoMensagem(String mensagem) {<br>        assertTrue(driver.getPageSource().contains(mensagem));<br>    }<br>}<br></code></pre></p>\n\n<hr>\n<h2>Data Tables</h2>\n\n<pre><code>Funcionalidade: Carrinho de Compras\n\n<p>Cenário: Adicionar múltiplos produtos ao carrinho<br>    Quando adiciono os seguintes produtos ao carrinho:<br>      | Produto    | Quantidade | Preço  |<br>      | Camiseta  | 2         | R$49,90|<br>      | Calça     | 1         | R$89,90|<br>      | Tênis     | 1         | R$199,90|<br>    Então o total do carrinho deve ser R$389,70<br></code></pre></p>\n\n<pre><code># Step with table\n@when(\'adiciono os seguintes produtos ao carrinho\')\ndef step_impl(context):\n    total = Decimal(\'0\')\n    for row in context.table:\n        product = row[\'Produto\']\n        quantity = int(row[\'Quantidade\'])\n        price = Decimal(row[\'Preço\'].replace(\'R$\', \'\').replace(\',\', \'.\'))\n\n<p># Add to cart logic<br>        add_to_cart(product, quantity)</p>\n\n<p>total += price * quantity</p>\n\n<p>context.expected_total = total<br></code></pre></p>\n\n<hr>\n<h2>Hooks</h2>\n\n<pre><code># features/environment.py\nfrom behave import *\nfrom selenium import webdriver\n\n<p>def before_all(context):<br>    \"\"\"Executa antes de tudo\"\"\"<br>    context.browser = webdriver.Chrome()</p>\n\n<p>def after_all(context):<br>    \"\"\"Executa após tudo\"\"\"<br>    context.browser.quit()</p>\n\n<p>def before_scenario(context, scenario):<br>    \"\"\"Executa antes de cada cenário\"\"\"<br>    context.browser.delete_all_cookies()</p>\n\n<p>def after_scenario(context, scenario):<br>    \"\"\"Executa após cada cenário\"\"\"<br>    if scenario.status == \'failed\':<br>        # Take screenshot<br>        context.browser.save_screenshot(f\'failed_{scenario.name}.png\')</p>\n\n<p>def before_step(context, step):<br>    \"\"\"Executa antes de cada step\"\"\"<br>    pass</p>\n\n<p>def after_step(context, step):<br>    \"\"\"Executa após cada step\"\"\"<br>    if step.status == \'failed\':<br>        print(f\"Step failed: {step.name}\")<br></code></pre></p>\n\n<hr>\n<h2>Tags</h2>\n\n<pre><code>@smoke @login\nFuncionalidade: Login\n\n<p>@critical<br>  Cenário: Login com sucesso<br>    ...</p>\n\n<p>Cenário: Login com falha<br>    ...</p>\n\n<p>@regression<br>Funcionalidade: Carrinho<br>  ...<br></code></pre></p>\n\n<pre><code># Executar apenas com tag\nbehave --tags=@smoke\nbehave --tags=\"not @skip\"\nbehave --tags=\"@smoke,@login\"  # OR\nbehave --tags=\"@smoke+@critical\"  # AND\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Cucumber/Gherkin facilita comunicação entre equipes. As chaves são:<br><ol><li><strong>Linguagem de negócio</strong> - Todos entendem</li><br><li><strong>Step definitions</strong> - Conecta Gherkin a código</li><br><li><strong>Hooks</strong> - Setup/teardown</li><br><li><strong>Tags</strong> - Selecionar cenários</li><br><li><strong>Data tables</strong> - Dados complexos</li></ol></p>', 'Cucumber e Gherkin: Automação BDD com Exemplos Práticos', '', 'publish', 'closed', 'open', '', '34cucumbergherkin', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/34cucumbergherkin/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('213', '0', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '<p><strong>Meta Description:</strong> Aprenda testes de contrato: Pact, contratos entre microservices, consumer-driven testing e como evitar breaking changes.</p>\n\n<hr>\n<h2>O Que São Testes de Contrato?</h2>\n\n<p>Testes de contrato verificam que a interface entre serviços (API) está funcionando conforme acordado. Cada serviço define o que espera e o que fornece.</p>\n\n<h3>Problema</h3>\n\n<pre><code>Microservice A (Consumer)\n        ↓\n    API REST\n        ↓\nMicroservice B (Provider)\n\n<p>Se B muda API sem avisar A → BUG!<br></code></pre></p>\n\n<h3>Solução: Contract Testing</h3>\n\n<pre><code>┌─────────────┐                    ┌─────────────┐\n│  Consumer   │    Contract       │  Provider   │\n│   Test      │ ←──────────────→ │   Test      │\n└─────────────┘                    └─────────────┘\n     ↓                                  ↓\n[Pact Broker] ←──────────────────────────\n</code></pre>\n\n<hr>\n<h2>Pact - Framework de Contract Testing</h2>\n\n<h3>Setup</h3>\n\n<pre><code># Ruby\ngem install pact\n\n<p># Python<br>pip install pact-python</p>\n\n<p># Java<br><br>    au.com.dius.pact<br>    jvm-consumer<br>    4.6.4<br><br></code></pre></p>\n\n<h3>Consumer Test (Python)</h3>\n\n<pre><code># test_consumer.py\nimport pact\n\n<p># Provider URL<br>PACT_MOCK_PROVIDER_URL = \"http://localhost:1234\"</p>\n\n<p># Define consumer and provider<br>consumer = pact.Consumer(\'OrderService\')<br>provider = pact.Provider(\'ProductService\')</p>\n\n<p># Create pact<br>order_service_pact = consumer.has_pact_with(<br>    provider,<br>    pact_dir=\'./pacts\',<br>    log_dir=\'./logs\'<br>)</p>\n\n<p># Test<br>order_service_pact.given(<br>    \'product with id 1 exists\'<br>).upon_receiving(<br>    \'a request for product details\'<br>).with_request(<br>    method=\'GET\',<br>    path=\'/products/1\'<br>).will_respond_with(<br>    status=200,<br>    headers={\'Content-Type\': \'application/json\'},<br>    body={<br>        \'id\': 1,<br>        \'name\': pact.Match.something_like(\'Test Product\'),<br>        \'price\': pact.Match.decimal(99.99),<br>        \'in_stock\': pact.Match.boolean(True)<br>    }<br>)</p>\n\n<p># Verify<br>with order_service_pact:<br>    result = requests.get(f\'{PACT_MOCK_PROVIDER_URL}/products/1\')<br>    assert result.status_code == 200<br>    assert result.json()[\'name\'] == \'Test Product\'<br></code></pre></p>\n\n<h3>Provider Test (Python)</h3>\n\n<pre><code># test_provider.py\nimport pact\nfrom pact import Verifier\n\n<p># Verify against provider<br>verifier = Verifier(<br>    provider=\'ProductService\',<br>    provider_base_url=\'http://localhost:8000\'<br>)</p>\n\n<p># Set up Pact file to verify<br>verifier.provider_states(<br>    \'http://localhost:8000\',<br>    set_up=lambda state: create_test_product() if state == \'product with id 1 exists\' else None,<br>    tear_down=lambda state: delete_test_product() if state == \'product with id 1 exists\' else None<br>)</p>\n\n<p># Verify contracts<br>result = verifier.verify_pacts(<br>    \'./pacts/order_service-product_service.json\',<br>    verbose=True<br>)</p>\n\n<p>assert result == 0, f\"Pact verification failed: {result}\"<br></code></pre></p>\n\n<hr>\n<h2>Pact Broker</h2>\n\n<pre><code># Publish contract\npact-broker publish ./pacts \n  --consumer-app-version=1.0.0 \n  --broker-base-url=https://pact-broker.example.com \n  --broker-token=YOUR_TOKEN\n\n<p># Can I Deploy?<br>pact-broker can-i-deploy <br>  --pacticipant=OrderService <br>  --version=1.0.0 <br>  --to-environment=production<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Contract testing previne breaking changes. As chaves são:<br><ol><li><strong>Consumer-driven</strong> - Cada cliente define necessidades</li><br><li><strong>Pact broker</strong> - Centraliza contratos</li><br><li><strong>Verificação contínua</strong> - CI valida mudanças</li><br><li><strong>Can I Deploy</strong> - Bloca deploys incompatíveis</li></ol></p>', 'Testes de Contrato: Consumer-Driven Contracts', '', 'publish', 'closed', 'open', '', '35contracttesting', '', '', '2026-07-06 23:05:57', '2026-07-07 02:05:57', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/35contracttesting/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('214', '0', '2026-07-06 23:05:58', '2026-07-07 02:05:58', '<p><strong>Meta Description:</strong> Aprenda Testcontainers: containers Docker para testes, databases, message brokers, como criar ambientes reprodutíveis.</p>\n\n<hr>\n<h2>O Que São Testcontainers?</h2>\n\n<p>Testcontainers é uma biblioteca que facilita o uso de containers Docker para testes automatizados. Cada teste consegue seu próprio container isolado.</p>\n\n<h3>Benefícios</h3>\n\n<ul><li><strong>Isolamento</strong> - Cada teste tem seu ambiente</li><ol><li><strong>Reprodutibilidade</strong> - Mesmo ambiente sempre</li>\n<li><strong>Realismo</strong> - Testa contra serviços reais</li>\n<li><strong>Cleanup automático</strong> - Containers são removidos</li></ol></ul>\n\n<hr>\n<h2>Setup</h2>\n\n<pre><code><!-- Java/Maven -->\n\n    org.testcontainers\n    testcontainers\n    1.19.3\n\n\n<p><!-- Python --><br>pip install testcontainers</p>\n\n<p><!-- Go --><br>go get github.com/testcontainers/testcontainers-go</p>\n\n<p><!-- Node.js --><br>npm install @testcontainers<br></code></pre></p>\n\n<hr>\n<h2>Exemplos</h2>\n\n<h3>PostgreSQL (Python)</h3>\n\n<pre><code># test_database.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\nimport psycopg2\n\n<p>@pytest.fixture(scope=\"module\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15-alpine\") as pg:<br>        yield pg</p>\n\n<p>def test_database_connection(postgres):<br>    # Get connection string<br>    connection_url = postgres.get_connection_url()</p>\n\n<p># Connect<br>    conn = psycopg2.connect(connection_url)<br>    cursor = conn.cursor()</p>\n\n<p># Test<br>    cursor.execute(\"SELECT version();\")<br>    version = cursor.fetchone()</p>\n\n<p>assert \"PostgreSQL\" in version[0]</p>\n\n<p>cursor.close()<br>    conn.close()</p>\n\n<p>def test_create_table(postgres):<br>    conn = psycopg2.connect(postgres.get_connection_url())<br>    cursor = conn.cursor()</p>\n\n<p>cursor.execute(\"\"\"<br>        CREATE TABLE users (<br>            id SERIAL PRIMARY KEY,<br>            name VARCHAR(100) NOT NULL,<br>            email VARCHAR(100) UNIQUE NOT NULL<br>        )<br>    \"\"\")<br>    conn.commit()</p>\n\n<p># Insert test data<br>    cursor.execute(\"\"\"<br>        INSERT INTO users (name, email) <br>        VALUES (\'João\', \'joao@example.com\')<br>        RETURNING id<br>    \"\"\")<br>    user_id = cursor.fetchone()[0]</p>\n\n<p># Verify<br>    cursor.execute(\"SELECT * FROM users WHERE id = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s\", (user_id,))<br>    user = cursor.fetchone()</p>\n\n<p>assert user[1] == \"João\"</p>\n\n<p>cursor.close()<br>    conn.close()<br></code></pre></p>\n\n<h3>Redis (Python)</h3>\n\n<pre><code># test_redis.py\nimport pytest\nfrom testcontainers.redis import RedisContainer\nimport redis\n\n<p>@pytest.fixture<br>def redis_container():<br>    with RedisContainer(\"redis:7-alpine\") as redis:<br>        yield redis</p>\n\n<p>def test_redis_basic_operations(redis_container):<br>    client = redis.Redis.from_url(redis_container.get_connection_url())</p>\n\n<p># Set and get<br>    client.set(\"key\", \"value\")<br>    assert client.get(\"key\") == b\"value\"</p>\n\n<p># Expire<br>    client.setex(\"temp\", 60, \"temp_value\")<br>    assert client.get(\"temp\") == b\"temp_value\"</p>\n\n<p># List<br>    client.lpush(\"mylist\", \"a\", \"b\", \"c\")<br>    assert client.lrange(\"mylist\", 0, -1) == [b\'c\', b\'b\', b\'a\']</p>\n\n<p>client.flushall()</p>\n\n<p>def test_redis_pubsub(redis_container):<br>    client = redis.Redis.from_url(redis_container.get_connection_url())</p>\n\n<p># Pub/Sub pattern<br>    pubsub = client.pubsub()<br>    pubsub.subscribe(\"test-channel\")</p>\n\n<p># Give time for subscription<br>    import time<br>    time.sleep(0.5)</p>\n\n<p># Publish message<br>    client.publish(\"test-channel\", \"Hello, World!\")</p>\n\n<p># Receive message<br>    message = pubsub.get_message()<br>    assert message[\"type\"] == \"message\"<br>    assert message[\"data\"] == b\"Hello, World!\"</p>\n\n<p>pubsub.close()<br></code></pre></p>\n\n<h3>MongoDB (Java)</h3>\n\n<pre><code>// MongoDBTest.java\nimport org.testcontainers.containers.MongoDBContainer;\nimport org.junit.jupiter.api.*;\n\n<p>import com.mongodb.client.MongoClients;<br>import com.mongodb.client.MongoCollection;<br>import com.mongodb.client.MongoDatabase;</p>\n\n<p>import static org.junit.jupiter.api.Assertions.*;</p>\n\n<p>@TestInstance(TestInstance.Lifecycle.PER_CLASS)<br>public class MongoDBTest {</p>\n\n<p>MongoDBContainer mongo = new MongoDBContainer(\"mongo:7\");</p>\n\n<p>@BeforeAll<br>    void startContainer() {<br>        mongo.start();<br>    }</p>\n\n<p>@AfterAll<br>    void stopContainer() {<br>        mongo.stop();<br>    }</p>\n\n<p>@Test<br>    void testMongoConnection() {<br>        String connectionString = mongo.getReplicaSetUrl();</p>\n\n<p>try (var client = MongoClients.create(connectionString)) {<br>            MongoDatabase database = client.getDatabase(\"testdb\");<br>            MongoCollection collection = database.getCollection(\"users\");</p>\n\n<p>// Insert document<br>            org.bson.Document user = new org.bson.Document()<br>                .append(\"name\", \"João Silva\")<br>                .append(\"email\", \"joao@example.com\");</p>\n\n<p>collection.insertOne(user);</p>\n\n<p>// Find document<br>            org.bson.Document found = collection.find().first();</p>\n\n<p>assertNotNull(found);<br>            assertEquals(\"João Silva\", found.getString(\"name\"));<br>        }<br>    }<br>}<br></code></pre></p>\n\n<h3>Docker Compose (Python)</h3>\n\n<pre><code># test_integration.py\nimport pytest\nfrom testcontainers.compose import DockerCompose\n\n<p>@pytest.fixture(scope=\"module\")<br>def compose():<br>    with DockerCompose(\"/path/to/project\") as compose:<br>        compose.start()<br>        yield compose<br>        compose.stop()</p>\n\n<p>def test_all_services_running(compose):<br>    # Check if services are healthy<br>    exit_code, output = compose.exec(\"api\", \"curl -f http://localhost:8080/health\")<br>    assert exit_code == 0</p>\n\n<p>exit_code, output = compose.exec(\"db\", \"pg_isready\")<br>    assert exit_code == 0</p>\n\n<p>def test_api_with_database(compose):<br>    # API should be able to connect to database<br>    exit_code, output = compose.exec(<br>        \"api\", <br>        \"python -c \'import psycopg2; print(\"OK\")\'\"<br>    )<br>    assert exit_code == 0<br>    assert \"OK\" in output.decode()<br></code></pre></p>\n\n<hr>\n<h2>Multiple Containers</h2>\n\n<pre><code># test_full_stack.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\nfrom testcontainers.kafka import KafkaContainer\n\n<p>@pytest.fixture(scope=\"module\")<br>def test_environment():<br>    # Start all containers<br>    postgres = PostgresContainer(\"postgres:15\")<br>    redis = RedisContainer(\"redis:7\")<br>    kafka = KafkaContainer()</p>\n\n<p># Start them<br>    pg_url = postgres.start()<br>    redis_url = redis.start()<br>    kafka_bootstrap = kafka.start()</p>\n\n<p>yield {<br>        \'postgres\': pg_url,<br>        \'redis\': redis_url,<br>        \'kafka\': kafka_bootstrap<br>    }</p>\n\n<p># Cleanup<br>    kafka.stop()<br>    redis.stop()<br>    postgres.stop()<br></code></pre></p>\n\n<hr>\n<h2>CI Integration</h2>\n\n<pre><code># GitHub Actions\nname: Tests with Testcontainers\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  test:<br>    runs-on: ubuntu-latest<br>    services:<br>      docker:<br>        image: docker:24.0.5-cli<br>        options: --privileged<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Set up Docker Buildx<br>        uses: docker/setup-buildx-action@v3</p>\n\n<p>- name: Run tests<br>        run: |<br>          docker network create testnet || true<br>          docker compose -f docker-compose.test.yml up -d<br>          docker compose -f docker-compose.test.yml run test<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testcontainers facilita testes com dependências reais. As chaves são:<br><ol><li><strong>Isolamento</strong> - Cada teste com seu ambiente</li><br><li><strong>Realismo</strong> - Testa contra serviços reais</li><br><li><strong>Cleanup</strong> - Containers são removidos após testes</li><br><li><strong>CI</strong> - Funciona em pipelines</li><br><li><strong>Performance</strong> - Mais lento que mocks, mais confiável</li></ol></p>', 'Testcontainers: Ambientes de Teste Isolados com Docker', '', 'publish', 'closed', 'open', '', '36testcontainers', '', '', '2026-07-06 23:05:58', '2026-07-07 02:05:58', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/36testcontainers/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('215', '0', '2026-07-06 23:05:58', '2026-07-07 02:05:58', '<p><strong>Meta Description:</strong> Aprenda security testing: OWASP Top 10, SAST, DAST, penet testers manuais, como integrar segurança ao pipeline de QA.</p>\n\n<hr>\n<h2>Tipos de Security Testing</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo</th><th>Descrição</th><th>Automação</th></tr>\n<tr><td><strong>SAST</strong></td><td>Análise estática de código</td><td>✅ Alta</td></tr>\n<tr><td><strong>DAST</strong></td><td>Teste dinâmico de aplicação</td><td>✅ Alta</td></tr>\n<tr><td><strong>SCA</strong></td><td>Análise de composição de software</td><td>✅ Alta</td></tr>\n<tr><td><strong>IAST</strong></td><td>Teste interativo</td><td>⚠️ Média</td></tr>\n<tr><td><strong>Pentest</strong></td><td>Teste manual de penetração</td><td>❌ Baixa</td></tr>\n</table></figure>\n\n<hr>\n<h2>OWASP Top 10 (2021)</h2>\n\n<h3>A01 - Broken Access Control</h3>\n\n<pre><code># VULNERÁVEL\n@app.route(\'/pedido/\')\ndef get_pedido(id):\n    # Não verifica ownership!\n    return Pedido.query.get(id)\n\n<p># SEGURO<br>@app.route(\'/pedido/\')<br>@login_required<br>def get_pedido(id):<br>    pedido = Pedido.query.filter_by(<br>        id=id, <br>        usuario_id=current_user.id<br>    ).first_or_404()<br>    return pedido<br></code></pre></p>\n\n<h3>A02 - Cryptographic Failures</h3>\n\n<pre><code># VULNERÁVEL\nsenha = \"senha123\"  # Texto puro!\n\n<p># SEGURO<br>from cryptography.fernet import Fernet</p>\n\n<p>key = Fernet.generate_key()  # Armazenar em vault!<br>cipher = Fernet(key)<br>senha_hash = bcrypt.hashpw(senha.encode(), bcrypt.gensalt())<br></code></pre></p>\n\n<h3>A03 - Injection</h3>\n\n<pre><code>-- VULNERÁVEL (SQL Injection)\nquery = f\"SELECT * FROM users WHERE email = \'{email}\'\"\n\n<p>-- SEGURO (Parameterized)<br>cursor.execute(\"SELECT * FROM users WHERE email = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s\", (email,))<br></code></pre></p>\n\n<hr>\n<h2>SAST - Static Application Security Testing</h2>\n\n<h3>SonarQube</h3>\n\n<pre><code># GitHub Actions\n<ul><li>name: SonarCloud Scan</li>\n  uses: SonarSource/sonarcloud-github-action@master\n  env:\n    SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}\n\n<p># sonar-project.properties<br>sonar.projectKey=myproject<br>sonar.sources=src<br>sonar.tests=tests<br>sonar.python.coverage.reportPaths=coverage.xml<br>sonar.security Risks=high,critical<br></code></pre></p>\n\n<h3>Semgrep</h3>\n\n<pre><code># Install\npip install semgrep\n\n<p># Run<br>semgrep --config=auto .</p>\n\n<p># Custom rule<br>rules:<br>  - id: hardcoded-secret<br>    pattern: $SECRET = \"$VALUE\"<br>    message: Hardcoded secret found<br>    severity: ERROR<br>    languages: [python]<br></code></pre></p>\n\n<hr>\n<h2>DAST - Dynamic Application Security Testing</h2>\n\n<h3>OWASP ZAP</h3>\n\n<pre><code># CLI scan\ndocker run -t owasp/zap2docker-stable \n  zap-baseline.py \n  -t https://example.com \n  -J zap-report.json\n\n<p># GitHub Actions<ol><li>name: OWASP ZAP Scan</li><br></ol>  uses: zaproxy/action-baseline@v0.9.0<br>  with:<br>    target: \'https://staging.example.com\'<br>    rules_rules_name: \'api-scan\'<br></code></pre></p>\n\n<hr>\n<h2>SCA - Software Composition Analysis</h2>\n\n<h3>Snyk</h3>\n\n<pre><code># Install\nnpm install -g snyk\n\n<p># Test<br>snyk test</p>\n\n<p># Monitor<br>snyk monitor</p>\n\n<p># GitHub Action<ol><li>name: Snyk Security Scan</li></ol></ul><br>  uses: snyk/actions/node@master<br>  env:<br>    SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Security testing deve ser integrado ao pipeline. As chaves são:<br><ol><li><strong>Automação</strong> - SAST, DAST, SCA no CI/CD</li><br><li><strong>OWASP</strong> - Conheça as vulnerabilidades principais</li><br><li><strong>Pentests</strong> - Regular, para complementar automação</li><br><li><strong>Remediação</strong> - Não é só detectar, é corrigir</li><br><li><strong>Cultura</strong> - Segurança é responsabilidade de todos</li></ol></p>', 'Security Testing: OWASP, Penetration Testing e SAST/DAST', '', 'publish', 'closed', 'open', '', '37securitytesting', '', '', '2026-07-06 23:05:58', '2026-07-07 02:05:58', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/37securitytesting/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('216', '0', '2026-07-06 23:05:58', '2026-07-07 02:05:58', '<p><strong>Meta Description:</strong> Aprenda testes end-to-end: Playwright, Cypress, Selenium, como simular jornadas completas do usuário e garantir que tudo funciona.</p>\n\n<hr>\n<h2>O Que São Testes E2E?</h2>\n\n<p>Testes E2E verificam que o sistema completo funciona, simulando jornadas reais do usuário do início ao fim.</p>\n\n<h3>Quando Usar</h3>\n\n<ul><li>✅ Fluxos críticos (login, checkout)</li><ol><li>✅ Antes de releases</li>\n<li>✅ Smoke tests</li>\n<li>❌ Não para tudo (são lentos)</li>\n</ol>\n<hr>\n<h2>Playwright</h2>\n\n<h3>Setup</h3>\n\n<pre><code>npm install -D @playwright/test\nnpx playwright install\n</code></pre>\n\n<h3>Exemplo</h3>\n\n<pre><code>// tests/e2e/checkout.spec.ts\nimport { test, expect } from \'@playwright/test\';\n\n<p>test.describe(\'Checkout Flow\', () =&gt; {<br>  test.beforeEach(async ({ page }) =&gt; {<br>    await page.goto(\'/\');<br>  });</p>\n\n<p>test(\'complete purchase flow\', async ({ page }) =&gt; {<br>    // 1. Login<br>    await page.click(\'text=Login\');<br>    await page.fill(\'[data-testid=email]\', \'user@test.com\');<br>    await page.fill(\'[data-testid=password]\', \'password123\');<br>    await page.click(\'text=Entrar\');</p>\n\n<p>// 2. Browse products<br>    await page.click(\'text=Produtos\');<br>    await page.click(\'text=Camiseta Azul\');</p>\n\n<p>// 3. Add to cart<br>    await page.click(\'text=Adicionar ao Carrinho\');<br>    await expect(page.locator(\'.cart-badge\')).toHaveText(\'1\');</p>\n\n<p>// 4. Checkout<br>    await page.click(\'text=Finalizar Compra\');<br>    await page.fill(\'[data-testid=address]\', \'Rua Teste, 123\');<br>    await page.click(\'text=Confirmar Pedido\');</p>\n\n<p>// 5. Verify<br>    await expect(page.locator(\'.success-message\')).toBeVisible();<br>    await expect(page.locator(\'.order-id\')).toBeVisible();<br>  });<br>});<br></code></pre></p>\n\n<hr>\n<h2>Cypress</h2>\n\n<h3>Setup</h3>\n\n<pre><code>npm install -D cypress\nnpx cypress open\n</code></pre>\n\n<h3>Exemplo</h3>\n\n<pre><code>// cypress/integration/checkout.spec.js\ndescribe(\'Checkout Flow\', () =&gt; {\n  beforeEach(() =&gt; {\n    cy.visit(\'/\');\n  });\n\n<p>it(\'completes purchase successfully\', () =&gt; {<br>    // Login<br>    cy.get(\'[data-cy=login-button]\').click();<br>    cy.get(\'[data-cy=email-input]\').type(\'user@test.com\');<br>    cy.get(\'[data-cy=password-input]\').type(\'password123\');<br>    cy.get(\'[data-cy=submit-button]\').click();</p>\n\n<p>// Add product<br>    cy.contains(\'Camiseta\').click();<br>    cy.get(\'[data-cy=add-to-cart]\').click();</p>\n\n<p>// Checkout<br>    cy.get(\'[data-cy=cart-icon]\').click();<br>    cy.get(\'[data-cy=checkout-button]\').click();<br>    cy.get(\'[data-cy=address-input]\').type(\'Rua Teste, 123\');<br>    cy.get(\'[data-cy=confirm-button]\').click();</p>\n\n<p>// Verify<br>    cy.contains(\'Pedido realizado com sucesso\').should(\'be.visible\');<br>  });<br>});<br></code></pre></p>\n\n<hr>\n<h2>Page Objects</h2>\n\n<pre><code>// pages/LoginPage.ts\nexport class LoginPage {\n  constructor(private page: Page) {}\n\n<p>async goto() {<br>    await this.page.goto(\'/login\');<br>  }</p>\n\n<p>async login(email: string, password: string) {<br>    await this.page.fill(\'[data-testid=email]\', email);<br>    await this.page.fill(\'[data-testid=password]\', password);<br>    await this.page.click(\'text=Entrar\');<br>  }<br>}</p>\n\n<p>// tests/e2e/checkout.spec.ts<br>test(\'checkout\', async ({ page }) =&gt; {<br>  const loginPage = new LoginPage(page);<br>  const checkoutPage = new CheckoutPage(page);</p>\n\n<p>await loginPage.goto();<br>  await loginPage.login(\'user@test.com\', \'password123\');</p>\n\n<p>await checkoutPage.addProduct(\'Camiseta\');<br>  await checkoutPage.completeCheckout(\'Rua Teste\');</p>\n\n<p>await expect(checkoutPage.successMessage).toBeVisible();<br>});<br></code></pre></p>\n\n<hr>\n<h2>CI Integration</h2>\n\n<pre><code># GitHub Actions<ol><li>name: E2E Tests</li></ol></ul>\n  run: npx playwright test\n  env:\n    CYPRESS_baseUrl: https://staging.example.com\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes E2E simulam o usuário real. As chaves são:<br><ol><li><strong>Focar no crítico</strong> - Não tudo, só fluxos importantes</li><br><li><strong>Page Objects</strong> - DRY, fácil manutenção</li><br><li><strong>Dados de teste</strong> - Setup e teardown</li><br><li><strong>CI</strong> - Executar em pipeline</li><br><li><strong>Debugging</strong> - Screenshots, videos</li></ol></p>', 'Testes E2E: Guiando pelo Usuário', '', 'publish', 'closed', 'open', '', '38e2etesting', '', '', '2026-07-06 23:05:58', '2026-07-07 02:05:58', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/38e2etesting/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('217', '0', '2026-07-06 23:05:58', '2026-07-07 02:05:58', '<p><strong>Meta Description:</strong> Aprenda a definir e acompanhar métricas de QA: cobertura, defeitos, velocity, DORA metrics, como criar dashboards efetivos.</p>\n\n<hr>\n<h2>Por Que Métricas?</h2>\n\n<ul><li><strong>Visibilidade</strong> - Entender estado do projeto</li><ol><li><strong>Tendências</strong> - Evolução ao longo do tempo</li>\n<li><strong>Decisões</strong> - Base para ações</li>\n<li><strong>Accountability</strong> - Responsabilidade clara</li></ol></ul>\n\n<hr>\n<h2>Métricas de Teste</h2>\n\n<h3>Cobertura</h3>\n\n<pre><code>def test_coverage_metrics():\n    return {\n        \"code_coverage\": {\n            \"line\": 85,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n            \"branch\": 78,\n            \"function\": 90\n        },\n        \"requirement_coverage\": 95,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n        \"risk_coverage\": 80,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n        \"test_efficiency\": {\n            \"bugs_found\": 15,\n            \"tests_executed\": 500,\n            \"ratio\": 0.03  # 3 bugs por 100 testes\n        }\n    }\n</code></pre>\n\n<h3>Execution Metrics</h3>\n\n<pre><code>def execution_metrics():\n    return {\n        \"total_tests\": 1000,\n        \"passed\": 950,\n        \"failed\": 30,\n        \"blocked\": 10,\n        \"skipped\": 10,\n        \"pass_rate\": 95,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n        \"flaky_rate\": 2,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n        \"execution_time\": {\n            \"total_minutes\": 45,\n            \"average_per_test_seconds\": 2.7\n        }\n    }\n</code></pre>\n\n<hr>\n<h2>Métricas de Defeitos</h2>\n\n<pre><code>class DefectMetrics:\n    def __init__(self, data):\n        self.data = data\n\n<p>def defect_leakage(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos encontrados em produção\"\"\"<br>        prod = self.data[\'bugs_in_prod\']<br>        total = self.data[\'total_bugs\']<br>        return (prod / total) * 100 if total else 0</p>\n\n<p>def defect_density(self):<br>        \"\"\"Defeitos por 1000 linhas\"\"\"<br>        bugs = self.data[\'total_bugs\']<br>        loc = self.data[\'lines_of_code\']<br>        return (bugs / loc) * 1000</p>\n\n<p>def escape_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos escapados para prod\"\"\"<br>        return self.defect_leakage()</p>\n\n<p>def mtbf(self):<br>        \"\"\"Mean Time Between Failures\"\"\"<br>        return self.data[\'uptime_hours\'] / self.data[\'incidents\']</p>\n\n<p>def mttr(self):<br>        \"\"\"Mean Time To Repair\"\"\"<br>        return sum(r[\'time_to_fix\'] for r in self.data[\'incidents\']) / len(self.data[\'incidents\'])<br></code></pre></p>\n\n<hr>\n<h2>DORA Metrics</h2>\n\n<h3>Deployment Frequency</h3>\n\n<pre><code>def deployment_frequency(days=30):\n    \"\"\"\n    Elite: On-demand ou múltiplas vezes ao dia\n    High: Entre diária e semanal\n    Medium: Entre semanal e mensal\n    Low: Mensal ou menos\n    \"\"\"\n    deploys = get_deployments(days)\n    return {\n        \"count\": len(deploys),\n        \"frequency\": len(deploys) / days,  # por dia\n        \"rating\": \"elite\" if len(deploys) &gt;= days * 2 else \"high\" if len(deploys) &gt;= days else \"medium\"\n    }\n</code></pre>\n\n<h3>Lead Time for Changes</h3>\n\n<pre><code>def lead_time(days=30):\n    \"\"\"\n    Elite:  1 mês\n    \"\"\"\n    changes = get_changes(days)\n    avg_hours = sum(c[\'lead_time_hours\'] for c in changes) / len(changes)\n    return {\n        \"average_hours\": avg_hours,\n        \"p95_hours\": calculate_percentile(changes, 95),\n        \"rating\": \"elite\" if avg_hours &lt; 1 else &quot;high&quot; if avg_hours &lt; 24 else &quot;medium&quot;\n    }\n</code></pre>\n\n<hr>\n<h2>Dashboard</h2>\n\n<pre><code># Grafana Dashboard - QA Metrics\n\n<p>panels:<br>  - title: \"Test Pass Rate\"<br>    type: gauge<br>    targets:<br>      - expr: \"sum(test_passed) / sum(test_total) * 100\"<br>    thresholds:<br>      - value: 90<br>        color: yellow<br>      - value: 95<br>        color: green</p>\n\n<p>- title: \"Code Coverage Trend\"<br>    type: timeseries<br>    targets:<br>      - expr: \"code_coverage_percent\"<br>        legendFormat: \"Coverage {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</p>\n\n<p>- title: \"Defect Leakage\"<br>    type: stat<br>    targets:<br>      - expr: \"defects_in_prod / total_defects * 100\"<br>    unit: percent</p>\n\n<p>- title: \"DORA Metrics\"<br>    type: table<br>    targets:<br>      - expr: \"deployment_frequency\"<br>      - expr: \"lead_time_hours\"<br>      - expr: \"mttr_minutes\"<br>      - expr: \"change_failure_rate\"<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Métricas guiam melhoria. As chaves são:<br><ol><li><strong>Definir KPIs</strong> - Alinhados com objetivos</li><br><li><strong>Automatizar coleta</strong> - CI/CD integration</li><br><li><strong>Visualizar</strong> - Dashboards claros</li><br><li><strong>Analisar tendências</strong> - Não só snapshots</li><br><li><strong>Agir</strong> - Métricas sem ação não valem nada</li></ol></p>', 'Metrics de QA: KPIs e Dashboards para Equipes de Qualidade', '', 'publish', 'closed', 'open', '', '39qametrics', '', '', '2026-07-06 23:05:58', '2026-07-07 02:05:58', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/39qametrics/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('218', '0', '2026-07-06 23:05:58', '2026-07-07 02:05:58', '<p><strong>Meta Description:</strong> Aprenda continuous testing: automação completa no pipeline CI/CD, quality gates, shift-left e como implementar testes em cada estágio.</p>\n\n<hr>\n<h2>O Que É Continuous Testing?</h2>\n\n<p>Continuous Testing é a prática de executar testes automaticamente em cada mudança de código, proporcionando feedback rápido e contínuo sobre a qualidade do software.</p>\n\n<h3>Princípios</h3>\n<ol><li><strong>Automação completa</strong> - Sem intervenção manual</li>\n<li><strong>Feedback rápido</strong> - Resultados em minutos</li>\n<li><strong>Shift-Left</strong> - Testar mais cedo</li>\n<li><strong>Quality Gates</strong> - Critérios para avançar</li>\n<li><strong>Cobertura ampla</strong> - Múltiplos tipos de teste</li>\n</ol>\n<hr>\n<h2>Pipeline de Continuous Testing</h2>\n\n<pre><code>Code → Commit → Build → Unit Tests → Integration → E2E → Security → Deploy\n          ↓        ↓        ↓           ↓            ↓       ↓        ↓\n      Pre-commit Hook   Coverage    Contract     Playwright  SAST     Staging\n                       Gate        Tests        Tests     DAST\n</code></pre>\n\n<hr>\n<h2>Quality Gates</h2>\n\n<h3>Definição</h3>\n\n<pre><code># Quality Gates Configuration\nquality_gates:\n  - name: \"Code Coverage\"\n    type: coverage\n    minimum: 80  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n    blocking: true\n\n<p>- name: \"Security Scan\"<br>    type: security<br>    max_critical: 0<br>    max_high: 0<br>    blocking: true</p>\n\n<p>- name: \"Test Pass Rate\"<br>    type: test<br>    minimum: 95  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>    blocking: true</p>\n\n<p>- name: \"Performance\"<br>    type: performance<br>    max_p95_ms: 500<br>    blocking: false</p>\n\n<p>- name: \"Code Review\"<br>    type: approval<br>    required_approvals: 1<br>    blocking: true<br></code></pre></p>\n\n<h3>Implementação</h3>\n\n<pre><code>#!/bin/bash\n# quality-gate.sh\n\n<p>check_coverage() {<br>    COVERAGE=$(cat coverage.xml | grep -oP \'line-covered=\"K[0-9]+\')<br>    TOTAL=$(cat coverage.xml | grep -oP \'line-count=\"K[0-9]+\')<br>    PERCENTAGE=$((COVERAGE * 100 / TOTAL))</p>\n\n<p>if [ $PERCENTAGE -lt 80 ]; then<br>        echo \"❌ Coverage $PERCENTAGE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} below threshold (80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\"<br>        return 1<br>    fi<br>    echo \"✅ Coverage $PERCENTAGE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br>    return 0<br>}</p>\n\n<p>check_security() {<br>    CRITICAL=$(grep -c \"critical\" snyk-report.json)<br>    if [ $CRITICAL -gt 0 ]; then<br>        echo \"❌ $CRITICAL critical vulnerabilities found\"<br>        return 1<br>    fi<br>    echo \"✅ No critical vulnerabilities\"<br>    return 0<br>}</p>\n\n<p>check_tests() {<br>    PASS_RATE=$(python -c \"print($passed / $total * 100)\")<br>    if (( $(echo \"$PASS_RATE &lt; 95&quot; | bc -l) )); then<br>        echo \"❌ Pass rate $PASS_RATE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} below threshold (95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\"<br>        return 1<br>    fi<br>    echo \"✅ Pass rate $PASS_RATE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br>    return 0<br>}</p>\n\n<p># Run all gates<br>check_coverage &amp;&amp; check_security &amp;&amp; check_tests<br>exit $?<br></code></pre></p>\n\n<hr>\n<h2>Shift-Left Testing</h2>\n\n<h3>Traditional vs Shift-Left</h3>\n\n<pre><code>TRADITIONAL:\nRequirements → Design → Development → Testing → Production\n                          ↓\n                    (Late discovery of bugs)\n\n<p>SHIFT-LEFT:<br>Requirements → Testing → Development → Testing → Production<br>     ↓<br>(Early discovery of bugs)<br></code></pre></p>\n\n<h3>Implementação</h3>\n\n<pre><code># .github/workflows/shift-left.yml\nname: Shift-Left Pipeline\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  # Stage 1: Pre-commit (Developer Machine)<br>  pre-commit-checks:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: Pre-commit hooks<br>        run: |<br>          pip install pre-commit<br>          pre-commit run --all-files</p>\n\n<p># Stage 2: Build<br>  build:<br>    needs: pre-commit-checks<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: Build<br>        run: docker build -t app:${{ github.sha }} .</p>\n\n<p># Stage 3: Unit Tests (Fast)<br>  unit-tests:<br>    needs: build<br>    runs-on: ubuntu-latest<br>    steps:<br>      - run: pytest tests/unit -v --cov</p>\n\n<p># Stage 4: Security (SAST)<br>  security-sast:<br>    needs: build<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: SonarCloud<br>        uses: SonarSource/sonarcloud-github-action@master</p>\n\n<p>- name: Semgrep<br>        uses: returntocorp/semgrep-action@v1</p>\n\n<p># Stage 5: Integration Tests<br>  integration-tests:<br>    needs: [unit-tests, security-sast]<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: Run integration tests<br>        run: pytest tests/integration -v</p>\n\n<p># Stage 6: E2E Tests<br>  e2e-tests:<br>    needs: integration-tests<br>    runs-on: ubuntu-latest<br>    if: github.event_name == \'push\'<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: Playwright tests<br>        run: npx playwright test</p>\n\n<p># Stage 7: Deploy to Staging<br>  deploy-staging:<br>    needs: e2e-tests<br>    runs-on: ubuntu-latest<br>    environment: staging<br>    steps:<br>      - deploy to staging<br></code></pre></p>\n\n<hr>\n<h2>Test Selection Strategy</h2>\n\n<pre><code># test_selector.py\nimport subprocess\nfrom typing import List\n\n<p>class TestSelector:<br>    def __init__(self, changed_files):<br>        self.changed_files = changed_files</p>\n\n<p>def select_tests(self) -&gt; List[str]:<br>        tests = set()</p>\n\n<p># Unit tests (always run)<br>        tests.update(self.get_unit_tests())</p>\n\n<p># Integration tests (based on changes)<br>        tests.update(self.get_integration_tests())</p>\n\n<p># E2E tests (only for critical paths or major changes)<br>        if self.has_critical_changes():<br>            tests.update(self.get_critical_e2e_tests())</p>\n\n<p>return list(tests)</p>\n\n<p>def get_unit_tests(self):<br>        # All unit tests<br>        return self.get_tests_matching(\"tests/unit/<em>*/</em>.py\")</p>\n\n<p>def get_integration_tests(self):<br>        tests = set()<br>        for file in self.changed_files:<br>            if \"database\" in file:<br>                tests.add(\"tests/integration/test_database.py\")<br>            if \"api\" in file or \"service\" in file:<br>                tests.add(\"tests/integration/test_api.py\")<br>        return tests</p>\n\n<p>def has_critical_changes(self):<br>        critical_patterns = [\"checkout\", \"payment\", \"auth\", \"core\"]<br>        return any(<br>            any(p in f for p in critical_patterns) <br>            for f in self.changed_files<br>        )</p>\n\n<p>def get_critical_e2e_tests(self):<br>        return [<br>            \"tests/e2e/test_checkout.py\",<br>            \"tests/e2e/test_login.py\",<br>            \"tests/e2e/test_payment.py\"<br>        ]<br></code></pre></p>\n\n<hr>\n<h2>Feedback Loop</h2>\n\n<pre><code># Slack notification\n<ul><li>name: Notify on Failure</li></ul>\n  if: failure()\n  uses: slackapi/slack-github-action@v1\n  with:\n    channel-id: \'qa-alerts\'\n    payload: |\n      {\n        \"text\": \"❌ Build #${GITHUB_RUN_NUMBER} failed\",\n        \"blocks\": [{\n          \"type\": \"section\",\n          \"text\": {\n            \"type\": \"mrkdwn\",\n            \"text\": \"<em>Build Failed</em> :x:n${GITHUB_REPOSITORY}n${GITHUB_RUN_URL}\"\n          }\n        }]\n      }\n</code></pre>\n\n<hr>\n<h2>Métricas de Continuous Testing</h2>\n\n<pre><code>def continuous_testing_metrics():\n    return {\n        \"test_cycle_time\": {\n            \"description\": \"Tempo do commit ao deploy\",\n            \"current\": \"45 min\",\n            \"target\": \"30 min\",\n            \"trend\": \"improving\"\n        },\n        \"test_automation_rate\": {\n            \"description\": \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de testes automatizados\",\n            \"current\": \"85{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\",\n            \"target\": \"90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\n        },\n        \"quality_gate_pass_rate\": {\n            \"description\": \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de builds passando em quality gates\",\n            \"current\": \"92{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\",\n            \"target\": \"95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\n        },\n        \"defect_leakage_rate\": {\n            \"description\": \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos encontrados em produção\",\n            \"current\": \"8{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\",\n            \"target\": \"&lt;5{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}&quot;\n        }\n    }\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Continuous Testing é essencial para DevOps. As chaves são:<br><ol><li><strong>Automação total</strong> - Sem intervenção manual</li><br><li><strong>Feedback rápido</strong> - Minutos, não horas</li><br><li><strong>Quality gates</strong> - Critérios claros</li><br><li><strong>Shift-Left</strong> - Testar o mais cedo possível</li><br><li><strong>Seleção inteligente</strong> - Não rodar tudo sempre</li></ol></p>', 'Continuous Testing: Automação Total no Pipeline', '', 'publish', 'closed', 'open', '', '40continuoustesting', '', '', '2026-07-06 23:05:58', '2026-07-07 02:05:58', '', '0', 'http://localhost:8082/achadinhos/2026/07/04/40continuoustesting/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('230', '0', '2026-07-04 23:15:54', '2026-07-05 02:15:54', '<p><!-- wp:image {\"align\":\"center\",\"sizeSlug\":\"large\"} --><br><figure class=\"wp-block-image size-large aligncenter\"><img src=\"https://media.giphy.com/media/l3q2K5jinAlChoCLS/giphy.gif\" alt=\"Termos e Condições\" /></figure><br><!-- /wp:image --></p>\n\n<h2>Aceitação dos Termos</h2>\n\n<p>Bem-vindo ao <strong>Blog QA Brasil</strong>. Ao acessar, navegar ou utilizar qualquer conteúdo deste site, você concorda com estes Termos de Uso na íntegra. Se você não concorda com qualquer parte destes termos, solicitamos que não utilize nosso blog.</p>\n\n<p>Última atualização: Janeiro de 2025</p>\n\n<hr>\n<h2>1. Informações sobre o Site</h2>\n\n<h3>1.1 Quem Somos</h3>\n\n<p>O Blog QA Brasil é uma plataforma de conteúdo educacional dedicada a:</p>\n\n<p><!-- wp:list --><br><ul><li><strong>Qualidade de Software</strong> - Artigos e guias sobre QA</li><ol><li><strong>Testes de Software</strong> - Metodologias e boas práticas</li><br><li><strong>Automação</strong> - Frameworks e ferramentas</li><br><li><strong>DevOps</strong> - Integração e entrega contínua</li><br></ol><!-- /wp:list --></p>\n\n<h3>1.2 Dados do Proprietário</h3>\n<ol><li><strong>Nome:</strong> Blog QA Brasil</li>\n<li><strong>E-mail:</strong> contato@qabrasil.blog</li>\n<li><strong>Finalidade:</strong> Conteúdo educacional sobre Qualidade de Software</li>\n</ol>\n<hr>\n<h2>2. Objetivo do Site</h2>\n\n<h3>2.1 Conteúdo Oferecido</h3>\n\n<p>Nosso blog disponibiliza:</p>\n\n<p><!-- wp:table {\"className\":\"is-style-stripes\"} --><br><figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Tipo de Conteúdo</th><th>Descrição</th></tr></thead><tbody><tr><td><strong>Artigos Educacionais</strong></td><td>Tutoriais e guias sobre QA e testes</td></tr><tr><td><strong>Notícias</strong></td><td>Tendências e atualizações do setor</td></tr><tr><td><strong>Análises</strong></td><td>Reviews de ferramentas e frameworks</td></tr><tr><td><strong>Recursos</strong></td><td>Links, templates e materiais complementares</td></tr></tbody></table></figure><br><!-- /wp:table --></p>\n\n<h3>2.2 Natureza do Conteúdo</h3>\n\n<p>Todo conteúdo é de caráter <strong>estritamente educacional e informativo</strong>. As informações presentes não constituem aconselhamento profissional, consultoria técnica ou garantia de resultados.</p>\n\n<hr>\n<h2>3. Uso Permitido</h2>\n\n<h3>3.1 O Que Você Pode Fazer</h3>\n\n<p>Você está autorizado a:</p>\n\n<p><!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|30\",\"left\":\"var:preset|spacing|30\",\"right\":\"var:preset|spacing|30\"}},\"border\":{\"radius\":\"5px\"}},\"backgroundColor\":\"secondary\",\"className\":\"has-background\"} --><br><div class=\"wp-block-group has-background\" style=\"border-radius:5px;padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:list --><ol><li><strong>Ler e acessar</strong> todo conteúdo público do site</li><br><li><strong>Compartilhar</strong> artigos em redes sociais com atribuição</li><br><li><strong>Citar trechos</strong> em trabalhos acadêmicos com referência</li><br><li><strong>Inscrever-se</strong> na newsletter voluntariamente</li><br><li><strong>Comentar</strong> em posts seguindo as diretrizes</li><br><li><strong>Baixar recursos</strong> disponibilizados gratuitamente</li><br></ol><!-- /wp:list --></div><br><!-- /wp:group --></p>\n\n<h3>3.2 Como Você Deve Compartilhar</h3>\n\n<p>Ao compartilhar nosso conteúdo, você deve:<br><ol><li><strong>Creditar</strong> o Blog QA Brasil como fonte</li><br><li><strong>Incluir link</strong> direto para o artigo original</li><br><li><strong>Não modificar</strong> o conteúdo publicado</li><br><li><strong>Não usar</strong> para fins comerciais sem autorização</li><br></ol><br><hr><br><h2>4. Uso Proibido</h2></p>\n\n<h3>4.1 Atividades Não Permitidas</h3>\n\n<p>É expressamente proibido:</p>\n\n<p><!-- wp:list --><ol><li><strong>Reprodução completa</strong> do conteúdo sem autorização</li><br><li><strong>Venda ou licenciamento</strong> do conteúdo como próprio</li><br><li><strong>Cópias massivas</strong> para criação de sites alternativos</li><br><li><strong>Remoção de credits</strong> ou informações de direitos autorais</li><br><li><strong>Uso indevido</strong> da marca \"Blog QA Brasil\"</li><br><li><strong>Ataques ao site</strong> - hacking, DDoS, malware</li><br><li><strong>Spam ou flood</strong> nos comentários</li><br><li><strong>Conteúdo ilegal</strong> ou que infrinja direitos de terceiros</li><br></ol><!-- /wp:list --></p>\n\n<h3>4.2 Consequências</h3>\n\n<p>Violações podem resultar em:<br><ol><li><strong>Remoção do conteúdo infrator</strong></li><br><li><strong>Bloqueio de acesso ao site</strong></li><br><li><strong>Notificações legais</strong></li><br><li><strong>Responsabilização civil e criminal</strong></li><br></ol><br><hr><br><h2>5. Propriedade Intelectual</h2></p>\n\n<h3>5.1 Direitos Autorais</h3>\n\n<p>Todo conteúdo publicado no Blog QA Brasil é protegido por direitos autorais:<br><ol><li><strong>Textos e artigos</strong> - © Blog QA Brasil</li><br><li><strong>Imagens e gráficos</strong> - Fontes diversas (Giphy, autores)</li><br><li><strong>Código e exemplos</strong> - Licença MIT quando aplicável</li><br><li><strong>Layout e design</strong> - © Blog QA Brasil</li><br></ol><br><h3>5.2 Uso de Imagens</h3></p>\n\n<p>Utilizamos imagens do <strong>Giphy</strong> sob seus termos de serviço para ilustrar nossos artigos. As imagens permanecem propriedade de seus respectivos criadores.</p>\n\n<h3>5.3 Licença para Uso Educativo</h3>\n\n<p>Concedemos permissão para:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo de Uso</th><th>Condição</th></tr>\n<tr><td><strong>Uso acadêmico</strong></td><td>Com citação adequada</td></tr>\n<tr><td><strong>Compartilhamento social</strong></td><td>Com link para fonte</td></tr>\n<tr><td><strong>Discussão em blogs</strong></td><td>Com referência e link</td></tr>\n<tr><td><strong>Treinamento corporativo</strong></td><td>Com autorização prévia</td></tr>\n</table></figure>\n\n<hr>\n<h2>6. Isenção de Responsabilidade</h2>\n\n<h3>6.1 Conteúdo Educacional</h3>\n\n<p><!-- wp:group --><br><div class=\"wp-block-group alignwide has-border-color\" style=\"border-radius:10px;padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--40)\"><!-- wp:paragraph --><br><p><strong>Aviso Importante:</strong> O conteúdo do Blog QA Brasil é fornecido apenas para fins educacionais e informativos. Não garantimos a precisão, completude ou atualidade das informações. As decisões tomadas com base em nosso conteúdo são de sua inteira responsabilidade.</p><br><!-- /wp:paragraph --></div><br><!-- /wp:group --></p>\n\n<h3>6.2 Isenções Específicas</h3>\n\n<p>Não nos responsabilizamos por:<br><ol><li><strong>Decisões técnicas</strong> tomadas com base no conteúdo</li><br><li><strong>Perdas financeiras</strong> decorrentes do uso das informações</li><br><li><strong>Danos a sistemas</strong> por implementação de código sugerido</li><br><li><strong>Conteúdo de terceiros</strong> em links externos</li><br><li><strong>Interrupções</strong> temporárias do site</li><br></ol><br><hr><br><h2>7. Links Externos</h2></p>\n\n<h3>7.1 Links de Terceiros</h3>\n\n<p>Nosso site pode conter links para sites externos. Esses links são fornecidos apenas para sua conveniência:<br><ol><li><strong>Não controlamos</strong> sites externos</li><br><li><strong>Não endosamos</strong> o conteúdo de sites terceiros</li><br><li><strong>Não somos responsáveis</strong> por práticas de privacidade de terceiros</li><br><li><strong>Você acessa por sua conta e risco</strong></li><br></ol><br><h3>7.2 Sites Recomendados</h3></p>\n\n<p>Quando recomendamos ferramentas ou serviços:<br><ol><li>Realizamos avaliação razoável</li><br><li>Não recebemos pagamento por recomendações</li><br><li>Podemos ter parceria comercial (devidamente disclosed)</li><br></ol><br><hr><br><h2>8. Comentários e Interações</h2></p>\n\n<h3>8.1 Diretrizes para Comentários</h3>\n\n<p>Aceitamos comentários que sejam:<br><ol><li><strong>Relevantes</strong> ao tema do artigo</li><br><li><strong>Respeitosos</strong> e profissionais</li><br><li><strong>Construtivos</strong> e educacionais</li><br><li><strong>Livres de spam</strong> e autopromoção</li><br></ol><br><h3>8.2 Moderação</h3></p>\n\n<p>Reservamo-nos o direito de:<br><ol><li><strong>Moderar</strong> comentários antes da publicação</li><br><li><strong>Remover</strong> comentários inadequados</li><br><li><strong>Bloquear</strong> usuários que violem diretrizes</li><br><li><strong>Editar</strong> comentários para clareza (mantendo sentido)</li><br></ol><br><h3>8.3 Conteúdo Gerado pelo Usuário</h3></p>\n\n<p>Ao postar comentários, você:<br><ol><li>Concede-nos licença para exibição</li><br><li>Garante que é o autor ou tem direitos</li><br><li>Isenta-nos de responsabilidade por conteúdo de terceiros</li><br></ol><br><hr><br><h2>9. Newsletter e Comunicações</h2></p>\n\n<h3>9.1 Inscrição</h3>\n\n<p>Ao se inscrever na newsletter:<br><ol><li>Você concorda em receber e-mails periódicos</li><br><li>Pode cancelar a inscrição a qualquer momento</li><br><li>Seus dados são protegidos conforme nossa Política de Privacidade</li><br></ol><br><h3>9.2 E-mails Marketing</h3></p>\n\n<p>Compromissos com comunicações:<br><ol><li><strong>Frequência razoável</strong> - Máximo 2-3 e-mails por semana</li><br><li><strong>Conteúdo relevante</strong> - Artigos, dicas e novidades</li><br><li><strong>Desinscrição fácil</strong> - Link em todos os e-mails</li><br><li><strong>Sem spam</strong> - Não vendemos ou compartilhamos dados</li><br></ol><br><hr><br><h2>10. Limitação de Responsabilidade</h2></p>\n\n<h3>10.1 Extensão Máxima Permitida por Lei</h3>\n\n<p>Na máxima extensão permitida pela legislação aplicável, o Blog QA Brasil e seus proprietários <strong>não serão responsáveis</strong> por quaisquer danos diretos, indiretos, incidentais, especiais, consequenciais ou punitivos decorrentes de:</p>\n\n<p><!-- wp:list --><ol><li>Uso ou incapacidade de usar o site</li><br><li>Conteúdo de terceiros</li><br><li>Ações de outros usuários</li><br><li>Erros ou omissões no conteúdo</li><br><li>Danos a equipamentos ou software</li><br></ol><!-- /wp:list --></p>\n\n<h3>10.2 Limitação Total</h3>\n\n<p>Nossa responsabilidade total não excederá o valor que você pagou (se houver) para acessar o site, ou R$ 100,00 (cem reais), o que for maior.</p>\n\n<hr>\n<h2>11. Indenização</h2>\n\n<p>Você concorda em indenizar, defender e isentar o Blog QA Brasil, seus proprietários e colaboradores de quaisquer reclamações, ações, danos, perdas, custos e despesas (incluindo honorários advocatícios) decorrentes de:<br><ol><li>Violação destes Termos de Uso</li><br><li>Uso indevido do site</li><br><li>Conteúdo que você postar</li><br><li>Violação de direitos de terceiros</li><br></ol><br><hr><br><h2>12. Modificações dos Termos</h2></p>\n\n<h3>12.1 Atualizações</h3>\n\n<p>Reservamo-nos o direito de modificar estes termos a qualquer momento:<br><ol><li><strong>Publicaremos</strong> a versão atualizada nesta página</li><br><li><strong>Atualizaremos</strong> a data de \"Última atualização\"</li><br><li><strong>Notificaremos</strong> sobre mudanças significativas (quando possível)</li><br></ol><br><h3>12.2 Aceitação Contínua</h3></p>\n\n<p>A continuação do uso após modificações constitui aceitação dos novos termos.</p>\n\n<hr>\n<h2>13. Rescisão</h2>\n\n<h3>13.1 Término pela Empresa</h3>\n\n<p>Podemos encerrar ou suspender seu acesso imediatamente, sem aviso prévio, por qualquer motivo, incluindo violação destes termos.</p>\n\n<h3>13.2 Efeitos da Rescisão</h3>\n\n<p>Após rescisão:<br><ol><li>Seu direito de usar o site cessa imediatamente</li><br><li>Comentários e conteúdo podem ser removidos</li><br><li>Disposições que devam sobreviver continuam vigentes</li><br></ol><br><hr><br><h2>14. Lei Aplicável</h2></p>\n\n<h3>14.1 Jurisdição</h3>\n\n<p>Estes termos são regidos pelas leis brasileiras:<br><ol><li><strong>Lei nº 9.610/1998</strong> - Direitos Autorais</li><br><li><strong>Lei nº 12.965/2014</strong> - Marco Civil da Internet</li><br><li><strong>Lei nº 13.709/2018</strong> - LGPD</li><br><li><strong>Código de Defesa do Consumidor</strong> - Quando aplicável</li></ol></ul></p>\n\n<h3>14.2 Foro</h3>\n\n<p>Qualquer litígio será resolvido no foro da comarca de <strong>São Paulo, SP</strong>, salvo disposição em contrário.</p>\n\n<hr>\n<h2>15. Disposições Gerais</h2>\n\n<h3>15.1 Integridade do Acordo</h3>\n\n<p>Estes termos constituem o acordo completo entre você e o Blog QA Brasil.</p>\n\n<h3>15.2 Severabilidade</h3>\n\n<p>Se qualquer disposição for considerada inválida, as demais disposições permanecem em pleno vigor.</p>\n\n<h3>15.3 Renúncia</h3>\n\n<p>A não exercício de qualquer direito não constitui renúncia a esse direito.</p>\n\n<h3>15.4 Cessão</h3>\n\n<p>Você não pode ceder seus direitos sob estes termos.</p>\n\n<hr>\n<h2>16. Contato</h2>\n\n<p>Para questões sobre estes Termos de Uso:</p>\n\n<p><!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|50\",\"bottom\":\"var:preset|spacing|50\",\"left\":\"var:preset|spacing|50\",\"right\":\"var:preset|spacing|50\"}},\"border\":{\"radius\":\"10px\"}},\"backgroundColor\":\"primary\",\"textColor\":\"white\",\"className\":\"has-white-color has-primary-background-color has-text-color has-background\"} --><br><div class=\"wp-block-group alignwide has-white-color has-primary-background-color has-text-color has-background\" style=\"border-radius:10px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)\"><!-- wp:paragraph --><br><p><strong>Blog QA Brasil - Termos de Uso</strong><br /><br>E-mail: contato@qabrasil.blog<br /><br>Última atualização: Janeiro de 2025</p><br><!-- /wp:paragraph --></div><br><!-- /wp:group --></p>\n\n<hr>\n<em>A utilização deste site implica na aceitação integral destes Termos de Uso. Se você não concorda com qualquer parte destes termos, por favor, não utilize nosso blog.</em>', 'Termos de Uso', '', 'inherit', 'closed', 'closed', '', '54-revision-v1', '', '', '2026-07-04 23:15:54', '2026-07-05 02:15:54', '', '54', 'http://localhost:8082/ideiasti/?p=230', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('231', '0', '2026-07-04 23:50:25', '2026-07-05 02:50:25', '', 'featured-208.jpg', '', 'inherit', 'open', 'closed', '', 'featured-208-jpg', '', '', '2026-07-04 23:50:25', '2026-07-05 02:50:25', '', '208', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-208.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('232', '0', '2026-07-04 23:50:26', '2026-07-05 02:50:26', '', 'featured-209.jpg', '', 'inherit', 'open', 'closed', '', 'featured-209-jpg', '', '', '2026-07-04 23:50:26', '2026-07-05 02:50:26', '', '209', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-209.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('233', '0', '2026-07-04 23:50:26', '2026-07-05 02:50:26', '', 'featured-210.jpg', '', 'inherit', 'open', 'closed', '', 'featured-210-jpg', '', '', '2026-07-04 23:50:26', '2026-07-05 02:50:26', '', '210', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-210.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('234', '0', '2026-07-04 23:50:26', '2026-07-05 02:50:26', '', 'featured-211.jpg', '', 'inherit', 'open', 'closed', '', 'featured-211-jpg', '', '', '2026-07-04 23:50:26', '2026-07-05 02:50:26', '', '211', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-211.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('235', '0', '2026-07-04 23:50:26', '2026-07-05 02:50:26', '', 'featured-212.jpg', '', 'inherit', 'open', 'closed', '', 'featured-212-jpg', '', '', '2026-07-04 23:50:26', '2026-07-05 02:50:26', '', '212', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-212.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('236', '0', '2026-07-04 23:50:27', '2026-07-05 02:50:27', '', 'featured-213.jpg', '', 'inherit', 'open', 'closed', '', 'featured-213-jpg', '', '', '2026-07-04 23:50:27', '2026-07-05 02:50:27', '', '213', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-213.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('237', '0', '2026-07-04 23:50:27', '2026-07-05 02:50:27', '', 'featured-214.jpg', '', 'inherit', 'open', 'closed', '', 'featured-214-jpg', '', '', '2026-07-04 23:50:27', '2026-07-05 02:50:27', '', '214', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-214.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('238', '0', '2026-07-04 23:50:27', '2026-07-05 02:50:27', '', 'featured-215.jpg', '', 'inherit', 'open', 'closed', '', 'featured-215-jpg', '', '', '2026-07-04 23:50:27', '2026-07-05 02:50:27', '', '215', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-215.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('239', '0', '2026-07-04 23:50:28', '2026-07-05 02:50:28', '', 'featured-216.jpg', '', 'inherit', 'open', 'closed', '', 'featured-216-jpg', '', '', '2026-07-04 23:50:28', '2026-07-05 02:50:28', '', '216', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-216.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('240', '0', '2026-07-04 23:50:28', '2026-07-05 02:50:28', '', 'featured-217.jpg', '', 'inherit', 'open', 'closed', '', 'featured-217-jpg', '', '', '2026-07-04 23:50:28', '2026-07-05 02:50:28', '', '217', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-217.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('241', '0', '2026-07-04 23:50:28', '2026-07-05 02:50:28', '', 'featured-218.jpg', '', 'inherit', 'open', 'closed', '', 'featured-218-jpg', '', '', '2026-07-04 23:50:28', '2026-07-05 02:50:28', '', '218', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-218.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('242', '0', '2026-07-04 23:50:28', '2026-07-05 02:50:28', '', 'featured-191.jpg', '', 'inherit', 'open', 'closed', '', 'featured-191-jpg', '', '', '2026-07-04 23:50:28', '2026-07-05 02:50:28', '', '191', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-191.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('243', '0', '2026-07-04 23:50:29', '2026-07-05 02:50:29', '', 'featured-207.jpg', '', 'inherit', 'open', 'closed', '', 'featured-207-jpg', '', '', '2026-07-04 23:50:29', '2026-07-05 02:50:29', '', '207', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-207.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('244', '0', '2026-07-04 23:50:29', '2026-07-05 02:50:29', '', 'featured-192.jpg', '', 'inherit', 'open', 'closed', '', 'featured-192-jpg', '', '', '2026-07-04 23:50:29', '2026-07-05 02:50:29', '', '192', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-192.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('245', '0', '2026-07-04 23:50:29', '2026-07-05 02:50:29', '', 'featured-193.jpg', '', 'inherit', 'open', 'closed', '', 'featured-193-jpg', '', '', '2026-07-04 23:50:29', '2026-07-05 02:50:29', '', '193', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-193.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('246', '0', '2026-07-04 23:50:30', '2026-07-05 02:50:30', '', 'featured-194.jpg', '', 'inherit', 'open', 'closed', '', 'featured-194-jpg', '', '', '2026-07-04 23:50:30', '2026-07-05 02:50:30', '', '194', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-194.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('247', '0', '2026-07-04 23:50:30', '2026-07-05 02:50:30', '', 'featured-195.jpg', '', 'inherit', 'open', 'closed', '', 'featured-195-jpg', '', '', '2026-07-04 23:50:30', '2026-07-05 02:50:30', '', '195', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-195.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('248', '0', '2026-07-04 23:50:30', '2026-07-05 02:50:30', '', 'featured-196.jpg', '', 'inherit', 'open', 'closed', '', 'featured-196-jpg', '', '', '2026-07-04 23:50:30', '2026-07-05 02:50:30', '', '196', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-196.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('249', '0', '2026-07-04 23:50:31', '2026-07-05 02:50:31', '', 'featured-197.jpg', '', 'inherit', 'open', 'closed', '', 'featured-197-jpg', '', '', '2026-07-04 23:50:31', '2026-07-05 02:50:31', '', '197', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-197.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('250', '0', '2026-07-04 23:50:31', '2026-07-05 02:50:31', '', 'featured-198.jpg', '', 'inherit', 'open', 'closed', '', 'featured-198-jpg', '', '', '2026-07-04 23:50:31', '2026-07-05 02:50:31', '', '198', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-198.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('251', '0', '2026-07-04 23:50:31', '2026-07-05 02:50:31', '', 'featured-199.jpg', '', 'inherit', 'open', 'closed', '', 'featured-199-jpg', '', '', '2026-07-04 23:50:31', '2026-07-05 02:50:31', '', '199', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-199.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('252', '0', '2026-07-04 23:50:31', '2026-07-05 02:50:31', '', 'featured-200.jpg', '', 'inherit', 'open', 'closed', '', 'featured-200-jpg', '', '', '2026-07-04 23:50:31', '2026-07-05 02:50:31', '', '200', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-200.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('253', '0', '2026-07-04 23:50:32', '2026-07-05 02:50:32', '', 'featured-201.jpg', '', 'inherit', 'open', 'closed', '', 'featured-201-jpg', '', '', '2026-07-04 23:50:32', '2026-07-05 02:50:32', '', '201', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-201.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('254', '0', '2026-07-04 23:50:32', '2026-07-05 02:50:32', '', 'featured-202.jpg', '', 'inherit', 'open', 'closed', '', 'featured-202-jpg', '', '', '2026-07-04 23:50:32', '2026-07-05 02:50:32', '', '202', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-202.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('255', '0', '2026-07-04 23:50:32', '2026-07-05 02:50:32', '', 'featured-203.jpg', '', 'inherit', 'open', 'closed', '', 'featured-203-jpg', '', '', '2026-07-04 23:50:32', '2026-07-05 02:50:32', '', '203', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-203.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('256', '0', '2026-07-04 23:50:33', '2026-07-05 02:50:33', '', 'featured-204.jpg', '', 'inherit', 'open', 'closed', '', 'featured-204-jpg', '', '', '2026-07-04 23:50:33', '2026-07-05 02:50:33', '', '204', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-204.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('257', '0', '2026-07-04 23:50:33', '2026-07-05 02:50:33', '', 'featured-205.jpg', '', 'inherit', 'open', 'closed', '', 'featured-205-jpg', '', '', '2026-07-04 23:50:33', '2026-07-05 02:50:33', '', '205', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-205.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('258', '0', '2026-07-04 23:50:33', '2026-07-05 02:50:33', '', 'featured-206.jpg', '', 'inherit', 'open', 'closed', '', 'featured-206-jpg', '', '', '2026-07-04 23:50:33', '2026-07-05 02:50:33', '', '206', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-206.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('259', '0', '2026-07-04 23:50:33', '2026-07-05 02:50:33', '', 'featured-177.jpg', '', 'inherit', 'open', 'closed', '', 'featured-177-jpg', '', '', '2026-07-04 23:50:33', '2026-07-05 02:50:33', '', '177', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-177.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('260', '0', '2026-07-04 23:50:34', '2026-07-05 02:50:34', '', 'featured-178.jpg', '', 'inherit', 'open', 'closed', '', 'featured-178-jpg', '', '', '2026-07-04 23:50:34', '2026-07-05 02:50:34', '', '178', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-178.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('261', '0', '2026-07-04 23:50:34', '2026-07-05 02:50:34', '', 'featured-179.jpg', '', 'inherit', 'open', 'closed', '', 'featured-179-jpg', '', '', '2026-07-04 23:50:34', '2026-07-05 02:50:34', '', '179', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-179.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('262', '0', '2026-07-04 23:50:34', '2026-07-05 02:50:34', '', 'featured-180.jpg', '', 'inherit', 'open', 'closed', '', 'featured-180-jpg', '', '', '2026-07-04 23:50:34', '2026-07-05 02:50:34', '', '180', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-180.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('263', '0', '2026-07-04 23:50:35', '2026-07-05 02:50:35', '', 'featured-181.jpg', '', 'inherit', 'open', 'closed', '', 'featured-181-jpg', '', '', '2026-07-04 23:50:35', '2026-07-05 02:50:35', '', '181', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-181.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('264', '0', '2026-07-04 23:50:35', '2026-07-05 02:50:35', '', 'featured-182.jpg', '', 'inherit', 'open', 'closed', '', 'featured-182-jpg', '', '', '2026-07-04 23:50:35', '2026-07-05 02:50:35', '', '182', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-182.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('265', '0', '2026-07-04 23:50:35', '2026-07-05 02:50:35', '', 'featured-183.jpg', '', 'inherit', 'open', 'closed', '', 'featured-183-jpg', '', '', '2026-07-04 23:50:35', '2026-07-05 02:50:35', '', '183', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-183.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('266', '0', '2026-07-04 23:50:35', '2026-07-05 02:50:35', '', 'featured-184.jpg', '', 'inherit', 'open', 'closed', '', 'featured-184-jpg', '', '', '2026-07-04 23:50:35', '2026-07-05 02:50:35', '', '184', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-184.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('267', '0', '2026-07-04 23:50:36', '2026-07-05 02:50:36', '', 'featured-185.jpg', '', 'inherit', 'open', 'closed', '', 'featured-185-jpg', '', '', '2026-07-04 23:50:36', '2026-07-05 02:50:36', '', '185', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-185.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('268', '0', '2026-07-04 23:50:36', '2026-07-05 02:50:36', '', 'featured-186.jpg', '', 'inherit', 'open', 'closed', '', 'featured-186-jpg', '', '', '2026-07-04 23:50:36', '2026-07-05 02:50:36', '', '186', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-186.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('269', '0', '2026-07-04 23:50:36', '2026-07-05 02:50:36', '', 'featured-187.jpg', '', 'inherit', 'open', 'closed', '', 'featured-187-jpg', '', '', '2026-07-04 23:50:36', '2026-07-05 02:50:36', '', '187', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-187.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('270', '0', '2026-07-04 23:50:37', '2026-07-05 02:50:37', '', 'featured-188.jpg', '', 'inherit', 'open', 'closed', '', 'featured-188-jpg', '', '', '2026-07-04 23:50:37', '2026-07-05 02:50:37', '', '188', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-188.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('271', '0', '2026-07-04 23:50:37', '2026-07-05 02:50:37', '', 'featured-189.jpg', '', 'inherit', 'open', 'closed', '', 'featured-189-jpg', '', '', '2026-07-04 23:50:37', '2026-07-05 02:50:37', '', '189', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-189.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('272', '0', '2026-07-04 23:50:37', '2026-07-05 02:50:37', '', 'featured-190.jpg', '', 'inherit', 'open', 'closed', '', 'featured-190-jpg', '', '', '2026-07-04 23:50:37', '2026-07-05 02:50:37', '', '190', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-190.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('273', '0', '2026-07-04 23:50:37', '2026-07-05 02:50:37', '', 'featured-1.jpg', '', 'inherit', 'open', 'closed', '', 'featured-1-jpg', '', '', '2026-07-04 23:50:37', '2026-07-05 02:50:37', '', '1', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/featured-1.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('280', '0', '2026-07-04 23:53:16', '2026-07-05 02:53:16', '', 'Default Kit', '', 'publish', 'closed', 'closed', '', 'default-kit', '', '', '2026-07-04 23:53:16', '2026-07-05 02:53:16', '', '0', 'http://localhost:8082/ideiasti/?p=280', '0', 'elementor_library', '', '0');
INSERT INTO `wp_posts` VALUES ('281', '0', '2026-07-05 00:36:51', '2026-07-05 03:36:51', '', 'Sobre', '', 'publish', 'closed', 'closed', '', 'sobre', '', '', '2026-07-05 00:36:51', '2026-07-05 03:36:51', '', '0', 'http://localhost:8082/ideiasti/sobre/', '1', 'nav_menu_item', '', '0');
INSERT INTO `wp_posts` VALUES ('282', '0', '2026-07-05 00:36:51', '2026-07-05 03:36:51', '', 'Política de Privacidade', '', 'publish', 'closed', 'closed', '', 'politica-de-privacidade', '', '', '2026-07-05 00:36:51', '2026-07-05 03:36:51', '', '0', 'http://localhost:8082/ideiasti/politica-de-privacidade/', '2', 'nav_menu_item', '', '0');
INSERT INTO `wp_posts` VALUES ('283', '0', '2026-07-05 00:36:51', '2026-07-05 03:36:51', '', 'Termos de Uso', '', 'publish', 'closed', 'closed', '', 'termos-de-uso', '', '', '2026-07-05 00:36:51', '2026-07-05 03:36:51', '', '0', 'http://localhost:8082/ideiasti/termos-de-uso/', '3', 'nav_menu_item', '', '0');
INSERT INTO `wp_posts` VALUES ('284', '0', '2026-07-05 00:55:30', '2026-07-05 03:55:30', '', 'Home', '', 'publish', 'closed', 'closed', '', 'home', '', '', '2026-07-05 00:55:30', '2026-07-05 03:55:30', '', '0', 'http://localhost:8082/ideiasti/home/', '1', 'nav_menu_item', '', '0');
INSERT INTO `wp_posts` VALUES ('285', '0', '2026-07-05 00:55:30', '2026-07-05 03:55:30', '', 'Sobre', '', 'publish', 'closed', 'closed', '', 'sobre-2', '', '', '2026-07-05 20:50:15', '2026-07-05 23:50:15', '', '0', 'http://localhost:8082/ideiasti/sobre-2/', '4', 'nav_menu_item', '', '0');
INSERT INTO `wp_posts` VALUES ('286', '0', '2026-07-05 00:55:30', '2026-07-05 03:55:30', '', 'Introdução a Qualidade de Software', '', 'publish', 'closed', 'closed', '', 'introducao-a-qualidade-de-software', '', '', '2026-07-05 20:50:15', '2026-07-05 23:50:15', '', '0', 'http://localhost:8082/ideiasti/introducao-a-qualidade-de-software/', '2', 'nav_menu_item', '', '0');
INSERT INTO `wp_posts` VALUES ('287', '0', '2026-07-05 00:55:30', '2026-07-05 03:55:30', '', 'Testes Automatizados', '', 'publish', 'closed', 'closed', '', 'testes-automatizados', '', '', '2026-07-05 20:50:15', '2026-07-05 23:50:15', '', '0', 'http://localhost:8082/ideiasti/testes-automatizados/', '3', 'nav_menu_item', '', '0');
INSERT INTO `wp_posts` VALUES ('288', '0', '2026-07-05 00:55:30', '2026-07-05 03:55:30', '', 'Política de Privacidade', '', 'publish', 'closed', 'closed', '', 'politica-de-privacidade-2', '', '', '2026-07-05 00:55:30', '2026-07-05 03:55:30', '', '0', 'http://localhost:8082/ideiasti/politica-de-privacidade-2/', '5', 'nav_menu_item', '', '0');
INSERT INTO `wp_posts` VALUES ('289', '0', '2026-07-05 00:55:30', '2026-07-05 03:55:30', '', 'Termos de Uso', '', 'publish', 'closed', 'closed', '', 'termos-de-uso-2', '', '', '2026-07-05 00:55:30', '2026-07-05 03:55:30', '', '0', 'http://localhost:8082/ideiasti/termos-de-uso-2/', '6', 'nav_menu_item', '', '0');
INSERT INTO `wp_posts` VALUES ('333', '0', '2026-07-05 01:12:10', '2026-07-05 04:12:10', '<h2>Bem-vindo ao ideiasti</h2>\n<p>O <strong>ideiasti</strong> é um blog dedicado a <strong>Qualidade de Software</strong> e <strong>Engenharia de Software</strong>. Nosso objetivo é compartilhar conhecimento prático e teórico sobre como construir software de alta qualidade.</p>\n<p>Acreditamos que qualidade não é uma etapa do desenvolvimento, mas sim uma cultura que deve estar presente em todo o ciclo de vida do software.</p>\n<h3>O que você encontra aqui</h3>\n<ul>\n<li>✅ Artigos sobre Testes Automatizados (unitários, integração, E2E)</li>\n<li>✅ Continuous Integration e Continuous Delivery</li>\n<li>✅ Métricas de Qualidade e KPIs</li>\n<li>✅ Ferramentas e frameworks de teste</li>\n<li>✅ Boas práticas de Engenharia de Software</li>\n<li>✅ Padrões de projeto e arquitetura</li>\n</ul>\n<h3>Para quem é este blog</h3>\n<p>Desenvolvedores, QAs, Tech Leads, Gerentes de Projeto e todos que se interessam por construir software melhor. Se você se preocupa com qualidade, está no lugar certo!</p>', 'Sobre', '', 'inherit', 'closed', 'closed', '', '53-revision-v1', '', '', '2026-07-05 01:12:10', '2026-07-05 04:12:10', '', '53', 'http://localhost:8082/ideiasti/?p=333', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('335', '0', '2026-07-05 01:12:10', '2026-07-05 04:12:10', '<h2>Termos de Uso</h2>\n<p>Ao acessar o ideiasti, você concorda com os seguintes termos:</p>\n<h3>Uso do Conteúdo</h3>\n<p>Todo o conteúdo publicado neste blog é para fins informativos e educacionais. Os artigos refletem a opinião dos autores e não constituem aconselhamento profissional.</p>\n<h3>Propriedade Intelectual</h3>\n<p>O conteúdo deste site é protegido por direitos autorais. É permitido compartilhar links para nossos artigos, mas a reprodução total ou parcial sem autorização é proibida.</p>\n<h3>Links de Afiliados</h3>\n<p>Este site pode conter links de afiliados. Isso significa que podemos receber uma comissão se você adquirir produtos através destes links, sem custo adicional para você.</p>\n<h3>Precisão das Informações</h3>\n<p>Nos esforçamos para manter as informações atualizadas e precisas, mas não garantimos a completeza ou atualidade do conteúdo.</p>\n<h3>Limitação de Responsabilidade</h3>\n<p>O ideiasti não se responsabiliza por danos decorrentes do uso das informações publicadas neste site.</p>\n<h3>Alterações</h3>\n<p>Estes termos podem ser atualizados periodicamente. Recomendamos revisá-los regularmente.</p>\n<p><em>Última atualização: Julho 2026</em></p>', 'Termos de Uso', '', 'inherit', 'closed', 'closed', '', '54-revision-v1', '', '', '2026-07-05 01:12:10', '2026-07-05 04:12:10', '', '54', 'http://localhost:8082/ideiasti/?p=335', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('336', '0', '2026-07-05 19:34:26', '2026-07-05 22:34:26', '<figure><img src=\"https://media.giphy.com/media/l0HlHJGHe3yAMjfFC/giphy.gif\" alt=\"GIF de exemplo\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este é um artigo de teste para verificar a automação de importação.</p>\n\n<p><strong>Teste concluído com sucesso!</strong></p>', 'Teste de Importação', '', 'publish', 'open', 'open', '', 'testeautomacao', '', '', '2026-07-05 19:34:26', '2026-07-05 22:34:26', '', '0', 'http://localhost:8082/ideiasti/testeautomacao/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('337', '0', '2026-07-06 23:05:46', '2026-07-07 02:05:46', '<p>Conteúdo do artigo em <strong>Markdown</strong>.</p>\n\n<h2>Seção</h2>\n\n<ul><li>Item 1</li><ol><li>Item 2</li></ol></ul>\n\n<h3>Subseção</h3>\n\n<figure><img src=\"img/exemplo.jpg\" alt=\"Descrição da imagem\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>&gt; Citação importante.</p>\n\n<pre><code>def hello():\n    print(\"Hello, QA World!\")\n</code></pre>\n\n<p>Tabela:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Coluna 1</th><th>Coluna 2</th></tr>\n<tr><td>Valor 1</td><td>Valor 2</td></tr>\n</table></figure>', 'Título do Artigo', '', 'publish', 'closed', 'open', '', 'exemplo', '', '', '2026-07-06 23:05:46', '2026-07-07 02:05:46', '', '0', 'http://localhost:8082/ideiasti/exemplo/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('338', '0', '2026-07-06 23:05:46', '2026-07-07 02:05:46', '<p><!-- wp:image {\"align\":\"center\",\"sizeSlug\":\"large\"} --><br><figure class=\"wp-block-image size-large aligncenter\"><img src=\"https://media.giphy.com/media/l3q2K5jinAlChoCLS/giphy.gif\" alt=\"Termos e Condições\" /></figure><br><!-- /wp:image --></p>\n\n<h2>Aceitação dos Termos</h2>\n\n<p>Bem-vindo ao <strong>Blog QA Brasil</strong>. Ao acessar, navegar ou utilizar qualquer conteúdo deste site, você concorda com estes Termos de Uso na íntegra. Se você não concorda com qualquer parte destes termos, solicitamos que não utilize nosso blog.</p>\n\n<p>Última atualização: Janeiro de 2025</p>\n\n<hr>\n<h2>1. Informações sobre o Site</h2>\n\n<h3>1.1 Quem Somos</h3>\n\n<p>O Blog QA Brasil é uma plataforma de conteúdo educacional dedicada a:</p>\n\n<p><!-- wp:list --><br><ul><li><strong>Qualidade de Software</strong> - Artigos e guias sobre QA</li><ol><li><strong>Testes de Software</strong> - Metodologias e boas práticas</li><br><li><strong>Automação</strong> - Frameworks e ferramentas</li><br><li><strong>DevOps</strong> - Integração e entrega contínua</li><br></ol><!-- /wp:list --></p>\n\n<h3>1.2 Dados do Proprietário</h3>\n<ol><li><strong>Nome:</strong> Blog QA Brasil</li>\n<li><strong>E-mail:</strong> contato@qabrasil.blog</li>\n<li><strong>Finalidade:</strong> Conteúdo educacional sobre Qualidade de Software</li>\n</ol>\n<hr>\n<h2>2. Objetivo do Site</h2>\n\n<h3>2.1 Conteúdo Oferecido</h3>\n\n<p>Nosso blog disponibiliza:</p>\n\n<p><!-- wp:table {\"className\":\"is-style-stripes\"} --><br><figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Tipo de Conteúdo</th><th>Descrição</th></tr></thead><tbody><tr><td><strong>Artigos Educacionais</strong></td><td>Tutoriais e guias sobre QA e testes</td></tr><tr><td><strong>Notícias</strong></td><td>Tendências e atualizações do setor</td></tr><tr><td><strong>Análises</strong></td><td>Reviews de ferramentas e frameworks</td></tr><tr><td><strong>Recursos</strong></td><td>Links, templates e materiais complementares</td></tr></tbody></table></figure><br><!-- /wp:table --></p>\n\n<h3>2.2 Natureza do Conteúdo</h3>\n\n<p>Todo conteúdo é de caráter <strong>estritamente educacional e informativo</strong>. As informações presentes não constituem aconselhamento profissional, consultoria técnica ou garantia de resultados.</p>\n\n<hr>\n<h2>3. Uso Permitido</h2>\n\n<h3>3.1 O Que Você Pode Fazer</h3>\n\n<p>Você está autorizado a:</p>\n\n<p><!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|30\",\"left\":\"var:preset|spacing|30\",\"right\":\"var:preset|spacing|30\"}},\"border\":{\"radius\":\"5px\"}},\"backgroundColor\":\"secondary\",\"className\":\"has-background\"} --><br><div class=\"wp-block-group has-background\" style=\"border-radius:5px;padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:list --><ol><li><strong>Ler e acessar</strong> todo conteúdo público do site</li><br><li><strong>Compartilhar</strong> artigos em redes sociais com atribuição</li><br><li><strong>Citar trechos</strong> em trabalhos acadêmicos com referência</li><br><li><strong>Inscrever-se</strong> na newsletter voluntariamente</li><br><li><strong>Comentar</strong> em posts seguindo as diretrizes</li><br><li><strong>Baixar recursos</strong> disponibilizados gratuitamente</li><br></ol><!-- /wp:list --></div><br><!-- /wp:group --></p>\n\n<h3>3.2 Como Você Deve Compartilhar</h3>\n\n<p>Ao compartilhar nosso conteúdo, você deve:<br><ol><li><strong>Creditar</strong> o Blog QA Brasil como fonte</li><br><li><strong>Incluir link</strong> direto para o artigo original</li><br><li><strong>Não modificar</strong> o conteúdo publicado</li><br><li><strong>Não usar</strong> para fins comerciais sem autorização</li><br></ol><br><hr><br><h2>4. Uso Proibido</h2></p>\n\n<h3>4.1 Atividades Não Permitidas</h3>\n\n<p>É expressamente proibido:</p>\n\n<p><!-- wp:list --><ol><li><strong>Reprodução completa</strong> do conteúdo sem autorização</li><br><li><strong>Venda ou licenciamento</strong> do conteúdo como próprio</li><br><li><strong>Cópias massivas</strong> para criação de sites alternativos</li><br><li><strong>Remoção de credits</strong> ou informações de direitos autorais</li><br><li><strong>Uso indevido</strong> da marca \"Blog QA Brasil\"</li><br><li><strong>Ataques ao site</strong> - hacking, DDoS, malware</li><br><li><strong>Spam ou flood</strong> nos comentários</li><br><li><strong>Conteúdo ilegal</strong> ou que infrinja direitos de terceiros</li><br></ol><!-- /wp:list --></p>\n\n<h3>4.2 Consequências</h3>\n\n<p>Violações podem resultar em:<br><ol><li><strong>Remoção do conteúdo infrator</strong></li><br><li><strong>Bloqueio de acesso ao site</strong></li><br><li><strong>Notificações legais</strong></li><br><li><strong>Responsabilização civil e criminal</strong></li><br></ol><br><hr><br><h2>5. Propriedade Intelectual</h2></p>\n\n<h3>5.1 Direitos Autorais</h3>\n\n<p>Todo conteúdo publicado no Blog QA Brasil é protegido por direitos autorais:<br><ol><li><strong>Textos e artigos</strong> - © Blog QA Brasil</li><br><li><strong>Imagens e gráficos</strong> - Fontes diversas (Giphy, autores)</li><br><li><strong>Código e exemplos</strong> - Licença MIT quando aplicável</li><br><li><strong>Layout e design</strong> - © Blog QA Brasil</li><br></ol><br><h3>5.2 Uso de Imagens</h3></p>\n\n<p>Utilizamos imagens do <strong>Giphy</strong> sob seus termos de serviço para ilustrar nossos artigos. As imagens permanecem propriedade de seus respectivos criadores.</p>\n\n<h3>5.3 Licença para Uso Educativo</h3>\n\n<p>Concedemos permissão para:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo de Uso</th><th>Condição</th></tr>\n<tr><td><strong>Uso acadêmico</strong></td><td>Com citação adequada</td></tr>\n<tr><td><strong>Compartilhamento social</strong></td><td>Com link para fonte</td></tr>\n<tr><td><strong>Discussão em blogs</strong></td><td>Com referência e link</td></tr>\n<tr><td><strong>Treinamento corporativo</strong></td><td>Com autorização prévia</td></tr>\n</table></figure>\n\n<hr>\n<h2>6. Isenção de Responsabilidade</h2>\n\n<h3>6.1 Conteúdo Educacional</h3>\n\n<p><!-- wp:group --><br><div class=\"wp-block-group alignwide has-border-color\" style=\"border-radius:10px;padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--40)\"><!-- wp:paragraph --><br><p><strong>Aviso Importante:</strong> O conteúdo do Blog QA Brasil é fornecido apenas para fins educacionais e informativos. Não garantimos a precisão, completude ou atualidade das informações. As decisões tomadas com base em nosso conteúdo são de sua inteira responsabilidade.</p><br><!-- /wp:paragraph --></div><br><!-- /wp:group --></p>\n\n<h3>6.2 Isenções Específicas</h3>\n\n<p>Não nos responsabilizamos por:<br><ol><li><strong>Decisões técnicas</strong> tomadas com base no conteúdo</li><br><li><strong>Perdas financeiras</strong> decorrentes do uso das informações</li><br><li><strong>Danos a sistemas</strong> por implementação de código sugerido</li><br><li><strong>Conteúdo de terceiros</strong> em links externos</li><br><li><strong>Interrupções</strong> temporárias do site</li><br></ol><br><hr><br><h2>7. Links Externos</h2></p>\n\n<h3>7.1 Links de Terceiros</h3>\n\n<p>Nosso site pode conter links para sites externos. Esses links são fornecidos apenas para sua conveniência:<br><ol><li><strong>Não controlamos</strong> sites externos</li><br><li><strong>Não endosamos</strong> o conteúdo de sites terceiros</li><br><li><strong>Não somos responsáveis</strong> por práticas de privacidade de terceiros</li><br><li><strong>Você acessa por sua conta e risco</strong></li><br></ol><br><h3>7.2 Sites Recomendados</h3></p>\n\n<p>Quando recomendamos ferramentas ou serviços:<br><ol><li>Realizamos avaliação razoável</li><br><li>Não recebemos pagamento por recomendações</li><br><li>Podemos ter parceria comercial (devidamente disclosed)</li><br></ol><br><hr><br><h2>8. Comentários e Interações</h2></p>\n\n<h3>8.1 Diretrizes para Comentários</h3>\n\n<p>Aceitamos comentários que sejam:<br><ol><li><strong>Relevantes</strong> ao tema do artigo</li><br><li><strong>Respeitosos</strong> e profissionais</li><br><li><strong>Construtivos</strong> e educacionais</li><br><li><strong>Livres de spam</strong> e autopromoção</li><br></ol><br><h3>8.2 Moderação</h3></p>\n\n<p>Reservamo-nos o direito de:<br><ol><li><strong>Moderar</strong> comentários antes da publicação</li><br><li><strong>Remover</strong> comentários inadequados</li><br><li><strong>Bloquear</strong> usuários que violem diretrizes</li><br><li><strong>Editar</strong> comentários para clareza (mantendo sentido)</li><br></ol><br><h3>8.3 Conteúdo Gerado pelo Usuário</h3></p>\n\n<p>Ao postar comentários, você:<br><ol><li>Concede-nos licença para exibição</li><br><li>Garante que é o autor ou tem direitos</li><br><li>Isenta-nos de responsabilidade por conteúdo de terceiros</li><br></ol><br><hr><br><h2>9. Newsletter e Comunicações</h2></p>\n\n<h3>9.1 Inscrição</h3>\n\n<p>Ao se inscrever na newsletter:<br><ol><li>Você concorda em receber e-mails periódicos</li><br><li>Pode cancelar a inscrição a qualquer momento</li><br><li>Seus dados são protegidos conforme nossa Política de Privacidade</li><br></ol><br><h3>9.2 E-mails Marketing</h3></p>\n\n<p>Compromissos com comunicações:<br><ol><li><strong>Frequência razoável</strong> - Máximo 2-3 e-mails por semana</li><br><li><strong>Conteúdo relevante</strong> - Artigos, dicas e novidades</li><br><li><strong>Desinscrição fácil</strong> - Link em todos os e-mails</li><br><li><strong>Sem spam</strong> - Não vendemos ou compartilhamos dados</li><br></ol><br><hr><br><h2>10. Limitação de Responsabilidade</h2></p>\n\n<h3>10.1 Extensão Máxima Permitida por Lei</h3>\n\n<p>Na máxima extensão permitida pela legislação aplicável, o Blog QA Brasil e seus proprietários <strong>não serão responsáveis</strong> por quaisquer danos diretos, indiretos, incidentais, especiais, consequenciais ou punitivos decorrentes de:</p>\n\n<p><!-- wp:list --><ol><li>Uso ou incapacidade de usar o site</li><br><li>Conteúdo de terceiros</li><br><li>Ações de outros usuários</li><br><li>Erros ou omissões no conteúdo</li><br><li>Danos a equipamentos ou software</li><br></ol><!-- /wp:list --></p>\n\n<h3>10.2 Limitação Total</h3>\n\n<p>Nossa responsabilidade total não excederá o valor que você pagou (se houver) para acessar o site, ou R$ 100,00 (cem reais), o que for maior.</p>\n\n<hr>\n<h2>11. Indenização</h2>\n\n<p>Você concorda em indenizar, defender e isentar o Blog QA Brasil, seus proprietários e colaboradores de quaisquer reclamações, ações, danos, perdas, custos e despesas (incluindo honorários advocatícios) decorrentes de:<br><ol><li>Violação destes Termos de Uso</li><br><li>Uso indevido do site</li><br><li>Conteúdo que você postar</li><br><li>Violação de direitos de terceiros</li><br></ol><br><hr><br><h2>12. Modificações dos Termos</h2></p>\n\n<h3>12.1 Atualizações</h3>\n\n<p>Reservamo-nos o direito de modificar estes termos a qualquer momento:<br><ol><li><strong>Publicaremos</strong> a versão atualizada nesta página</li><br><li><strong>Atualizaremos</strong> a data de \"Última atualização\"</li><br><li><strong>Notificaremos</strong> sobre mudanças significativas (quando possível)</li><br></ol><br><h3>12.2 Aceitação Contínua</h3></p>\n\n<p>A continuação do uso após modificações constitui aceitação dos novos termos.</p>\n\n<hr>\n<h2>13. Rescisão</h2>\n\n<h3>13.1 Término pela Empresa</h3>\n\n<p>Podemos encerrar ou suspender seu acesso imediatamente, sem aviso prévio, por qualquer motivo, incluindo violação destes termos.</p>\n\n<h3>13.2 Efeitos da Rescisão</h3>\n\n<p>Após rescisão:<br><ol><li>Seu direito de usar o site cessa imediatamente</li><br><li>Comentários e conteúdo podem ser removidos</li><br><li>Disposições que devam sobreviver continuam vigentes</li><br></ol><br><hr><br><h2>14. Lei Aplicável</h2></p>\n\n<h3>14.1 Jurisdição</h3>\n\n<p>Estes termos são regidos pelas leis brasileiras:<br><ol><li><strong>Lei nº 9.610/1998</strong> - Direitos Autorais</li><br><li><strong>Lei nº 12.965/2014</strong> - Marco Civil da Internet</li><br><li><strong>Lei nº 13.709/2018</strong> - LGPD</li><br><li><strong>Código de Defesa do Consumidor</strong> - Quando aplicável</li></ol></ul></p>\n\n<h3>14.2 Foro</h3>\n\n<p>Qualquer litígio será resolvido no foro da comarca de <strong>São Paulo, SP</strong>, salvo disposição em contrário.</p>\n\n<hr>\n<h2>15. Disposições Gerais</h2>\n\n<h3>15.1 Integridade do Acordo</h3>\n\n<p>Estes termos constituem o acordo completo entre você e o Blog QA Brasil.</p>\n\n<h3>15.2 Severabilidade</h3>\n\n<p>Se qualquer disposição for considerada inválida, as demais disposições permanecem em pleno vigor.</p>\n\n<h3>15.3 Renúncia</h3>\n\n<p>A não exercício de qualquer direito não constitui renúncia a esse direito.</p>\n\n<h3>15.4 Cessão</h3>\n\n<p>Você não pode ceder seus direitos sob estes termos.</p>\n\n<hr>\n<h2>16. Contato</h2>\n\n<p>Para questões sobre estes Termos de Uso:</p>\n\n<p><!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|50\",\"bottom\":\"var:preset|spacing|50\",\"left\":\"var:preset|spacing|50\",\"right\":\"var:preset|spacing|50\"}},\"border\":{\"radius\":\"10px\"}},\"backgroundColor\":\"primary\",\"textColor\":\"white\",\"className\":\"has-white-color has-primary-background-color has-text-color has-background\"} --><br><div class=\"wp-block-group alignwide has-white-color has-primary-background-color has-text-color has-background\" style=\"border-radius:10px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)\"><!-- wp:paragraph --><br><p><strong>Blog QA Brasil - Termos de Uso</strong><br /><br>E-mail: contato@qabrasil.blog<br /><br>Última atualização: Janeiro de 2025</p><br><!-- /wp:paragraph --></div><br><!-- /wp:group --></p>\n\n<hr>\n<em>A utilização deste site implica na aceitação integral destes Termos de Uso. Se você não concorda com qualquer parte destes termos, por favor, não utilize nosso blog.</em>', 'Termos de Uso', '', 'publish', 'closed', 'closed', '', 'termos-de-uso', '', '', '2026-07-06 23:05:46', '2026-07-07 02:05:46', '', '0', 'http://localhost:8082/ideiasti/termos-de-uso/', '0', 'page', '', '0');
INSERT INTO `wp_posts` VALUES ('339', '1', '2026-07-05 19:38:41', '0000-00-00 00:00:00', '', 'Elementor #339', '', 'draft', 'closed', 'closed', '', '', '', '', '2026-07-05 19:38:41', '2026-07-05 22:38:41', '', '0', 'http://localhost:8082/ideiasti/?page_id=339', '0', 'page', '', '0');
INSERT INTO `wp_posts` VALUES ('340', '1', '2026-07-05 19:38:41', '2026-07-05 22:38:41', '', 'Elementor #339', '', 'inherit', 'closed', 'closed', '', '339-revision-v1', '', '', '2026-07-05 19:38:41', '2026-07-05 22:38:41', '', '339', 'http://localhost:8082/ideiasti/?p=340', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('341', '1', '2026-07-05 19:47:54', '0000-00-00 00:00:00', '{\n    \"blogname\": {\n        \"value\": \"Ideiasti\",\n        \"type\": \"option\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2026-07-05 22:47:54\"\n    }\n}', '', '', 'auto-draft', 'closed', 'closed', '', '47e90360-a1be-4f98-9ba9-fe3adffa900a', '', '', '2026-07-05 19:47:54', '0000-00-00 00:00:00', '', '0', 'http://localhost:8082/ideiasti/?p=341', '0', 'customize_changeset', '', '0');
INSERT INTO `wp_posts` VALUES ('342', '1', '2026-07-05 21:23:48', '2026-07-06 00:23:48', '{\"version\": 3, \"isGlobalStylesUserThemeJSON\": true }', 'Custom Styles', '', 'publish', 'closed', 'closed', '', 'wp-global-styles-ideiasti-tech', '', '', '2026-07-05 21:23:48', '2026-07-06 00:23:48', '', '0', 'http://localhost:8082/ideiasti/wp-global-styles-ideiasti-tech/', '0', 'wp_global_styles', '', '0');
INSERT INTO `wp_posts` VALUES ('343', '1', '2026-07-06 00:12:58', '2026-07-06 03:12:58', '', 'Caos_enginering', '', 'inherit', 'open', 'closed', '', 'caos_enginering', '', '', '2026-07-06 00:12:58', '2026-07-06 03:12:58', '', '211', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/Caos_enginering.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('345', '1', '2026-07-06 00:13:43', '2026-07-06 03:13:43', '<p><strong>Meta Description:</strong> Aprenda Chaos Engineering: princípios, ferramentas (Chaos Monkey, Gremlin), inject faults deliberadamente e garantir resiliência do sistema.</p>\n\n<hr>\n<h2>O Que é Chaos Engineering?</h2>\n\n<p>Chaos Engineering é a prática de injectar falhas deliberadamente em sistemas para testar resiliência e descobrir vulnerabilidades antes que elas causem problemas em produção.</p>\n\n<h3>Princípios</h3>\n<ol><li><strong>Hipótese primeiro</strong>: Defina o que você quer testar</li>\n<li><strong>Comece pequeno</strong>: Aumente gradualmente</li>\n<li><strong>Máximo impacto, mínimo dano</strong>: Controle o blast radius</li>\n<li><strong>Monitore sempre</strong>: Observe métricas durante experimentos</li>\n<li><strong>Automação</strong>: Execute experimentos continuamente</li>\n</ol>\n<hr>\n<h2>Prática de Chaos Engineering</h2>\n\n<h3>Ciclo de Experimentos</h3>\n\n<pre><code>┌─────────────────────────────────────┐\n│                                     │\n│  1. Define Hipótese                 │\n│     \"O sistema funciona se DB cair\"  │\n│                                     │\n│  2. Planeja Experimento             │\n│     \"DB node mata por 60s\"          │\n│                                     │\n│  3. Executa em Prod-like            │\n│     \"Staging environment\"           │\n│                                     │\n│  4. Observa Métricas                │\n│     \"Taxa de erro aumenta?\"          │\n│                                     │\n│  5. Analisa Resultados              │\n│     \"Sistema degradou graciosamente\"│\n│                                     │\n│  6. Melhora Sistema                 │\n│     \"Adicionar circuit breaker\"      │\n│                                     │\n└─────────────────────────────────────┘\n</code></pre>\n\n<h3>Hipóteses de Teste</h3>\n\n<pre><code># Hipóteses de Chaos Engineering\n\n<h2>1. Alta Disponibilidade</h2>\nHipótese: \"Se um node da API morrer, o sistema continuará funcionando\"\nExperimento: Matar 1 instance de API\nMétricas: Throughput, error rate, latency\nResultado Esperado: Throughput cai 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}, mas sem erros 5xx\n\n<h2>2. Database Resilience</h2>\nHipótese: \"Se o banco primário ficar indisponível, failover ocurrerrá automaticamente\"\nExperimento: Matar database primary\nMétricas: Time to failover, error rate\nResultado Esperado: Failover em &lt;60s, erros apenas durante transição\n\n<h2>3. Network Partition</h2>\nHipótese: \"Se rede entre serviços degrada, retry logic funcionará\"\nExperimento: Adicionar latência de 500ms\nMétricas: Retry count, timeout rate\nResultado Esperado: Retries com backoff, nenhum erro usuário final\n\n<h2>4. Memory Leak</h2>\nHipótese: \"Se memory leak ocurrer, sistema reiniciará corretamente\"\nExperimento: Simular leak por alocar memória\nMétricas: Memory usage, restart count\nResultado Esperado: Service restart gracefully\n</code></pre>\n\n<hr>\n<h2>Ferramentas</h2>\n\n<h3>Chaos Monkey</h3>\n\n<pre><code># Instalação\nbrew install chaos-monkey\n# ou\ndocker pull chaosmonkey/chaos-monkey\n\n<p># Configuração (chaos-monkey.json)<br>{<br>  \"enabled\": true,<br>  \"runScheme\": \"fixed\",<br>  \"startTime\": \"08:00\",<br>  \"endTime\": \"20:00\",<br>  \"daysOfWeek\": [\"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\"],<br>  \"kind\": \"exp-random\",<br>  \"services\": [<br>    {<br>      \"name\": \"api-service\",<br>      \"probability\": 30,<br>      \"attacks\": [\"kill-container\"]<br>    },<br>    {<br>      \"name\": \"payment-service\",<br>      \"probability\": 50,<br>      \"attacks\": [\"network-latency\"]<br>    }<br>  ]<br>}</p>\n\n<p># Executar<br>chaos-monkey run --config chaos-monkey.json<br></code></pre></p>\n\n<h3>Gremlin</h3>\n\n<pre><code># CLI Installation\ncurl - https://www.gremlin.com/gremlin-cli.tar.gz | tar -xz\nsudo mv gremlin /usr/local/bin/\n\n<p># Initialize<br>gremlin init --teamid YOUR_TEAM_ID --secret YOUR_SECRET</p>\n\n<p># Attack Examples</p>\n\n<p># 1. CPU Attack<br>gremlin attack cpu --length 60 --percent 100</p>\n\n<p># 2. Memory Attack<br>gremlin attack memory --length 60 --percent 50</p>\n\n<p># 3. IO Attack<br>gremlin attack io --length 60 --percent 100</p>\n\n<p># 4. Network Attack<br>gremlin attack network --delay 500 --loss 10 --percent 50</p>\n\n<p># 5. Process Kill<br>gremlin attack process --process-name nginx</p>\n\n<p># 6. DNS Attack<br>gremlin attack dns --hostname api.example.com --ip 127.0.0.1<br></code></pre></p>\n\n<h3>LitmusChaos (Kubernetes)</h3>\n\n<pre><code># Pod Delete Experiment\napiVersion: litmuschaos.io/v1alpha1\nkind: ChaosEngine\nmetadata:\n  name: pod-delete-chaos\n  namespace: litmus\nspec:\n  appinfo:\n    appns: production\n    applabel: \"app=api\"\n  chaosServiceAccount: litmus-admin\n  experiments:\n    - name: pod-delete\n      spec:\n        components:\n          env:\n            - name: TOTAL_CHAOS_DURATION\n              value: \'30\'\n            - name: CHAOS_INTERVAL\n              value: \'10\'\n            - name: FORCE\n              value: \'false\'\n</code></pre>\n\n<hr>\n<h2>Exemplos de Experimentos</h2>\n\n<h3>1. API Latency Injection</h3>\n\n<pre><code># Testando timeout e retry\nimport requests\nimport time\nimport random\n\n<p>def test_api_resilience():<br>    \"\"\"<br>    Hipótese: API cliente deve ter timeout e retry configurados<br>    \"\"\"<br>    base_url = \"http://api-service:8080\"<br>    timeouts = 0<br>    successes = 0<br>    retries = 0</p>\n\n<p>for i in range(100):<br>        try:<br>            response = requests.get(<br>                f\"{base_url}/data\",<br>                timeout=5,<br>                headers={\"X-Client-Id\": f\"test-{i}\"}<br>            )<br>            if response.status_code == 200:<br>                successes += 1<br>        except requests.Timeout:<br>            timeouts += 1<br>        except requests.ConnectionError:<br>            retries += 1</p>\n\n<p># Assertions<br>    assert successes &gt;= 90, f\"Only {successes}{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} success rate\"<br>    assert timeouts &lt;= 5, f&quot;Too many timeouts: {timeouts}&quot;<br></code></pre></p>\n\n<h3>2. Database Failover</h3>\n\n<pre><code># Teste manual de failover\n# 1. Identificar primary\npsql -h db-cluster -c \"SELECT pg_is_in_recovery();\"\n\n<p># 2. Simular failure no primary<br># (Em produção, usar orquestrador)</p>\n\n<p># 3. Verificar failover<br>psql -h db-cluster -c \"SELECT pg_is_in_recovery();\"<br># Deve retornar \'t\' no novo primary</p>\n\n<p># 4. Verificar aplicação<br>curl http://api-service:8080/health<br># Deve estar healthy após breve degradation<br></code></pre></p>\n\n<h3>3. Network Partition</h3>\n\n<pre><code># iptables para simular latência\n# Adicionar latência\niptables -A INPUT -p tcp --dport 5432 -m state --state NEW \n  -m recent --set --name DBPOSTGRES\n\n<p>iptables -A INPUT -p tcp --dport 5432 -m state --state NEW <br>  -m recent --update --seconds 1 --hitcount 10 --name DBPOSTGRES <br>  -j DROP</p>\n\n<p># Adicionar delay de 500ms<br>tc qdisc add dev eth0 root netem delay 500ms</p>\n\n<p># Remover (cleanup)<br>tc qdisc del dev eth0 root<br></code></pre></p>\n\n<h3>4. Container Kill</h3>\n\n<pre><code>#!/bin/bash\n# chaos-test.sh\n\n<p>echo \"=== Chaos Engineering Test ===\"<br>echo \"Target: Random API pod\"</p>\n\n<p># Get random API pod<br>POD=$(kubectl get pods -n production -l app=api <br>  -o jsonpath=\'{.items[0].metadata.name}\')</p>\n\n<p>echo \"Killing pod: $POD\"</p>\n\n<p># Get metrics before<br>kubectl top pods $POD -n production<br>ERROR_RATE_BEFORE=$(curl -s http://api-service/metrics | grep error_rate)</p>\n\n<p># Kill pod<br>kubectl delete pod $POD -n production</p>\n\n<p># Monitor recovery<br>echo \"Monitoring recovery...\"<br>for i in {1..30}; do<br>    RESPONSE=$(curl -s -o /dev/null -w \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}{http_code}\" http://api-service/health)<br>    if [ \"$RESPONSE\" == \"200\" ]; then<br>        echo \"Recovered after ${i} seconds\"<br>        break<br>    fi<br>    sleep 1<br>done</p>\n\n<p># Get metrics after<br>kubectl top pods -n production -l app=api<br>ERROR_RATE_AFTER=$(curl -s http://api-service/metrics | grep error_rate)</p>\n\n<p>echo \"Error rate before: $ERROR_RATE_BEFORE\"<br>echo \"Error rate after: $ERROR_RATE_AFTER\"</p>\n\n<p># Validate<br>if [ $i -lt 30 ]; then<br>    echo \"✅ Recovery successful\"<br>else<br>    echo \"❌ Recovery failed\"<br>    exit 1<br>fi<br></code></pre></p>\n\n<hr>\n<h2>SRE错误预算 (Error Budgets)</h2>\n\n<pre><code># Error Budget Calculator\nclass ErrorBudget:\n    def __init__(self, slo_percentage, window_days=30):\n        self.slo = slo_percentage / 100\n        self.window_hours = window_days <em> 24 </em> 60 * 60\n\n<p>def allowed_downtime(self):<br>        \"\"\"Tempo máximo de downtime permitido\"\"\"<br>        return (1 - self.slo) * self.window_hours</p>\n\n<p>def current_budget(self, actual_uptime):<br>        \"\"\"Orçamento restante\"\"\"<br>        budget_used = (1 - actual_uptime) * self.window_hours<br>        return self.allowed_downtime() - budget_used</p>\n\n<p>def budget_remaining_percentage(self, actual_uptime):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de orçamento restante\"\"\"<br>        budget = self.current_budget(actual_uptime)<br>        return (budget / self.allowed_downtime()) * 100</p>\n\n<p># Uso<br>budget = ErrorBudget(slo_percentage=99.9, window_days=30)<br>allowed = budget.allowed_downtime()<br>print(f\"Allowed downtime: {allowed/60:.1f} minutes per month\")</p>\n\n<p># Verificar se pode fazer chaos<br>actual_uptime = 0.998  # 99.8{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>remaining = budget.budget_remaining_percentage(actual_uptime)<br>print(f\"Budget remaining: {remaining:.1f}{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\")</p>\n\n<p>if remaining &gt; 50:<br>    print(\"✅ Safe to run chaos experiments\")<br>else:<br>    print(\"⚠️ Budget low, avoid chaos\")<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Chaos Engineeringprevine falhas em produção. As chaves são:<br><ol><li><strong>Comece com hipóteses</strong> - O que você quer provar?</li><br><li><strong>Amplitude controlada</strong> - Limite o blast radius</li><br><li><strong>Monitore</strong> - Observabilidade durante experimentos</li><br><li><strong>Automação</strong> - Execute continuamente</li><br><li><strong>Cultura</strong> - Aprenda com falhas, não puna</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Chaos Engineering é seguro?</strong>  <br>R: Sim, quando feito com controle de blast radius e rollback.</p>\n\n<p><strong>P: Quando começar?</strong>  <br>R: Quando você tiver observabilidade básica (métricas, logs, alertas).</p>\n\n<p><strong>P: Qual ambiente usar?</strong>  <br>R: Comece em staging, depois produção controlada.</p>', 'Chaos Engineering: Testando Resiliência e Confiabilidade', '', 'inherit', 'closed', 'closed', '', '211-revision-v1', '', '', '2026-07-06 00:13:43', '2026-07-06 03:13:43', '', '211', 'http://localhost:8082/ideiasti/?p=345', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('346', '0', '2026-07-06 01:19:23', '2026-07-06 04:19:23', '', 'AI', '', 'inherit', 'open', 'closed', '', 'ai', '', '', '2026-07-06 01:19:23', '2026-07-06 04:19:23', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/AI.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('347', '0', '2026-07-06 01:19:28', '2026-07-06 04:19:28', '', 'Agile', '', 'inherit', 'open', 'closed', '', 'agile', '', '', '2026-07-06 01:19:28', '2026-07-06 04:19:28', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/Agile.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('348', '0', '2026-07-06 01:19:32', '2026-07-06 04:19:32', '', 'BDD', '', 'inherit', 'open', 'closed', '', 'bdd', '', '', '2026-07-06 01:19:32', '2026-07-06 04:19:32', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/BDD.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('349', '0', '2026-07-06 01:19:36', '2026-07-06 04:19:36', '', 'Caos_enginering-1', '', 'inherit', 'open', 'closed', '', 'caos_enginering-1', '', '', '2026-07-06 01:19:36', '2026-07-06 04:19:36', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/Caos_enginering-1.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('350', '0', '2026-07-06 01:19:38', '2026-07-06 04:19:38', '', 'Cucumber_e_-Gherkin', '', 'inherit', 'open', 'closed', '', 'cucumber_e_-gherkin', '', '', '2026-07-06 01:19:38', '2026-07-06 04:19:38', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/Cucumber_e_-Gherkin.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('351', '0', '2026-07-06 01:19:40', '2026-07-06 04:19:40', '', 'DockerParaQA', '', 'inherit', 'open', 'closed', '', 'dockerparaqa', '', '', '2026-07-06 01:19:40', '2026-07-06 04:19:40', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/DockerParaQA.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('352', '0', '2026-07-06 01:19:43', '2026-07-06 04:19:43', '', 'Security_-Testing_-OWASP', '', 'inherit', 'open', 'closed', '', 'security_-testing_-owasp', '', '', '2026-07-06 01:19:43', '2026-07-06 04:19:43', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/Security_-Testing_-OWASP.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('353', '0', '2026-07-06 01:19:45', '2026-07-06 04:19:45', '', 'TesteE2E', '', 'inherit', 'open', 'closed', '', 'testee2e', '', '', '2026-07-06 01:19:45', '2026-07-06 04:19:45', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/TesteE2E.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('354', '0', '2026-07-06 01:19:47', '2026-07-06 04:19:47', '', 'acessebility', '', 'inherit', 'open', 'closed', '', 'acessebility', '', '', '2026-07-06 01:19:47', '2026-07-06 04:19:47', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/acessebility.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('355', '0', '2026-07-06 01:19:51', '2026-07-06 04:19:51', '', 'automated-CI_CD-pipeline-visual', '', 'inherit', 'open', 'closed', '', 'automated-ci_cd-pipeline-visual', '', '', '2026-07-06 01:19:51', '2026-07-06 04:19:51', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/automated-CI_CD-pipeline-visual.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('356', '0', '2026-07-06 01:19:55', '2026-07-06 04:19:55', '', 'cenarios', '', 'inherit', 'open', 'closed', '', 'cenarios', '', '', '2026-07-06 01:19:55', '2026-07-06 04:19:55', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/cenarios.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('357', '0', '2026-07-06 01:19:58', '2026-07-06 04:19:58', '', 'continous_testes', '', 'inherit', 'open', 'closed', '', 'continous_testes', '', '', '2026-07-06 01:19:58', '2026-07-06 04:19:58', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/continous_testes.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('358', '0', '2026-07-06 01:20:00', '2026-07-06 04:20:00', '', 'deploy', '', 'inherit', 'open', 'closed', '', 'deploy', '', '', '2026-07-06 01:20:00', '2026-07-06 04:20:00', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/deploy.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('359', '0', '2026-07-06 01:20:04', '2026-07-06 04:20:04', '', 'fakeServiceMoking', '', 'inherit', 'open', 'closed', '', 'fakeservicemoking', '', '', '2026-07-06 01:20:04', '2026-07-06 04:20:04', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/fakeServiceMoking.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('360', '0', '2026-07-06 01:20:05', '2026-07-06 04:20:05', '', 'framework', '', 'inherit', 'open', 'closed', '', 'framework', '', '', '2026-07-06 01:20:05', '2026-07-06 04:20:05', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/framework.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('361', '0', '2026-07-06 01:20:08', '2026-07-06 04:20:08', '', 'kanban', '', 'inherit', 'open', 'closed', '', 'kanban', '', '', '2026-07-06 01:20:08', '2026-07-06 04:20:08', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/kanban.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('362', '0', '2026-07-06 01:20:13', '2026-07-06 04:20:13', '', 'metric', '', 'inherit', 'open', 'closed', '', 'metric', '', '', '2026-07-06 01:20:13', '2026-07-06 04:20:13', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/metric.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('363', '0', '2026-07-06 01:20:16', '2026-07-06 04:20:16', '', 'metricasQA', '', 'inherit', 'open', 'closed', '', 'metricasqa', '', '', '2026-07-06 01:20:16', '2026-07-06 04:20:16', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/metricasQA.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('364', '0', '2026-07-06 01:20:16', '2026-07-06 04:20:16', '', 'owasp', '', 'inherit', 'open', 'closed', '', 'owasp', '', '', '2026-07-06 01:20:16', '2026-07-06 04:20:16', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/owasp.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('365', '0', '2026-07-06 01:20:21', '2026-07-06 04:20:21', '', 'sql', '', 'inherit', 'open', 'closed', '', 'sql', '', '', '2026-07-06 01:20:21', '2026-07-06 04:20:21', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/sql.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('366', '0', '2026-07-06 01:20:25', '2026-07-06 04:20:25', '', 'testeRunning', '', 'inherit', 'open', 'closed', '', 'testerunning', '', '', '2026-07-06 01:20:25', '2026-07-06 04:20:25', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/testeRunning.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('367', '0', '2026-07-06 01:20:29', '2026-07-06 04:20:29', '', 'testecontrato', '', 'inherit', 'open', 'closed', '', 'testecontrato', '', '', '2026-07-06 01:20:29', '2026-07-06 04:20:29', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/testecontrato.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('368', '0', '2026-07-06 01:20:29', '2026-07-06 04:20:29', '', 'testes_containers', '', 'inherit', 'open', 'closed', '', 'testes_containers', '', '', '2026-07-06 01:20:29', '2026-07-06 04:20:29', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/testes_containers.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('369', '0', '2026-07-06 01:20:32', '2026-07-06 04:20:32', '', 'ux', '', 'inherit', 'open', 'closed', '', 'ux', '', '', '2026-07-06 01:20:32', '2026-07-06 04:20:32', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/ux.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('370', '0', '2026-07-06 01:20:35', '2026-07-06 04:20:35', '', 'vulnerabilit', '', 'inherit', 'open', 'closed', '', 'vulnerabilit', '', '', '2026-07-06 01:20:35', '2026-07-06 04:20:35', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/vulnerabilit.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('371', '0', '2026-07-06 01:32:06', '2026-07-06 04:32:06', '', 'continuous-testing', '', 'inherit', 'open', 'closed', '', 'continuous-testing', '', '', '2026-07-06 01:32:06', '2026-07-06 04:32:06', '', '218', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/continuous-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('372', '0', '2026-07-06 01:32:09', '2026-07-06 04:32:09', '', 'mock-testing', '', 'inherit', 'open', 'closed', '', 'mock-testing', '', '', '2026-07-06 01:32:09', '2026-07-06 04:32:09', '', '209', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/mock-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('373', '0', '2026-07-06 01:32:13', '2026-07-06 04:32:13', '', 'security-testing', '', 'inherit', 'open', 'closed', '', 'security-testing', '', '', '2026-07-06 01:32:13', '2026-07-06 04:32:13', '', '215', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/security-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('374', '0', '2026-07-06 01:32:16', '2026-07-06 04:32:16', '', 'docker-containers', '', 'inherit', 'open', 'closed', '', 'docker-containers', '', '', '2026-07-06 01:32:16', '2026-07-06 04:32:16', '', '214', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/docker-containers.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('375', '0', '2026-07-06 01:32:19', '2026-07-06 04:32:19', '', 'docker-qa', '', 'inherit', 'open', 'closed', '', 'docker-qa', '', '', '2026-07-06 01:32:19', '2026-07-06 04:32:19', '', '208', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/docker-qa.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('376', '0', '2026-07-06 01:32:21', '2026-07-06 04:32:21', '', 'qa-metrics', '', 'inherit', 'open', 'closed', '', 'qa-metrics', '', '', '2026-07-06 01:32:21', '2026-07-06 04:32:21', '', '217', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/qa-metrics.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('377', '0', '2026-07-06 01:32:24', '2026-07-06 04:32:24', '', 'contract-testing', '', 'inherit', 'open', 'closed', '', 'contract-testing', '', '', '2026-07-06 01:32:24', '2026-07-06 04:32:24', '', '213', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/contract-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('378', '0', '2026-07-06 01:32:28', '2026-07-06 04:32:28', '', 'accessibility-testing', '', 'inherit', 'open', 'closed', '', 'accessibility-testing', '', '', '2026-07-06 01:32:28', '2026-07-06 04:32:28', '', '210', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/accessibility-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('379', '0', '2026-07-06 01:32:31', '2026-07-06 04:32:31', '', 'cucumber-bdd', '', 'inherit', 'open', 'closed', '', 'cucumber-bdd', '', '', '2026-07-06 01:32:31', '2026-07-06 04:32:31', '', '212', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/cucumber-bdd.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('380', '0', '2026-07-06 01:32:35', '2026-07-06 04:32:35', '', 'database-testing', '', 'inherit', 'open', 'closed', '', 'database-testing', '', '', '2026-07-06 01:32:35', '2026-07-06 04:32:35', '', '196', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/database-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('381', '0', '2026-07-06 01:32:38', '2026-07-06 04:32:38', '', 'integration-testing', '', 'inherit', 'open', 'closed', '', 'integration-testing', '', '', '2026-07-06 01:32:38', '2026-07-06 04:32:38', '', '197', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/integration-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('382', '0', '2026-07-06 01:32:41', '2026-07-06 04:32:41', '', 'quality-monitoring', '', 'inherit', 'open', 'closed', '', 'quality-monitoring', '', '', '2026-07-06 01:32:41', '2026-07-06 04:32:41', '', '205', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/quality-monitoring.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('383', '0', '2026-07-06 01:32:45', '2026-07-06 04:32:45', '', 'mutation-testing', '', 'inherit', 'open', 'closed', '', 'mutation-testing', '', '', '2026-07-06 01:32:45', '2026-07-06 04:32:45', '', '198', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/mutation-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('384', '0', '2026-07-06 01:32:47', '2026-07-06 04:32:47', '', 'visual-testing', '', 'inherit', 'open', 'closed', '', 'visual-testing', '', '', '2026-07-06 01:32:47', '2026-07-06 04:32:47', '', '199', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/visual-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('385', '0', '2026-07-06 01:32:49', '2026-07-06 04:32:49', '', 'agile-methods', '', 'inherit', 'open', 'closed', '', 'agile-methods', '', '', '2026-07-06 01:32:49', '2026-07-06 04:32:49', '', '195', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/agile-methods.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('386', '0', '2026-07-06 01:32:52', '2026-07-06 04:32:52', '', 'regression-testing', '', 'inherit', 'open', 'closed', '', 'regression-testing', '', '', '2026-07-06 01:32:52', '2026-07-06 04:32:52', '', '194', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/regression-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('387', '0', '2026-07-06 01:32:56', '2026-07-06 04:32:56', '', 'usability-testing', '', 'inherit', 'open', 'closed', '', 'usability-testing', '', '', '2026-07-06 01:32:56', '2026-07-06 04:32:56', '', '193', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/usability-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('388', '0', '2026-07-06 01:32:59', '2026-07-06 04:32:59', '', 'gitops-quality', '', 'inherit', 'open', 'closed', '', 'gitops-quality', '', '', '2026-07-06 01:32:59', '2026-07-06 04:32:59', '', '206', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/gitops-quality.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('389', '0', '2026-07-06 01:33:03', '2026-07-06 04:33:03', '', 'kubernetes-testing', '', 'inherit', 'open', 'closed', '', 'kubernetes-testing', '', '', '2026-07-06 01:33:03', '2026-07-06 04:33:03', '', '204', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/kubernetes-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('390', '0', '2026-07-06 01:33:06', '2026-07-06 04:33:06', '', 'api-testing', '', 'inherit', 'open', 'closed', '', 'api-testing', '', '', '2026-07-06 01:33:06', '2026-07-06 04:33:06', '', '191', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/api-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('391', '0', '2026-07-06 01:33:08', '2026-07-06 04:33:08', '', 'exploratory-testing', '', 'inherit', 'open', 'closed', '', 'exploratory-testing', '', '', '2026-07-06 01:33:08', '2026-07-06 04:33:08', '', '192', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/exploratory-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('392', '0', '2026-07-06 01:33:11', '2026-07-06 04:33:11', '', 'tdd-development', '', 'inherit', 'open', 'closed', '', 'tdd-development', '', '', '2026-07-06 01:33:11', '2026-07-06 04:33:11', '', '189', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/tdd-development.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('393', '0', '2026-07-06 01:33:14', '2026-07-06 04:33:14', '', 'mobile-testing', '', 'inherit', 'open', 'closed', '', 'mobile-testing', '', '', '2026-07-06 01:33:14', '2026-07-06 04:33:14', '', '188', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/mobile-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('394', '0', '2026-07-06 01:33:17', '2026-07-06 04:33:17', '', 'future-qa', '', 'inherit', 'open', 'closed', '', 'future-qa', '', '', '2026-07-06 01:33:17', '2026-07-06 04:33:17', '', '182', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/future-qa.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('395', '0', '2026-07-06 01:33:19', '2026-07-06 04:33:19', '', 'agile-testing', '', 'inherit', 'open', 'closed', '', 'agile-testing', '', '', '2026-07-06 01:33:19', '2026-07-06 04:33:19', '', '184', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/agile-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('396', '0', '2026-07-06 01:33:21', '2026-07-06 04:33:21', '', 'performance-testing', '', 'inherit', 'open', 'closed', '', 'performance-testing', '', '', '2026-07-06 01:33:21', '2026-07-06 04:33:21', '', '185', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/performance-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('397', '0', '2026-07-06 01:33:25', '2026-07-06 04:33:25', '', 'security-vulnerability', '', 'inherit', 'open', 'closed', '', 'security-vulnerability', '', '', '2026-07-06 01:33:25', '2026-07-06 04:33:25', '', '186', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/security-vulnerability.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('398', '0', '2026-07-06 01:33:29', '2026-07-06 04:33:29', '', 'load-testing', '', 'inherit', 'open', 'closed', '', 'load-testing', '', '', '2026-07-06 01:33:29', '2026-07-06 04:33:29', '', '203', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/load-testing.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('400', '1', '2026-07-06 21:19:41', '2026-07-07 00:19:41', '', 'TestesIA', '', 'inherit', 'open', 'closed', '', 'testesia', '', '', '2026-07-06 21:19:41', '2026-07-07 00:19:41', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/TestesIA.png', '0', 'attachment', 'image/png', '0');
INSERT INTO `wp_posts` VALUES ('402', '0', '2026-07-06 22:25:24', '2026-07-07 01:25:24', '<p>Conteúdo do artigo em <strong>Markdown</strong>.</p>\n\n<h2>Seção</h2>\n\n<ul><li>Item 1</li><ol><li>Item 2</li></ol></ul>\n\n<h3>Subseção</h3>\n\n<figure><img src=\"img/exemplo.jpg\" alt=\"Descrição da imagem\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>&gt; Citação importante.</p>\n\n<pre><code>def hello():\n    print(\"Hello, QA World!\")\n</code></pre>\n\n<p>Tabela:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Coluna 1</th><th>Coluna 2</th></tr>\n<tr><td>Valor 1</td><td>Valor 2</td></tr>\n</table></figure>', 'Título do Artigo', '', 'inherit', 'closed', 'closed', '', '337-revision-v1', '', '', '2026-07-06 22:25:24', '2026-07-07 01:25:24', '', '337', 'http://localhost:8082/ideiasti/?p=402', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('404', '0', '2026-07-06 22:25:25', '2026-07-07 01:25:25', '<p><!-- wp:image {\"align\":\"center\",\"sizeSlug\":\"large\"} --><br><figure class=\"wp-block-image size-large aligncenter\"><img src=\"https://media.giphy.com/media/l0HlHJGHe3yAMjfFC/giphy.gif\" alt=\"Blog QA Brasil - Garantia de Qualidade de Software\" /></figure><br><!-- /wp:image --></p>\n\n<h2>Quem Somos</h2>\n\n<p>O <strong>Blog QA Brasil</strong> é uma plataforma educacional dedicada ao universo da Qualidade de Software e Testes de Software. Nascemos com o propósito de democratizar o conhecimento sobre QA, tornando acessível a profissionais, estudantes e empresas as melhores práticas e tendências do mercado.</p>\n\n<p>Nossa missão é <strong>transformar a forma como o Brasil pensa e pratica a qualidade de software</strong>, contribuindo para a formação de profissionais mais capacitados e organizações mais competitivas.</p>\n\n<hr>\n<h2>Nossa História</h2>\n\n<h3>O Início</h3>\n\n<p>O Blog QA Brasil surgiu da necessidade de centralizar conteúdo de qualidade sobre Quality Assurance em português. Enquanto existiam diversos recursos em inglês, a comunidade brasileira carecia de uma fonte confiável e atualizada.</p>\n\n<h3>Nossa Evolução</h3>\n\n<p><!-- wp:table {\"className\":\"is-style-stripes\"} --><br><figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Ano</th><th>Marco</th></tr></thead><tbody><tr><td><strong>2024</strong></td><td>Fundação do Blog QA Brasil</td></tr><tr><td><strong>2024</strong></td><td>Primeiros 10 artigos publicados</td></tr><tr><td><strong>2025</strong></td><td>Expansão para 40+ artigos especializados</td></tr><tr><td><strong>2025</strong></td><td>Newsletter e comunidade ativa</td></tr></tbody></table></figure><br><!-- /wp:table --></p>\n\n<h3>Nossa Visão</h3>\n\n<p>Ser a <strong>principal referência em Qualidade de Software em português</strong>, abrangendo desde conceitos fundamentais até técnicas avançadas e emergentes.</p>\n\n<hr>\n<h2>O Que Oferecemos</h2>\n\n<h3>Conteúdo Especializado</h3>\n\n<p>Produzimos conteúdo educacional em diversas áreas:</p>\n\n<p><!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|30\",\"left\":\"var:preset|spacing|30\",\"right\":\"var:preset|spacing|30\"}},\"border\":{\"radius\":\"5px\"}},\"backgroundColor\":\"secondary\",\"className\":\"has-background\"} --><br><div class=\"wp-block-group has-background\" style=\"border-radius:5px;padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:list --><br><ul><li><strong>Fundamentos de QA</strong> - Conceitos, metodologias e padrões</li><ol><li><strong>Automação de Testes</strong> - Frameworks, ferramentas e estratégias</li><br><li><strong>Testes Ágeis</strong> - Scrum, Kanban, XP e práticas DevOps</li><br><li><strong>Testes de Performance</strong> - Load, stress e endurance testing</li><br><li><strong>Testes de Segurança</strong> - OWASP, penetration testing</li><br><li><strong>Tendências</strong> - IA, GenAI, continuous testing</li><br></ol><!-- /wp:list --></div><br><!-- /wp:group --></p>\n\n<h3>Nossos Diferenciais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Diferencial</th><th>Descrição</th></tr>\n<tr><td><strong>Profundo</strong></td><td>Artigos técnicos detalhados e atualizados</td></tr>\n<tr><td><strong>Prático</strong></td><td>Exemplos reais e casos de uso</td></tr>\n<tr><td><strong>Atualizado</strong></td><td>Conteúdo alinhado com tendências 2025-2026</td></tr>\n<tr><td><strong>Gratuito</strong></td><td>Todo conteúdo acessível sem custo</td></tr>\n<tr><td><strong>Em Português</strong></td><td>Linguagem nativa para brasileiros</td></tr>\n</table></figure>\n\n<hr>\n<h2>Metodologia de Conteúdo</h2>\n\n<h3>Como Criamos Artigos</h3>\n\n<p>Nossa equipe segue um processo rigoroso:<br><ol><li><strong>Pesquisa</strong> - Fontes confiáveis e atualizadas</li><br><li><strong>Estruturação</strong> - Organização lógica e didática</li><br><li><strong>Revisão</strong> - Verificação técnica e editorial</li><br><li><strong>Publicação</strong> - Formatação otimizada para SEO</li><br><li><strong>Atualização</strong> - Manutenção contínua do conteúdo</li><br></ol><br><h3>Nossas Fontes</h3></p>\n\n<p>Baseamos nosso conteúdo em:</p>\n\n<p><!-- wp:list --><ol><li><strong>Padrões Internacionais</strong> - ISO/IEC 25010, IEEE</li><br><li><strong>Frameworks Reconhecidos</strong> - ISTQB, CMMI</li><br><li><strong>Pesquisas de Mercado</strong> - Gartner, Forrester, World Quality Report</li><br><li><strong>Comunidade Técnica</strong> - Especialistas e profissionais do mercado</li><br><li><strong>Experiência Prática</strong> - Casos reais e melhores práticas</li><br></ol><!-- /wp:list --></p>\n\n<hr>\n<h2>Para Quem É o Blog</h2>\n\n<h3>Profissionais de TI</h3>\n\n<p>Se você é <strong>desenvolvedor, QA engineer, test analyst ou manager</strong>, encontrará:<br><ol><li>Estratégias avançadas de teste</li><br><li>Comparativos de ferramentas</li><br><li>Boas práticas de mercado</li><br><li>Preparação para certificações</li><br></ol><br><h3>Estudantes</h3></p>\n\n<p>Se você está <strong>aprendendo sobre QA</strong>, encontrará:<br><ol><li>Conceitos fundamentais explicados</li><br><li>Tutoriais passo a passo</li><br><li>Glossários e referências</li><br><li>Caminho de aprendizagem</li><br></ol><br><h3>Empresas</h3></p>\n\n<p>Se você representa uma <strong>empresa ou startup</strong>, encontrará:<br><ol><li>Cases de sucesso</li><br><li>ROI de qualidade de software</li><br><li>Estratégias de implementação</li><br><li>Métricas e KPIs</li><br></ol><br><hr><br><h2>Nossa Equipe</h2></p>\n\n<h3>Filosofia</h3>\n\n<p>Acreditamos que a <strong>qualidade de software é responsabilidade de todos</strong>. Por isso, nosso conteúdo é desenvolvido com foco em:<br><ol><li><strong>Acessibilidade</strong> - Linguagem clara para todos os níveis</li><br><li><strong>Praticidade</strong> - Conteúdo aplicável no dia a dia</li><br><li><strong>Atualidade</strong> - Tendências e tecnologias emergentes</li><br><li><strong>Profundidade</strong> - Detalhamento técnico quando necessário</li><br></ol><br><h3>Colaboração</h3></p>\n\n<p>Valorizamos a <strong>comunidade brasileira de QA</strong>. Estamos abertos a:<br><ol><li>Sugestões de temas</li><br><li>Correções e feedback</li><br><li>Parcerias de conteúdo</li><br><li>Contribuições de especialistas</li><br></ol><br><hr><br><h2>Estatísticas do Blog</h2></p>\n\n<p><!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|40\",\"bottom\":\"var:preset|spacing|40\",\"left\":\"var:preset|spacing|40\",\"right\":\"var:preset|spacing|40\"}},\"border\":{\"radius\":\"10px\"}},\"backgroundColor\":\"primary\",\"textColor\":\"white\",\"className\":\"has-white-color has-primary-background-color has-text-color has-background\"} --><br><div class=\"wp-block-group alignwide has-white-color has-primary-background-color has-text-color has-background\" style=\"border-radius:10px;padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--40)\"><!-- wp:paragraph --><br><p><strong>Nossos Números:</strong></p><br><!-- /wp:paragraph --></p>\n\n<p><!-- wp:list --><ol><li><strong>40+ Artigos</strong> - Conteúdo completo e detalhado</li><br><li><strong>10+ Categorias</strong> - Temas diversos de QA</li><br><li><strong>100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} Gratuito</strong> - Acesso sem custos</li><br><li><strong>Atualizado</strong> - Conteúdo vigente 2025-2026</li><br></ol><!-- /wp:list --></div><br><!-- /wp:group --></p>\n\n<hr>\n<h2>Nossos Valores</h2>\n\n<h3>Transparência</h3>\n\n<p>Compartilhamos <strong>abertamente</strong> nossas fontes, metodologia e limitações do conteúdo.</p>\n\n<h3>Qualidade</h3>\n\n<p>Cada artigo passa por <strong>revisão cuidadosa</strong> antes da publicação.</p>\n\n<h3>Acessibilidade</h3>\n\n<p>Todo conteúdo é <strong>gratuito e acessível</strong> para a comunidade.</p>\n\n<h3>Atualização</h3>\n\n<p>Mantemos o conteúdo <strong>sempre atualizado</strong> com as tendências do mercado.</p>\n\n<h3>Comunidade</h3>\n\n<p>Priorizamos as <strong>necessidades da comunidade</strong> brasileira de QA.</p>\n\n<hr>\n<h2>Tópicos Principais</h2>\n\n<p>Explore nosso conteúdo completo:</p>\n\n<h3>Fundamentos</h3><ol><li><a href=\"/introducao-qualidade-software\">Introdução à Qualidade de Software</a></li>\n<li><a href=\"/tipos-testes-software\">Tipos de Testes de Software</a></li>\n<li><a href=\"/padroes-metodologias\">Padrões e Metodologias</a></li>\n</ol>\n<h3>Automação</h3><ol><li><a href=\"/automacao-testes\">Automação de Testes</a></li>\n<li><a href=\"/selenium-webdriver\">Selenium WebDriver</a></li>\n<li><a href=\"/playwright-cypress\">Playwright e Cypress</a></li>\n</ol>\n<h3>Estratégia</h3><ol><li><a href=\"/tdd\">Test-Driven Development (TDD)</a></li>\n<li><a href=\"/bdd\">Behavior-Driven Development (BDD)</a></li>\n<li><a href=\"/devops-qa\">DevOps e QA</a></li>\n</ol>\n<h3>Tendências</h3><ol><li><a href=\"/ia-em-qa\">IA em QA</a></li>\n<li><a href=\"/continuous-testing\">Continuous Testing</a></li>\n<li><a href=\"/kubernetes-qa\">Kubernetes para QA</a></li>\n</ol>\n<hr>\n<h2>Participe da Comunidade</h2>\n\n<h3>Newsletter</h3>\n\n<p>Receba os <strong>melhores artigos</strong> diretamente no seu e-mail:<br><ol><li>Atualizações semanais</li><br><li>Conteúdo exclusivo</li><br><li>Dicas práticas</li><br><li>Novidades do setor</li><br></ol><br><h3>Comentários</h3></p>\n\n<p>Participe das <strong>discussões</strong> em nossos artigos:<br><ol><li>Compartilhe sua experiência</li><br><li>Tire suas dúvidas</li><br><li>Contribute com conhecimento</li><br><li>Conecte-se com outros profissionais</li><br></ol><br><h3>Redes Sociais</h3></p>\n\n<p>Siga-nos nas redes:<br><ol><li><strong>LinkedIn</strong> - Conteúdo profissional</li><br><li><strong>Twitter/X</strong> - Atualizações rápidas</li><br><li><strong>YouTube</strong> - Vídeos educativos (em breve)</li></ol></ul></p>\n\n<hr>\n<h2>Entre em Contato</h2>\n\n<p>Estamos sempre abertos para ouvir você:</p>\n\n<p><!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|50\",\"bottom\":\"var:preset|spacing|50\",\"left\":\"var:preset|spacing|50\",\"right\":\"var:preset|spacing|50\"}},\"border\":{\"radius\":\"10px\"}},\"backgroundColor\":\"primary\",\"textColor\":\"white\",\"className\":\"has-white-color has-primary-background-color has-text-color has-background\"} --><br><div class=\"wp-block-group alignwide has-white-color has-primary-background-color has-text-color has-background\" style=\"border-radius:10px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)\"><!-- wp:paragraph --><br><p><strong>Blog QA Brasil</strong><br /><br><br /><br>📧 E-mail: contato@qabrasil.blog<br /><br>🌐 Website: www.qabrasil.blog<br /><br><br /><br>Estamos aqui para ajudar você em sua jornada de Qualidade de Software!</p><br><!-- /wp:paragraph --></div><br><!-- /wp:group --></p>\n\n<hr>\n<h2>Junte-se a Nós</h2>\n\n<p>A qualidade de software é uma <strong>jornada, não um destino</strong>. Comece hoje mesmo a explorar nosso conteúdo e faça parte da comunidade brasileira de Quality Assurance.</p>\n\n<p><strong>Obrigado por escolher o Blog QA Brasil como seu guia em Qualidade de Software!</strong></p>\n\n<hr>\n<em>Última atualização: Janeiro de 2025</em>', 'Sobre o Blog QA Brasil', '', 'inherit', 'closed', 'closed', '', '53-revision-v1', '', '', '2026-07-06 22:25:25', '2026-07-07 01:25:25', '', '53', 'http://localhost:8082/ideiasti/?p=404', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('405', '0', '2026-07-06 22:25:25', '2026-07-07 01:25:25', '<p><!-- wp:image {\"align\":\"center\",\"sizeSlug\":\"large\"} --><br><figure class=\"wp-block-image size-large aligncenter\"><img src=\"https://media.giphy.com/media/l3q2K5jinAlChoCLS/giphy.gif\" alt=\"Termos e Condições\" /></figure><br><!-- /wp:image --></p>\n\n<h2>Aceitação dos Termos</h2>\n\n<p>Bem-vindo ao <strong>Blog QA Brasil</strong>. Ao acessar, navegar ou utilizar qualquer conteúdo deste site, você concorda com estes Termos de Uso na íntegra. Se você não concorda com qualquer parte destes termos, solicitamos que não utilize nosso blog.</p>\n\n<p>Última atualização: Janeiro de 2025</p>\n\n<hr>\n<h2>1. Informações sobre o Site</h2>\n\n<h3>1.1 Quem Somos</h3>\n\n<p>O Blog QA Brasil é uma plataforma de conteúdo educacional dedicada a:</p>\n\n<p><!-- wp:list --><br><ul><li><strong>Qualidade de Software</strong> - Artigos e guias sobre QA</li><ol><li><strong>Testes de Software</strong> - Metodologias e boas práticas</li><br><li><strong>Automação</strong> - Frameworks e ferramentas</li><br><li><strong>DevOps</strong> - Integração e entrega contínua</li><br></ol><!-- /wp:list --></p>\n\n<h3>1.2 Dados do Proprietário</h3>\n<ol><li><strong>Nome:</strong> Blog QA Brasil</li>\n<li><strong>E-mail:</strong> contato@qabrasil.blog</li>\n<li><strong>Finalidade:</strong> Conteúdo educacional sobre Qualidade de Software</li>\n</ol>\n<hr>\n<h2>2. Objetivo do Site</h2>\n\n<h3>2.1 Conteúdo Oferecido</h3>\n\n<p>Nosso blog disponibiliza:</p>\n\n<p><!-- wp:table {\"className\":\"is-style-stripes\"} --><br><figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Tipo de Conteúdo</th><th>Descrição</th></tr></thead><tbody><tr><td><strong>Artigos Educacionais</strong></td><td>Tutoriais e guias sobre QA e testes</td></tr><tr><td><strong>Notícias</strong></td><td>Tendências e atualizações do setor</td></tr><tr><td><strong>Análises</strong></td><td>Reviews de ferramentas e frameworks</td></tr><tr><td><strong>Recursos</strong></td><td>Links, templates e materiais complementares</td></tr></tbody></table></figure><br><!-- /wp:table --></p>\n\n<h3>2.2 Natureza do Conteúdo</h3>\n\n<p>Todo conteúdo é de caráter <strong>estritamente educacional e informativo</strong>. As informações presentes não constituem aconselhamento profissional, consultoria técnica ou garantia de resultados.</p>\n\n<hr>\n<h2>3. Uso Permitido</h2>\n\n<h3>3.1 O Que Você Pode Fazer</h3>\n\n<p>Você está autorizado a:</p>\n\n<p><!-- wp:group {\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|30\",\"bottom\":\"var:preset|spacing|30\",\"left\":\"var:preset|spacing|30\",\"right\":\"var:preset|spacing|30\"}},\"border\":{\"radius\":\"5px\"}},\"backgroundColor\":\"secondary\",\"className\":\"has-background\"} --><br><div class=\"wp-block-group has-background\" style=\"border-radius:5px;padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\"><!-- wp:list --><ol><li><strong>Ler e acessar</strong> todo conteúdo público do site</li><br><li><strong>Compartilhar</strong> artigos em redes sociais com atribuição</li><br><li><strong>Citar trechos</strong> em trabalhos acadêmicos com referência</li><br><li><strong>Inscrever-se</strong> na newsletter voluntariamente</li><br><li><strong>Comentar</strong> em posts seguindo as diretrizes</li><br><li><strong>Baixar recursos</strong> disponibilizados gratuitamente</li><br></ol><!-- /wp:list --></div><br><!-- /wp:group --></p>\n\n<h3>3.2 Como Você Deve Compartilhar</h3>\n\n<p>Ao compartilhar nosso conteúdo, você deve:<br><ol><li><strong>Creditar</strong> o Blog QA Brasil como fonte</li><br><li><strong>Incluir link</strong> direto para o artigo original</li><br><li><strong>Não modificar</strong> o conteúdo publicado</li><br><li><strong>Não usar</strong> para fins comerciais sem autorização</li><br></ol><br><hr><br><h2>4. Uso Proibido</h2></p>\n\n<h3>4.1 Atividades Não Permitidas</h3>\n\n<p>É expressamente proibido:</p>\n\n<p><!-- wp:list --><ol><li><strong>Reprodução completa</strong> do conteúdo sem autorização</li><br><li><strong>Venda ou licenciamento</strong> do conteúdo como próprio</li><br><li><strong>Cópias massivas</strong> para criação de sites alternativos</li><br><li><strong>Remoção de credits</strong> ou informações de direitos autorais</li><br><li><strong>Uso indevido</strong> da marca \"Blog QA Brasil\"</li><br><li><strong>Ataques ao site</strong> - hacking, DDoS, malware</li><br><li><strong>Spam ou flood</strong> nos comentários</li><br><li><strong>Conteúdo ilegal</strong> ou que infrinja direitos de terceiros</li><br></ol><!-- /wp:list --></p>\n\n<h3>4.2 Consequências</h3>\n\n<p>Violações podem resultar em:<br><ol><li><strong>Remoção do conteúdo infrator</strong></li><br><li><strong>Bloqueio de acesso ao site</strong></li><br><li><strong>Notificações legais</strong></li><br><li><strong>Responsabilização civil e criminal</strong></li><br></ol><br><hr><br><h2>5. Propriedade Intelectual</h2></p>\n\n<h3>5.1 Direitos Autorais</h3>\n\n<p>Todo conteúdo publicado no Blog QA Brasil é protegido por direitos autorais:<br><ol><li><strong>Textos e artigos</strong> - © Blog QA Brasil</li><br><li><strong>Imagens e gráficos</strong> - Fontes diversas (Giphy, autores)</li><br><li><strong>Código e exemplos</strong> - Licença MIT quando aplicável</li><br><li><strong>Layout e design</strong> - © Blog QA Brasil</li><br></ol><br><h3>5.2 Uso de Imagens</h3></p>\n\n<p>Utilizamos imagens do <strong>Giphy</strong> sob seus termos de serviço para ilustrar nossos artigos. As imagens permanecem propriedade de seus respectivos criadores.</p>\n\n<h3>5.3 Licença para Uso Educativo</h3>\n\n<p>Concedemos permissão para:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo de Uso</th><th>Condição</th></tr>\n<tr><td><strong>Uso acadêmico</strong></td><td>Com citação adequada</td></tr>\n<tr><td><strong>Compartilhamento social</strong></td><td>Com link para fonte</td></tr>\n<tr><td><strong>Discussão em blogs</strong></td><td>Com referência e link</td></tr>\n<tr><td><strong>Treinamento corporativo</strong></td><td>Com autorização prévia</td></tr>\n</table></figure>\n\n<hr>\n<h2>6. Isenção de Responsabilidade</h2>\n\n<h3>6.1 Conteúdo Educacional</h3>\n\n<p><!-- wp:group --><br><div class=\"wp-block-group alignwide has-border-color\" style=\"border-radius:10px;padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--40)\"><!-- wp:paragraph --><br><p><strong>Aviso Importante:</strong> O conteúdo do Blog QA Brasil é fornecido apenas para fins educacionais e informativos. Não garantimos a precisão, completude ou atualidade das informações. As decisões tomadas com base em nosso conteúdo são de sua inteira responsabilidade.</p><br><!-- /wp:paragraph --></div><br><!-- /wp:group --></p>\n\n<h3>6.2 Isenções Específicas</h3>\n\n<p>Não nos responsabilizamos por:<br><ol><li><strong>Decisões técnicas</strong> tomadas com base no conteúdo</li><br><li><strong>Perdas financeiras</strong> decorrentes do uso das informações</li><br><li><strong>Danos a sistemas</strong> por implementação de código sugerido</li><br><li><strong>Conteúdo de terceiros</strong> em links externos</li><br><li><strong>Interrupções</strong> temporárias do site</li><br></ol><br><hr><br><h2>7. Links Externos</h2></p>\n\n<h3>7.1 Links de Terceiros</h3>\n\n<p>Nosso site pode conter links para sites externos. Esses links são fornecidos apenas para sua conveniência:<br><ol><li><strong>Não controlamos</strong> sites externos</li><br><li><strong>Não endosamos</strong> o conteúdo de sites terceiros</li><br><li><strong>Não somos responsáveis</strong> por práticas de privacidade de terceiros</li><br><li><strong>Você acessa por sua conta e risco</strong></li><br></ol><br><h3>7.2 Sites Recomendados</h3></p>\n\n<p>Quando recomendamos ferramentas ou serviços:<br><ol><li>Realizamos avaliação razoável</li><br><li>Não recebemos pagamento por recomendações</li><br><li>Podemos ter parceria comercial (devidamente disclosed)</li><br></ol><br><hr><br><h2>8. Comentários e Interações</h2></p>\n\n<h3>8.1 Diretrizes para Comentários</h3>\n\n<p>Aceitamos comentários que sejam:<br><ol><li><strong>Relevantes</strong> ao tema do artigo</li><br><li><strong>Respeitosos</strong> e profissionais</li><br><li><strong>Construtivos</strong> e educacionais</li><br><li><strong>Livres de spam</strong> e autopromoção</li><br></ol><br><h3>8.2 Moderação</h3></p>\n\n<p>Reservamo-nos o direito de:<br><ol><li><strong>Moderar</strong> comentários antes da publicação</li><br><li><strong>Remover</strong> comentários inadequados</li><br><li><strong>Bloquear</strong> usuários que violem diretrizes</li><br><li><strong>Editar</strong> comentários para clareza (mantendo sentido)</li><br></ol><br><h3>8.3 Conteúdo Gerado pelo Usuário</h3></p>\n\n<p>Ao postar comentários, você:<br><ol><li>Concede-nos licença para exibição</li><br><li>Garante que é o autor ou tem direitos</li><br><li>Isenta-nos de responsabilidade por conteúdo de terceiros</li><br></ol><br><hr><br><h2>9. Newsletter e Comunicações</h2></p>\n\n<h3>9.1 Inscrição</h3>\n\n<p>Ao se inscrever na newsletter:<br><ol><li>Você concorda em receber e-mails periódicos</li><br><li>Pode cancelar a inscrição a qualquer momento</li><br><li>Seus dados são protegidos conforme nossa Política de Privacidade</li><br></ol><br><h3>9.2 E-mails Marketing</h3></p>\n\n<p>Compromissos com comunicações:<br><ol><li><strong>Frequência razoável</strong> - Máximo 2-3 e-mails por semana</li><br><li><strong>Conteúdo relevante</strong> - Artigos, dicas e novidades</li><br><li><strong>Desinscrição fácil</strong> - Link em todos os e-mails</li><br><li><strong>Sem spam</strong> - Não vendemos ou compartilhamos dados</li><br></ol><br><hr><br><h2>10. Limitação de Responsabilidade</h2></p>\n\n<h3>10.1 Extensão Máxima Permitida por Lei</h3>\n\n<p>Na máxima extensão permitida pela legislação aplicável, o Blog QA Brasil e seus proprietários <strong>não serão responsáveis</strong> por quaisquer danos diretos, indiretos, incidentais, especiais, consequenciais ou punitivos decorrentes de:</p>\n\n<p><!-- wp:list --><ol><li>Uso ou incapacidade de usar o site</li><br><li>Conteúdo de terceiros</li><br><li>Ações de outros usuários</li><br><li>Erros ou omissões no conteúdo</li><br><li>Danos a equipamentos ou software</li><br></ol><!-- /wp:list --></p>\n\n<h3>10.2 Limitação Total</h3>\n\n<p>Nossa responsabilidade total não excederá o valor que você pagou (se houver) para acessar o site, ou R$ 100,00 (cem reais), o que for maior.</p>\n\n<hr>\n<h2>11. Indenização</h2>\n\n<p>Você concorda em indenizar, defender e isentar o Blog QA Brasil, seus proprietários e colaboradores de quaisquer reclamações, ações, danos, perdas, custos e despesas (incluindo honorários advocatícios) decorrentes de:<br><ol><li>Violação destes Termos de Uso</li><br><li>Uso indevido do site</li><br><li>Conteúdo que você postar</li><br><li>Violação de direitos de terceiros</li><br></ol><br><hr><br><h2>12. Modificações dos Termos</h2></p>\n\n<h3>12.1 Atualizações</h3>\n\n<p>Reservamo-nos o direito de modificar estes termos a qualquer momento:<br><ol><li><strong>Publicaremos</strong> a versão atualizada nesta página</li><br><li><strong>Atualizaremos</strong> a data de \"Última atualização\"</li><br><li><strong>Notificaremos</strong> sobre mudanças significativas (quando possível)</li><br></ol><br><h3>12.2 Aceitação Contínua</h3></p>\n\n<p>A continuação do uso após modificações constitui aceitação dos novos termos.</p>\n\n<hr>\n<h2>13. Rescisão</h2>\n\n<h3>13.1 Término pela Empresa</h3>\n\n<p>Podemos encerrar ou suspender seu acesso imediatamente, sem aviso prévio, por qualquer motivo, incluindo violação destes termos.</p>\n\n<h3>13.2 Efeitos da Rescisão</h3>\n\n<p>Após rescisão:<br><ol><li>Seu direito de usar o site cessa imediatamente</li><br><li>Comentários e conteúdo podem ser removidos</li><br><li>Disposições que devam sobreviver continuam vigentes</li><br></ol><br><hr><br><h2>14. Lei Aplicável</h2></p>\n\n<h3>14.1 Jurisdição</h3>\n\n<p>Estes termos são regidos pelas leis brasileiras:<br><ol><li><strong>Lei nº 9.610/1998</strong> - Direitos Autorais</li><br><li><strong>Lei nº 12.965/2014</strong> - Marco Civil da Internet</li><br><li><strong>Lei nº 13.709/2018</strong> - LGPD</li><br><li><strong>Código de Defesa do Consumidor</strong> - Quando aplicável</li></ol></ul></p>\n\n<h3>14.2 Foro</h3>\n\n<p>Qualquer litígio será resolvido no foro da comarca de <strong>São Paulo, SP</strong>, salvo disposição em contrário.</p>\n\n<hr>\n<h2>15. Disposições Gerais</h2>\n\n<h3>15.1 Integridade do Acordo</h3>\n\n<p>Estes termos constituem o acordo completo entre você e o Blog QA Brasil.</p>\n\n<h3>15.2 Severabilidade</h3>\n\n<p>Se qualquer disposição for considerada inválida, as demais disposições permanecem em pleno vigor.</p>\n\n<h3>15.3 Renúncia</h3>\n\n<p>A não exercício de qualquer direito não constitui renúncia a esse direito.</p>\n\n<h3>15.4 Cessão</h3>\n\n<p>Você não pode ceder seus direitos sob estes termos.</p>\n\n<hr>\n<h2>16. Contato</h2>\n\n<p>Para questões sobre estes Termos de Uso:</p>\n\n<p><!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|50\",\"bottom\":\"var:preset|spacing|50\",\"left\":\"var:preset|spacing|50\",\"right\":\"var:preset|spacing|50\"}},\"border\":{\"radius\":\"10px\"}},\"backgroundColor\":\"primary\",\"textColor\":\"white\",\"className\":\"has-white-color has-primary-background-color has-text-color has-background\"} --><br><div class=\"wp-block-group alignwide has-white-color has-primary-background-color has-text-color has-background\" style=\"border-radius:10px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)\"><!-- wp:paragraph --><br><p><strong>Blog QA Brasil - Termos de Uso</strong><br /><br>E-mail: contato@qabrasil.blog<br /><br>Última atualização: Janeiro de 2025</p><br><!-- /wp:paragraph --></div><br><!-- /wp:group --></p>\n\n<hr>\n<em>A utilização deste site implica na aceitação integral destes Termos de Uso. Se você não concorda com qualquer parte destes termos, por favor, não utilize nosso blog.</em>', 'Termos de Uso', '', 'inherit', 'closed', 'closed', '', '338-revision-v1', '', '', '2026-07-06 22:25:25', '2026-07-07 01:25:25', '', '338', 'http://localhost:8082/ideiasti/?p=405', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('406', '0', '2026-07-06 22:25:30', '2026-07-07 01:25:30', '<p><strong>Meta Description:</strong> Descubra as principais tendências de QA para 2025: IA em testes, automação avançada, Shift-Left, testes em nuvem e mais. Guia atualizado para profissionais de qualidade de software.</p>\n\n<hr>\n<h2>Visão Geral: A Transformação Digital da Qualidade de Software</h2>\n\n<p>O desenvolvimento de software está mudando em níveis sem precedentes, e a Garantia de Qualidade está avançando no mesmo ritmo. Em 2025 e 2026, os testes de software assumirão uma forma inteiramente diferente com tecnologias emergentes, evolução de metodologias e necessidades crescentes de eficiência.</p>\n\n<figure><img src=\"https://media.giphy.com/media/g9582wUmvNrrK/giphy.gif\" alt=\"Inteligência Artificial em QA - Automação Inteligente\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O cenário tecnológico atual exige que profissionais e organizações se mantenham atualizados com as tendências mais impactantes. segundo o World Quality Report 2025, quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão buscando ativamente GenAI</strong> em práticas de Quality Engineering, embora apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} tenham alcançado implementação em escala empresarial.</p>\n\n<hr>\n<h2>As 10 Principais Tendências de QA para 2025 e 2026</h2>\n\n<h3>1. Testes de API para Microsserviços</h3>\n\n<p>Os testes de API tornaram-se cruciais com a adoção massiva de arquiteturas de microsserviços. Esta tendência permite validação rápida e eficiente de funcionalidades distribuídas.</p>\n\n<h4>Por Que os Testes de API São Essenciais?</h4>\n\n<ul><li><strong>Comunicação entre serviços:</strong> Microsserviços se comunicam principalmente via APIs REST e GraphQL</li><ol><li><strong>Isolamento de falhas:</strong> Facilita a identificação de problemas específicos</li>\n<li><strong>Velocidade de execução:</strong> Testes de API são significativamente mais rápidos que testes de interface</li>\n<li><strong>Integração contínua:</strong> Essenciais para pipelines de CI/CD</li>\n</ol>\n<h4>Ferramentas Populares para Testes de API</h4>\n<ol><li><strong>Postman</strong> - Interface intuitiva para criação e execução de testes</li>\n<li><strong>Insomnia</strong> - Alternativa moderna com suporte a GraphQL</li>\n<li><strong>JMeter</strong> - Poderoso para testes de carga em APIs</li>\n<li><strong>SoapUI</strong> - Especializado em APIs SOAP e REST</li>\n<li><strong>Katalon</strong> - Plataforma integrada para API e UI</li>\n</ol>\n<hr>\n<h3>2. Testes em Nuvem: Escalabilidade Sem Limites</h3>\n\n<figure><img src=\"https://media.giphy.com/media/ICOg3nKHUwO0I/giphy.gif\" alt=\"Cloud Testing - Testes Escaláveis na Nuvem\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>A testing baseada em nuvem oferece escalabilidade e flexibilidade sem precedentes. Organizações podem executar testes em múltiplos ambientes simultaneamente, reduzindo significativamente o tempo de ciclo.</p>\n\n<h4>Benefícios dos Testes em Nuvem</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Benefício</th><th>Descrição</th><th>Impacto</th></tr>\n<tr><td><strong>Escalabilidade</strong></td><td>Recursos sob demanda</td><td>Redução de custos de infraestrutura</td></tr>\n<tr><td><strong>Disponibilidade</strong></td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} uptime</td><td>Testes 24/7</td></tr>\n<tr><td><strong>Cobertura</strong></td><td>Múltiplos dispositivos</td><td>Melhor qualidade de teste</td></tr>\n<tr><td><strong>Velocidade</strong></td><td>Paralelização massiva</td><td>Time-to-market reduzido</td></tr>\n</table></figure>\n\n<h4>Provedores Líderes</h4>\n<ol><li><strong>AWS Device Farm</strong> - Amplocobertura de dispositivos</li>\n<li><strong>BrowserStack</strong> - Testes cross-browser e mobile</li>\n<li><strong>Sauce Labs</strong> - Plataforma completa de testes</li>\n<li><strong>CrossBrowserTesting</strong> - Testes visuais e funcionais</li>\n</ol>\n<hr>\n<h3>3. Ferramentas Low-Code e No-Code para Testes</h3>\n\n<p>A aumento de ferramentas de teste low-code e no-code está democratizando o acesso à automação de testes, permitindo que equipes com menos conhecimento técnico participem ativamente da QA.</p>\n\n<h4>Principais Ferramentas No-Code</h4>\n<ol><li><strong>Katalon Studio</strong> - Plataforma completa com录制 de testes</li>\n<li><strong>TestComplete</strong> - Automação de testes sem código</li>\n<li><strong>Cypress Component Testing</strong> - Para desenvolvedores</li>\n<li><strong>Playwright</strong> - API simples e intuitiva</li>\n<li><strong>Ranorex</strong> - Testes desktop, web e mobile</li>\n</ol>\n<h4>Vantagens das Abordagens Low-Code</h4>\n\n<p>✅ Redução da curva de aprendizado  <br>✅ Democratização da automação  <br>✅ Agilidade na criação de testes  <br>✅ Menor dependência de programadores  <br>✅ Time-to-market acelerado</p>\n\n<hr>\n<h3>4. Testes para IoT e Wearables</h3>\n\n<p>Com a proliferação de dispositivos IoT e wearables, surge a necessidade de estratégias de teste específicas para estes ambientes, considerando restrições de hardware e conectividade.</p>\n\n<h4>Desafios Únicos dos Testes IoT</h4>\n<ol><li><strong>Heterogeneidade:</strong> Milhares de dispositivos diferentes</li>\n<li><strong>Conectividade:</strong> Wi-Fi, Bluetooth, Zigbee, LoRa</li>\n<li><strong>Segurança:</strong> Superfície de ataque expandida</li>\n<li><strong>Consumo de energia:</strong> Bateria limitada</li>\n<li><strong>Latência:</strong> Tempo real vs. não-tempo real</li>\n</ol>\n<h4>Estratégias de Teste IoT</h4>\n<ol><li><strong>Testes de Integração:</strong> Verificar comunicação entre dispositivos</li>\n<li><strong>Testes de Segurança:</strong> Pentest em dispositivos conectados</li>\n<li><strong>Testes de Performance:</strong> Latência e throughput</li>\n<li><strong>Testes de Compatibilidade:</strong> Interoperabilidade entre fabricantes</li>\n<li><strong>Testes de Confiabilidade:</strong> Resiliência a falhas de rede</li>\n</ol>\n<hr>\n<h3>5. Foco em Testes de Experiência do Usuário (UX)</h3>\n\n<p>A experiência do usuário tornou-se diferenciador competitivo. Testes de usabilidade e UX são agora prioridade nas estratégias de QA, incluindo testes A/B, análise heurística e testes com usuários reais.</p>\n\n<h4>Componentes do Teste de UX</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo de Teste</th><th>Foco</th><th>Metodologia</th></tr>\n<tr><td><strong>Teste de Usabilidade</strong></td><td>Facilidade de uso</td><td>Sessões com usuários</td></tr>\n<tr><td><strong>Teste A/B</strong></td><td>Conversão</td><td>Variações simultâneas</td></tr>\n<tr><td><strong>Análise Heurística</strong></td><td>Conformidade</td><td>Especialistas avaliam</td></tr>\n<tr><td><strong>Teste de Acessibilidade</strong></td><td>Inclusão</td><td>WCAG 2.1</td></tr>\n<tr><td><strong>Heatmaps</strong></td><td>Comportamento</td><td>Registros visuais</td></tr>\n</table></figure>\n\n<h4>Ferramentas para Testes de UX</h4>\n<ol><li><strong>Hotjar</strong> - Heatmaps e gravação de sessões</li>\n<li><strong>UserTesting</strong> - Painel de participantes</li>\n<li><strong>Optimizely</strong> - Testes A/B enterprise</li>\n<li><strong>Crazy Egg</strong> - Análise visual de cliques</li>\n</ol>\n<hr>\n<h3>6. Segurança como Imperativo de Negócios</h3>\n\n<p>A importância crescente de security testing faz parte das prioridades estratégicas das organizações. O teste de penetração e análise de vulnerabilidades são essenciais.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n<ol><li><strong>Penetration Testing (Pentest)</strong></li>\n</ol>   - Simulação de ataques reais\n   - Identificação de vulnerabilidades\n   - Teste de controles de segurança\n<ol><li><strong>Varredura de Vulnerabilidade</strong></li>\n</ol>   - Scanning automatizado\n   - Identificação de CVEs conhecidos\n   - Análise de configurações\n<ol><li><strong>Teste de Firewall e WAF</strong></li>\n</ol>   - Verificação de regras\n   - Teste de bypass\n   - Validação de logs\n<ol><li><strong>Análise de Código Estático (SAST)</strong></li>\n</ol>   - Detecção precoce de vulnerabilidades\n   - Integração no IDE\n   - Zero falsos positivos (com Tuning)\n<ol><li><strong>Análise de Componentes (SCA)</strong></li>\n</ol>   - Identificação de bibliotecas vulneráveis\n   - Licenciamento de software\n   - Atualizações de segurança\n\n<h4>Ferramentas de Segurança Essenciais</h4>\n<ol><li><strong>OWASP ZAP</strong> -Scanner de vulnerabilidades gratuito</li>\n<li><strong>Burp Suite</strong> - Plataforma completa de pentest</li>\n<li><strong>SonarQube</strong> - Análise de código</li>\n<li><strong>Snyk</strong> - SCA para desenvolvedores</li>\n<li><strong>Nessus</strong> -Scanner empresarial</li>\n</ol>\n<hr>\n<h3>7. Shift-Left Testing: Detectando Defeitos Mais Cedo</h3>\n\n<p>O modelo shift-left visa mover os testes para fases mais iniciais do ciclo de desenvolvimento, detectando defeitos mais cedo e reduzindo drasticamente custos de correção.</p>\n\n<h4>Benefícios do Shift-Left</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Fase Tradicional</th><th>Fase com Shift-Left</th><th>Economia</th></tr>\n<tr><td>$100 - $1.000</td><td>-</td><td>Custo por defeito</td></tr>\n<tr><td>$1.000 - $10.000</td><td>-</td><td>Teste</td></tr>\n<tr><td>$10.000 - $100.000</td><td>-</td><td>Produção</td></tr>\n</table></figure>\n\n<h4>Implementando Shift-Left</h4>\n<ol><li><strong>Testes Unitários</strong> - Desenvolvedores escrevem testes primeiro</li>\n<li><strong>Análise Estática</strong> - Verificação durante a codificação</li>\n<li><strong>Revisões de Código</strong> - Pair programming e code review</li>\n<li><strong>BDD (Behavior-Driven Development)</strong> - Testes definidos por requisitos</li>\n<li><strong>Testes de Contrato</strong> - Validação de APIs antes da implementação</li>\n</ol>\n<h4>Ferramentas para Shift-Left</h4>\n<ol><li><strong>Jest</strong> - Testes unitários JavaScript</li>\n<li><strong>JUnit 5</strong> - Framework de testes Java</li>\n<li><strong>pytest</strong> - Testes Python</li>\n<li><strong>ESLint</strong> - Linting e análise estática</li>\n<li><strong>Prettier</strong> - Formatação de código</li>\n</ol>\n<hr>\n<h3>8. Hiperautomação: O Futuro da Automação</h3>\n\n<figure><img src=\"https://media.giphy.com/media/LmNwrBhejkK9E12Mms/giphy.gif\" alt=\"Automação Avançada - Robôs e IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>A hiperautomação combina múltiplas tecnologias (IA, RPA, machine learning) para otimizar processos de teste e garantir maior cobertura.</p>\n\n<h4>Componentes da Hiperautomação em QA</h4>\n<ol><li><strong>RPA (Robotic Process Automation)</strong></li>\n</ol>   - Automação de tarefas repetitivas\n   - Geração de dados de teste\n   - Execução de suites de teste\n<ol><li><strong>Inteligência Artificial</strong></li>\n</ol>   - Geração automática de casos de teste\n   - Detecção de anomalias\n   - Manutenção inteligente de testes\n<ol><li><strong>Machine Learning</strong></li>\n</ol>   - Predição de áreas de risco\n   - Otimização de cobertura\n   - Identificação de testes flaky\n<ol><li><strong>Analytics Avançado</strong></li>\n</ol>   - Dashboard em tempo real\n   - Análise preditiva\n   - Relatórios inteligentes\n\n<h4>ROI da Hiperautomação</h4>\n\n<p>Organizações que implementam hiperautomação reportam:<br><ol><li><strong>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</strong> de redução em tempo de teste</li><br><li><strong>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</strong> de redução em custos de QA</li><br><li><strong>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</strong> de melhoria na cobertura de teste</li><br><li><strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</strong> de redução em testes flaky</li><br></ol><br><hr><br><h3>9. IA e Machine Learning em QA: A Revolução Silenciosa</h3></p>\n\n<p>Quase 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão buscando ativamente GenAI em práticas de quality engineering. A IA está transformando fundamentalmente como testes são criados, executados e mantidos.</p>\n\n<h4>Aplicações de IA em Testes</h4>\n\n<p>##### 9.1 Geração Automatizada de Testes<br><ol><li>Análise de requisitos para gerar casos de teste</li><br><li>Extração de testes a partir de histórias de usuários</li><br><li>Geração de dados de teste sintéticos</li><br></ol><br>##### 9.2 Detecção de Anomalias<br><ol><li>Identificação de padrões incomuns</li><br><li>Alertas proativos sobre regressões</li><br><li>Predição de falhas em produção</li><br></ol><br>##### 9.3 Manutenção Inteligente de Testes<br><ol><li>Detecção automática de testes obsoletos</li><br><li>Identificação de testes flaky</li><br><li>Recomendações de otimização</li><br></ol><br>##### 9.4 Oráculo de Teste Baseado em IA<br><ol><li>Comparação de screenshots com IA visual</li><br><li>Validação de dados com modelos treinados</li><br><li>Detecção de regressões visuais</li></ol></ul></p>\n\n<h4>Ferramentas de IA para QA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Testim</strong></td><td>Testes automatizados com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma de testes inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais com IA</td><td>Applitools</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>Mabl</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de testes unitários</td><td>Diffblue</td></tr>\n</table></figure>\n\n<hr>\n<h3>10. DevOps e CI/CD: Qualidade Integrada</h3>\n\n<p>A integração de QA no pipeline de DevOps é essencial para entrega contínua de software de qualidade.</p>\n\n<h4>Pipeline de CI/CD com QA Integrado</h4>\n\n<pre><code>Código → Build → Testes Unitários → Testes de Integração → Testes E2E → Deploy\n         ↓            ↓                   ↓                    ↓           ↓\n     SonarQube    JaCoCo           Postman/Newman        Cypress/Playwright  ArgoCD\n</code></pre>\n\n<h4>Melhores Práticas</h4>\n<ol><li><strong>Testes em Cada Estágio:</strong> Unitários, integração, contrato, E2E</li>\n<li><strong>Quality Gates:</strong> Critérios de qualidade para avançar</li>\n<li><strong>Feedback Rápido:</strong> Notificações instantâneas sobre falhas</li>\n<li><strong>Feature Flags:</strong> Testes em produção com controle</li>\n<li><strong>Canary Deployments:</strong> Liberação gradual com monitoramento</li>\n</ol>\n<hr>\n<h2>Como Preparar Sua Equipe para 2025</h2>\n\n<h3>Competências Essenciais para Profissionais de QA</h3>\n<ol><li><strong>Técnicas</strong></li>\n</ol>   - Programação (Python, JavaScript, Java)\n   - Automação de testes\n   - Cloud computing\n   - Containers (Docker, Kubernetes)\n<ol><li><strong>Metodológicas</strong></li>\n</ol>   - Agile/DevOps\n   - BDD/ATDD\n   - Exploratory Testing\n   - Testes de performance\n<ol><li><strong>Interpessoais</strong></li>\n</ol>   - Comunicação eficaz\n   - Resolução de problemas\n   - Pensamento crítico\n   - Adaptabilidade\n\n<h3>Roadmap de Capacitação</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Trimestre</th><th>Foco</th><th>Ação</th></tr>\n<tr><td>Q1</td><td>Fundamentos</td><td>Certificação ISTQB Foundation</td></tr>\n<tr><td>Q2</td><td>Automação</td><td>Aprender Playwright ou Cypress</td></tr>\n<tr><td>Q3</td><td>Cloud &amp; DevOps</td><td>AWS/Azure DevOps certification</td></tr>\n<tr><td>Q4</td><td>IA em QA</td><td>Hands-on com ferramentas de IA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>As tendências de QA para 2025 e 2026 estão redefinindo como as organizações abordam a qualidade de software. A convergência de IA, automação avançada, Shift-Left e DevOps cria oportunidades sem precedentes para equipes que sabem aproveitar essas tecnologias.</p>\n\n<p><strong>Principais Aprendizados:</strong></p>\n\n<p>✅ IA e GenAI estão transformando a QA, mas a implementação em escala ainda é um desafio  <br>✅ Automação é essencial, mas testes manuais e exploratórios permanecem importantes  <br>✅ Segurança deve ser tratada como prioridade estratégica  <br>✅ Shift-Left reduz custos e melhora a qualidade  <br>✅ Cloud testing oferece escalabilidade e flexibilidade</p>\n\n<p><strong>Chamada para Ação:</strong> Comece hoje mesmo a avaliar qual dessas tendências se aplica ao seu contexto e implemente incrementalmente. A qualidade de software não é um destino, mas uma jornada contínua de melhoria.</p>\n\n<hr>\n<h3>FAQ - Perguntas Frequentes sobre Tendências de QA</h3>\n\n<p><strong>P: Qual é a tendência mais impactante para QA em 2025?</strong>  <br>R: A IA e GenAI em QA são as mais impactantes, permitindo automação inteligente, geração automática de testes e manutenção preditiva.</p>\n\n<p><strong>P: Testes manuais ainda são necessários?</strong>  <br>R: Sim! Embora a automação cresça, testes manuais são essenciais para usabilidade, UX, cenários complexos e exploratory testing.</p>\n\n<p><strong>P: Quanto devo investir em ferramentas de teste em nuvem?</strong>  <br>R: O investimento varia conforme a escala. Plataformas como BrowserStack oferecem planos a partir de $29/mês para equipes pequenas.</p>\n\n<p><strong>P: Como começar com IA em QA?</strong>  <br>R: Comece com ferramentas maduras como Applitools para testes visuais ou Mabl para automação inteligente. Avalie ROI antes de escalar.</p>\n\n<p><strong>P: Qual é o futuro dos testadores manuais?</strong>  <br>R: Profissionais de QA estão evoluindo para engenheiros de qualidade, combinando habilidades manuais com técnicas de automação e análise de dados.</p>\n\n<hr>\n<em>Fonte: PixelQA, Kualitee, a1qa - Tendências QA 2025, World Quality Report 2025, Gartner Research</em>', 'Tendências de QA para 2025: O Futuro dos Testes de Software e Garantia de Qualidade', '', 'inherit', 'closed', 'closed', '', '178-revision-v1', '', '', '2026-07-06 22:25:30', '2026-07-07 01:25:30', '', '178', 'http://localhost:8082/ideiasti/?p=406', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('407', '0', '2026-07-06 22:25:31', '2026-07-07 01:25:31', '', 'giphy', '', 'inherit', 'open', 'closed', '', 'giphy', '', '', '2026-07-06 22:25:31', '2026-07-07 01:25:31', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('408', '0', '2026-07-06 22:25:35', '2026-07-07 01:25:35', '<p><strong>Meta Description:</strong> Conheça todos os tipos de testes de software: funcionais, não-funcionais, unitários, integração, sistema e mais. Guia completo com definições, objetivos e melhores práticas.</p>\n\n<hr>\n<h2>Introdução aos Tipos de Testes de Software</h2>\n\n<p>Os testes de software são uma atividade crítica no ciclo de desenvolvimento de sistemas. Compreender os diferentes tipos de testes e quando aplicá-los é fundamental para garantir a qualidade e confiabilidade das aplicações.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy.gif\" alt=\"Pirâmide de Testes - Hierarquia de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este guia completo apresenta uma categorização detalhada dos principais tipos de testes de software, suas finalidades, características e quando cada um deve ser utilizado no seu projeto.</p>\n\n<hr>\n<h2>Categorização Geral dos Testes</h2>\n\n<p>Os testes de software podem ser divididos em duas categorias principais:</p>\n\n<h3>1. Testes Funcionais</h3>\n\n<p>Verificam se o software funciona conforme especificado, testando funcionalidades específicas e requisitos do negócio.</p>\n\n<h3>2. Testes Não-Funcionais</h3>\n\n<p>Avaliam características como performance, segurança, usabilidade e confiabilidade, que não estão relacionadas a funcionalidades específicas.</p>\n\n<hr>\n<h2>Testes Funcionais: Garantindo o Comportamento Correto</h2>\n\n<h3>Teste Unitário: A Base de Tudo</h3>\n\n<p>O teste unitário é o tipo mais básico de teste, onde cada unidade de código (geralmente uma função ou método) é testada isoladamente. Esta atividade é realizada durante as etapas de desenvolvimento pelos próprios desenvolvedores.</p>\n\n<h4>Objetivos dos Testes Unitários</h4>\n\n<ul><li><strong>Identificar falhas em componentes individuais</strong> - Detectar problemas cedo</li><ol><li><strong>Garantir que cada função trabalha corretamente</strong> - Validação granular</li>\n<li><strong>Facilitar a detecção precoce de defeitos</strong> - Redução de custos</li>\n<li><strong>Documentar o código</strong> - Testes como especificação executável</li>\n<li><strong>Permitir refactoring seguro</strong> - Confiança ao modificar código</li>\n</ol>\n<h4>Exemplo Prático em Python (pytest)</h4>\n\n<pre><code>def calcular_desconto(valor_original, percentual):\n    \"\"\"Calcula o valor do desconto.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual deve estar entre 0 e 100\")\n    desconto = valor_original * (percentual / 100)\n    return valor_original - desconto\n\n<p>def test_calcular_desconto_10_porcento():<br>    assert calcular_desconto(100, 10) == 90</p>\n\n<p>def test_calcular_desconto_50_porcento():<br>    assert calcular_desconto(200, 50) == 100</p>\n\n<p>def test_calcular_desconto_invalido():<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 150)<br></code></pre></p>\n\n<h4>Frameworks Populares para Testes Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Framework</th><th>Características</th></tr>\n<tr><td>Java</td><td>JUnit 5, TestNG</td><td>Mais popular, extensível</td></tr>\n<tr><td>JavaScript</td><td>Jest, Mocha</td><td>Rápido, Mocking fácil</td></tr>\n<tr><td>Python</td><td>pytest, unittest</td><td>Sintaxe simples, fixtures</td></tr>\n<tr><td>C#</td><td>xUnit, NUnit</td><td>.NET ecosystem</td></tr>\n<tr><td>Go</td><td>testing (stdlib)</td><td>Simples, integrado</td></tr>\n</table></figure>\n\n<h4>Melhores Práticas para Testes Unitários</h4>\n\n<p>✅ <strong>Teste apenas uma coisa de cada vez</strong> - Um assert por teste é ideal  <br>✅ <strong>Nomes descritivos</strong> - <code>test_deve_retornar_erro_quando_usuario_invalido</code>  <br>✅ <strong>Independência</strong> - Testes não devem depender uns dos outros  <br>✅ <strong>Rapidez</strong> - Unit tests devem executar em milissegundos  <br>✅ <strong>Isolamento</strong> - Use mocks para dependências externas</p>\n\n<hr>\n<h3>Teste de Integração: Verificando Conexões</h3>\n\n<p>O teste de integração verifica a comunicação entre diferentes módulos ou componentes do sistema. Este tipo de teste é crucial para garantir que as partes do sistema funcionam corretamente quando combinadas.</p>\n\n<h4>Características Principais</h4>\n<ol><li><strong>Valida interfaces e interações entre componentes</strong> - Fluxo de dados correto</li>\n<li><strong>Identifica problemas de comunicação</strong> - API mismatches, protocolos</li>\n<li><strong>Pode ser realizado de forma incremental ou big-bang</strong> - Duas abordagens</li>\n<li><strong>Testa camadas de persistência</strong> - Bancos de dados, APIs externas</li>\n</ol>\n<h4>Estratégias de Integração</h4>\n\n<p>##### 1. Big-Bang Integration</p>\n\n<p>Todos os componentes são integrados simultaneamente e testados juntos.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Simples de implementar</li><br><li>Bom para sistemas pequenos</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Difícil localização de erros</li><br><li>Todos os módulos devem estar prontos</li><br></ol><br>##### 2. Incremental Integration (Bottom-Up)</p>\n\n<p>Começa pelos módulos mais baixos e集成 progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Defeitos fáceis de isolar</li><br><li>Feedback contínuo</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode ter módulos de alto nível sem testes até o final</li><br></ol><br>##### 3. Incremental Integration (Top-Down)</p>\n\n<p>Começa pelos módulos de mais alto nível e desce progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Interface do usuário testada primeiro</li><br><li>Protótipo funcional rápido</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Módulos de baixo nível simulados (stubs)</li><br></ol><br><h4>Exemplo de Teste de Integração (REST API)</h4></p>\n\n<pre><code>import requests\nimport pytest\n\n<p>class TestUserAPI:<br>    BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>def test_criar_usuario(self):<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"senha123\"<br>        }<br>        response = requests.post(f\"{self.BASE_URL}/usuarios\", json=payload)</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data</p>\n\n<p>def test_listar_usuarios(self):<br>        response = requests.get(f\"{self.BASE_URL}/usuarios\")</p>\n\n<p>assert response.status_code == 200<br>        assert isinstance(response.json(), list)<br></code></pre></p>\n\n<hr>\n<h3>Teste de Sistema: Visão Holística</h3>\n\n<p>O teste de sistema avalia o software como um todo, verificando se todos os componentes funcionam juntos para atender aos requisitos definidos.</p>\n\n<h4>O Que é Testado no Nível de Sistema?</h4>\n<ol><li><strong>Integração entre todos os módulos</strong></li>\n<li><strong>Fluxos de negócio completos</strong></li>\n<li><strong>Conformidade com requisitos funcionais</strong></li>\n<li><strong>Interface com sistemas externos</strong></li>\n<li><strong>Performance do sistema integrado</strong></li>\n<li><strong>Segurança end-to-end</strong></li>\n</ol>\n<h4>Exemplo: Fluxo de E-commerce</h4>\n\n<pre><code>Usuário → Login → Navegação → Carrinho → Checkout → Pagamento → Confirmação\n    ↓         ↓          ↓           ↓           ↓            ↓            ↓\n Cadastro   Session   Produtos    Estoque     Frete        Stripe     E-mail\n   ↕          ↕         ↕          ↕          ↕            ↕          ↕\n  DB        Redis     DB/API     DB         Correios      API       SMTP\n</code></pre>\n\n<p>Cada seta representa um ponto de integração que deve ser testado no nível de sistema.</p>\n\n<hr>\n<h3>Teste de Aceitação: Validando com o Cliente</h3>\n\n<p>O teste de aceitação determina se um produto ou sistema atende às expectativas e requisitos do cliente. Este é frequentemente o último nível de teste antes da entrega正式.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto certo?\"</strong></p>\n\n<h4>Tipos de Teste de Aceitação</h4>\n\n<p>##### 1. Teste de Aceitação do Usuário (UAT)</p>\n\n<p>Usuários finais testam o sistema em um ambiente semelhante ao de produção.</p>\n\n<p>##### 2. Teste de Aceitação Operacional (OAT)</p>\n\n<p>Equipe de operações validabackup, recuperação, relatórios.</p>\n\n<p>##### 3. Teste de Aceitação Contratual</p>\n\n<p>Verifica se o sistema atende aos critérios contratuais.</p>\n\n<h4>Características do UAT</h4>\n<ol><li>Geralmente envolve cooperação ou feedback do cliente</li>\n<li>Atividade de validação com dados reais</li>\n<li>Foco na usabilidade e fluxo de negócio</li>\n<li>Pode revelar requisitos mal entendidos</li>\n<li>Último checkpoint antes do go-live</li>\n</ol>\n<hr>\n<h3>Teste Funcional: Verificando Funcionalidades</h3>\n\n<p>O teste funcional determina se um recurso ou sistema funciona corretamente sem problemas. Verifica o sistema em diferentes níveis para garantir que todos os cenários são cobertos.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto da forma certa?\"</strong></p>\n\n<h4>Técnicas de Teste Funcional</h4>\n\n<p>##### 1. Teste Baseado em Requisitos<br><ol><li>Cada requisito tem casos de teste correspondentes</li><br><li>Rastreabilidade entre requisitos e testes</li><br><li>Cobertura completa</li><br></ol><br>##### 2. Teste Baseado em Casos de Uso<br><ol><li>Cenários de usuário documentados</li><br><li>Fluxos principais e alternativos</li><br><li>Pré-condições e pós-condições</li><br></ol><br>##### 3. Teste de Tabela de Decisão<br><ol><li>Combinações de condições e ações</li><br><li>Útil para regras de negócio complexas</li><br></ol><br>##### 4. Teste de Transição de Estado<br><ol><li>Mudanças de estado do sistema</li><br><li>Diagramas de estado</li><br></ol><br><hr><br><h2>Testes Não-Funcionais: Avaliando Qualidade Oculta</h2></p>\n\n<h3>Teste de Desempenho: Rapidez e Estabilidade</h3>\n\n<figure><img src=\"https://media.giphy.com/media/l0Iy69RBwNTRF0MXi/giphy.gif\" alt=\"Performance Testing - Testes de Desempenho\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de desempenho avalia a velocidade, responsividade e estabilidade do sistema sob carga de trabalho. É crítico para garantir que a aplicação atende aos SLAs (Service Level Agreements).</p>\n\n<h4>Subtipo 1: Teste de Carga (Load Testing)</h4>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas.</p>\n\n<p><strong>Métricas Coletadas:</strong><ol><li>Tempo de resposta (média, p95, p99)</li><br><li>Throughput (requisições por segundo)</li><br><li>Utilização de recursos (CPU, memória, disco)</li><br><li>Taxa de erros</li><br></ol><br><strong>Ferramentas Populares:</strong><ol><li>JMeter</li><br><li>Gatling</li><br><li>k6</li><br><li>Locust</li><br></ol><br><h4>Subtipo 2: Teste de Estresse (Stress Testing)</h4></p>\n\n<p>Avalia os limites do sistema além da capacidade normal para identificar o ponto de quebra.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar capacidade máxima</li><br><li>Verificar comportamento sob overload</li><br><li>Medir tempo de recuperação</li><br><li>Validar failovers</li><br></ol><br><h4>Subtipo 3: Teste de Resistência (Soak Testing)</h4></p>\n\n<p>Executa o sistema sob carga por períodos prolongados para identificar degradação gradual.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Conexões não fechadas</li><br><li>Acúmulo de logs</li><br><li>Degradação de performance</li><br></ol><br><h4>Subtipo 4: Teste de Pico (Spike Testing)</h4></p>\n\n<p>Avalia reações do sistema a picos súbitos de carga.</p>\n\n<p><strong>Cenário Exemplo:</strong><br><pre><code>Carga normal: 1000 usuários<br>Pico: 5000 usuários em 10 segundos<br>Recovery: Voltar para 1000 usuários<br></code></pre></p>\n\n<h4>Ferramentas de Teste de Desempenho</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>JMeter</strong></td><td>Open Source</td><td>Java</td><td>Enterprise, complexo</td></tr>\n<tr><td><strong>Gatling</strong></td><td>Open Source</td><td>Scala</td><td>DevOps, CI/CD</td></tr>\n<tr><td><strong>k6</strong></td><td>Open Source</td><td>JavaScript</td><td>Moderno, extensível</td></tr>\n<tr><td><strong>Locust</strong></td><td>Open Source</td><td>Python</td><td>Python teams</td></tr>\n<tr><td><strong>LoadRunner</strong></td><td>Comercial</td><td>Various</td><td>Enterprise</td></tr>\n</table></figure>\n\n<h4>Exemplo de Teste de Carga com k6</h4>\n\n<pre><code>// script.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },  // Ramp-up<br>    { duration: \'5m\', target: 100 },  // Steady state<br>    { duration: \'2m\', target: 200 },  // Spike<br>    { duration: \'5m\', target: 200 },  // Steady state<br>    { duration: \'2m\', target: 0 },    // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // Menos de 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/produtos\');<br>  check(res, {<br>    \'status é 200\': (r) =&gt; r.status === 200,<br>    \'tempo  r.timings.duration &lt; 500,<br>  });<br>  sleep(1);<br>}<br></code></pre></p>\n\n<hr>\n<h3>Teste de Segurança: Protegendo Dados e Sistemas</h3>\n\n<figure><img src=\"https://media.giphy.com/media/1qfDU4MJv3jWu34hEx/giphy.gif\" alt=\"Security Testing - Escudo de Segurança\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de segurança identifica vulnerabilidades e garante proteção de dados. Em um mundo cada vez mais digital, a segurança é prioridade.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n\n<p>##### 1. Teste de Penetração (Pen Test)</p>\n\n<p>Simula ataques para identificar vulnerabilidades antes que hackers maliciosos o façam.</p>\n\n<p><strong>Metodologias:</strong><ol><li>OWASP Testing Guide</li><br><li>PTES (Penetration Testing Execution Standard)</li><br><li>NIST SP 800-115</li><br></ol><br><strong>Tipos de Pentest:</strong><ol><li><strong>Black Box:</strong> Sem conhecimento prévio</li><br><li><strong>White Box:</strong> Código e documentação</li><br><li><strong>Gray Box:</strong> Conhecimento parcial</li><br></ol><br>##### 2. Varredura de Vulnerabilidade</p>\n\n<p>Identifica pontos fracos conhecidos através de scanning automatizado.</p>\n\n<p><strong>Ferramentas:</strong><ol><li>Nessus</li><br><li>OpenVAS</li><br><li>Qualys</li><br><li>Nexpose</li><br></ol><br>##### 3. Teste de Firewall e WAF</p>\n\n<p>Verifica configurações de segurança de firewalls e Web Application Firewalls.</p>\n\n<p><strong>O que testar:</strong><ol><li>Regras de firewall</li><br><li>Block de IPs maliciosos</li><br><li>Detecção de SQL Injection</li><br><li>Proteção XSS</li><br></ol><br>##### 4. Análise de Código Estático (SAST)</p>\n\n<p>Detecta vulnerabilidades no código-fonte sem executá-lo.</p>\n\n<p><strong>Ferramentas SAST:</strong><ol><li>SonarQube</li><br><li>Checkmarx</li><br><li>Fortify</li><br><li>Snyk Code</li><br></ol><br>##### 5. Análise de Componentes (SCA)</p>\n\n<p>Identifica vulnerabilidades em bibliotecas e dependências.</p>\n\n<p><strong>Ferramentas SCA:</strong><ol><li>Snyk</li><br><li>OWASP Dependency-Check</li><br><li>WhiteSource</li><br><li>Dependabot</li><br></ol><br><h4>OWASP Top 10: Vulnerabilidades Mais Comuns</h4><br><ol><li><strong>A01 - Broken Access Control</strong></li><br><li><strong>A02 - Cryptographic Failures</strong></li><br><li><strong>A03 - Injection</strong></li><br><li><strong>A04 - Insecure Design</strong></li><br><li><strong>A05 - Security Misconfiguration</strong></li><br><li><strong>A06 - Vulnerable Components</strong></li><br><li><strong>A07 - Authentication Failures</strong></li><br><li><strong>A08 - Software and Data Integrity Failures</strong></li><br><li><strong>A09 - Security Logging Failures</strong></li><br><li><strong>A10 - SSRF (Server-Side Request Forgery)</strong></li><br></ol><br><hr><br><h3>Teste de Usabilidade: Experiência do Usuário</h3></p>\n\n<p>Avalia a facilidade de uso e a experiência do usuário com o sistema. O teste de usabilidade é essencial para garantir que os usuários consigam realizar suas tarefas de forma eficiente.</p>\n\n<h4>Critérios de Usabilidade</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Critério</th><th>Definição</th><th>Métrica</th></tr>\n<tr><td><strong>Eficácia</strong></td><td>Usuário consegue completar tarefa?</td><td>Taxa de sucesso</td></tr>\n<tr><td><strong>Eficiência</strong></td><td>Quanto tempo leva?</td><td>Tempo de tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Usuário gostou?</td><td>Questionários SUS</td></tr>\n<tr><td><strong>Aprendizagem</strong></td><td>Quanto tempo para aprender?</td><td>Tempo até proficiência</td></tr>\n<tr><td><strong>Memorização</strong></td><td>Lembra como usar?</td><td>Retenção após pausa</td></tr>\n</table></figure>\n\n<h4>Métodos de Teste de Usabilidade</h4>\n<ol><li><strong>Testes com Usuários</strong> - Sessões gravadas com participantes</li>\n<li><strong>Análise Heurística</strong> - Avaliação por especialistas</li>\n<li><strong>Questionários</strong> - SUS, SEQ, NPS</li>\n<li><strong>Eye Tracking</strong> - Rastreamento ocular</li>\n<li><strong>Análise de Tarefas</strong> - Tempos e erros</li>\n</ol>\n<h4>Frameworks de Avaliação</h4>\n<ol><li><strong>Nielsen\'s Heurísticas</strong> (10 princípios)</li>\n<li><strong>ISO 9241-11</strong> (Usabilidade)</li>\n<li><strong>WCAG 2.1</strong> (Acessibilidade)</li>\n</ol>\n<hr>\n<h3>Teste de Compatibilidade: Funciona em Todo Lugar?</h3>\n\n<p>Verifica se o software funciona em diferentes ambientes, navegadores e dispositivos.</p>\n\n<h4>Tipos de Teste de Compatibilidade</h4>\n\n<p>##### 1. Teste de Navegador (Cross-Browser)<br><ol><li>Chrome, Firefox, Safari, Edge</li><br><li>Diferentes versões</li><br><li>Modos de compatibilidade</li><br></ol><br>##### 2. Teste Mobile<br><ol><li>iOS (iPhone, iPad)</li><br><li>Android (diferentes fabricantes)</li><br><li>Diferentes tamanhos de tela</li><br><li>Diferentes versões de OS</li><br></ol><br>##### 3. Teste de Sistema Operacional<br><ol><li>Windows 10, 11</li><br><li>macOS (versões diferentes)</li><br><li>Linux (distribuições populares)</li><br></ol><br>##### 4. Teste de Hardware<br><ol><li>Diferentes processadores</li><br><li>Diferentes quantidades de RAM</li><br><li>Diferentes resoluções de tela</li><br></ol><br><h4>Ferramentas de Teste Cross-Browser</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Cobertura</th><th>Preço</th></tr>\n<tr><td>BrowserStack</td><td>3000+ dispositivos</td><td>$29+/mês</td></tr>\n<tr><td>Sauce Labs</td><td>1000+ dispositivos</td><td>$39+/mês</td></tr>\n<tr><td>LambdaTest</td><td>3000+ dispositivos</td><td>$15+/mês</td></tr>\n<tr><td>CrossBrowserTesting</td><td>1500+ dispositivos</td><td>$29+/mês</td></tr>\n</table></figure>\n\n<hr>\n<h3>Teste de Recuperação: Resistência a Falhas</h3>\n\n<p>Avalia a capacidade do sistema de se recuperar de falhas e disasters. É crucial para sistemas críticos que não podem ficar fora do ar.</p>\n\n<h4>Cenários de Teste</h4>\n<ol><li><strong>Falha de Hardware</strong></li>\n</ol>   - Perda de disco\n   - Falha de memória\n   - Queda de servidor\n<ol><li><strong>Falha de Software</strong></li>\n</ol>   - Crash de aplicação\n   - Deadlock\n   - Exceções não tratadas\n<ol><li><strong>Falha de Rede</strong></li>\n</ol>   - Perda de conectividade\n   - Alta latência\n   - Timeout\n<ol><li><strong>Desastres</strong></li>\n</ol>   - Perda de datacenter\n   - Corrupção de dados\n   - Ataques DDoS\n\n<h4>Métricas de Recuperação</h4>\n<ol><li><strong>RTO (Recovery Time Objective):</strong> Tempo máximo para recuperação</li>\n<li><strong>RPO (Recovery Point Objective):</strong> Perda máxima de dados aceitável</li>\n<li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li>\n<li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li>\n</ol>\n<hr>\n<h2>Testes de Regressão: Mantendo a Qualidade</h2>\n\n<p>Executados sempre que o código é modificado para garantir que alterações não introduzam novos defeitos. Este é um dos tipos de teste mais importantes e frequentemente executados.</p>\n\n<h3>Quando Executar Testes de Regressão</h3>\n\n<p>✅ Após cada release de software  <br>✅ Após correção de bugs  <br>✅ Após atualizações de dependências  <br>✅ Após refactoring de código  <br>✅ Antes do deploy de produção</p>\n\n<h3>Estratégias de Testes de Regressão</h3>\n\n<h4>1. Regressão Completa</h4>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura total</li><br><li>Alta confiança</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Tempo longo</li><br><li>Custo elevado</li><br></ol><br><h4>2. Regressão Seletiva</h4></p>\n\n<p>Seleciona testes relevantes baseados em mudanças.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Mais rápido</li><br><li>Mais econômico</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode perder cobertura</li><br></ol><br><h4>3. Regressão Prioritária</h4></p>\n\n<p>Executa testes por prioridade (críticos &gt; altos &gt; médios &gt; baixos).</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura do crítico rápido</li><br><li>Decisões baseadas em risco</li><br></ol><br><h3>Automação de Testes de Regressão</h3></p>\n\n<p>A automação é essencial para testes de regressão eficazes:</p>\n\n<p><strong>Benefícios:</strong><ol><li>Execução frequente</li><br><li>Resultados consistentes</li><br><li>Rapidez</li><br><li>Cobertura ampla</li><br></ol><br><strong>Ferramentas Recomendadas:</strong><ol><li>Selenium WebDriver</li><br><li>Playwright</li><br><li>Cypress</li><br><li>Appium (mobile)</li><br><li>RestAssured (API)</li><br></ol><br><hr><br><h2>Pirâmide de Testes: Arquitetura Ideal</h2></p>\n\n<p>A pirâmide de testes é um conceito fundamental que guia a distribuição dos tipos de teste:</p>\n\n<pre><code>                    /\n                   /  \n                  / E2E        ← Poucos testes E2E (lentos, caros)\n                 /      \n                /Integração   ← Alguns testes de integração\n               /            \n              /  Unitários     ← Muitos testes unitários (rápidos, baratos)\n             /________________\n</code></pre>\n\n<h3>Proporções Ideais</h3>\n<ol><li><strong>Unitários:</strong> 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>Integração:</strong> 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>E2E:</strong> 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Compreender os diferentes tipos de testes de software é fundamental para construir uma estratégia de QA eficaz. Cada tipo de teste tem seu propósito específico e deve ser aplicado no momento adequado do ciclo de desenvolvimento.</p>\n\n<p><strong>Resumo dos Tipos de Testes:</strong></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Categoria</th><th>Tipo</th><th>Quando Usar</th><th>Objetivo</th></tr>\n<tr><td><strong>Funcional</strong></td><td>Unitário</td><td>Desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Integração</td><td>Pós-unitário</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Sistema</td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Aceitação</td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Performance</td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Segurança</td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Usabilidade</td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n</table></figure>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem todo projeto precisa de todos os tipos</li><br><li><strong>Priorize</strong> - Comece com unitários e integração</li><br><li><strong>Automatize</strong> - Regressão deve ser automática</li><br><li><strong>Meça</strong> - Cobertura, tempo, defeitos encontrados</li><br><li><strong>Melhore</strong> - Itere constantemente</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre Tipos de Testes</h3></p>\n\n<p><strong>P: Quantos tipos de testes existem?</strong>  <br>R: Existem dozens de tipos de testes classificados de diferentes formas. Os principais são funcionais e não-funcionais, cada um com subtipos específicos.</p>\n\n<p><strong>P: Qual a diferença entre teste de sistema e teste de aceitação?</strong>  <br>R: Teste de sistema verifica se o sistema atende aos requisitos técnicos. Teste de aceitação verifica se o sistema atende às expectativas do usuário/cliente.</p>\n\n<p><strong>P: Testes manuais podem ser substituídos por automatizados?</strong>  <br>R: Não completamente. Testes manuais são essenciais para exploratory testing, UX e cenários complexos. A automação complementa, não substitui.</p>\n\n<p><strong>P: Quando devo começar a testar?</strong>  <br>R: O mais cedo possível! O conceito de Shift-Left recomenda testes desde as primeiras fases do desenvolvimento.</p>\n\n<p><strong>P: Qual a ordem ideal de execução dos testes?</strong>  <br>R: Unitários → Integração → Sistema → Aceitação. Cada nível depende do anterior.</p>\n\n<hr>\n<em>Fonte: Selenium.dev, Atlassian, Vericode, ISTQB, OWASP</em>', 'Tipos de Testes de Software: Guia Completo com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '179-revision-v1', '', '', '2026-07-06 22:25:35', '2026-07-07 01:25:35', '', '179', 'http://localhost:8082/ideiasti/?p=408', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('409', '0', '2026-07-06 22:25:37', '2026-07-07 01:25:37', '<p><strong>Meta Description:</strong> Comparação completa entre os principais frameworks de automação de testes: Playwright, Cypress e Selenium. Análise de performance, features e recomendações para 2026.</p>\n\n<hr>\n<h2>Introdução ao Benchmark de Frameworks</h2>\n\n<p>Em 2026, três frameworks dominam a conversa de automação de testes: <strong>Selenium</strong>, <strong>Playwright</strong> e <strong>Cypress</strong>. A escolha do framework influencia diretamente a confiabilidade dos testes, carga de manutenção, velocidade de execução e entrega de software.</p>\n\n<figure><img src=\"https://media.giphy.com/media/l4q8cJzGdR9J8wDyA/giphy.gif\" alt=\"Code Testing - Automação de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este benchmark detalhado compara cada framework sob múltiplas dimensões para ajudá-lo a tomar a melhor decisão para seu projeto.</p>\n\n<hr>\n<h2>Comparativo Geral em 2026</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Aspecto</th><th>Playwright</th><th>Cypress</th><th>Selenium</th></tr>\n<tr><td><strong>Velocidade</strong></td><td>⭐⭐⭐⭐⭐ Mais rápido</td><td>⭐⭐⭐⭐ Médio</td><td>⭐⭐⭐ Mais lento</td></tr>\n<tr><td><strong>Paralelização</strong></td><td>⭐⭐⭐⭐⭐ Excelente</td><td>⭐⭐⭐⭐ Boa</td><td>⭐⭐⭐ Limitada</td></tr>\n<tr><td><strong>Custo CI</strong></td><td>⭐⭐⭐⭐⭐ Menor</td><td>⭐⭐⭐⭐ Médio</td><td>⭐⭐⭐⭐ Maior</td></tr>\n<tr><td><strong>Confiabilidade</strong></td><td>⭐⭐⭐⭐⭐ Alta</td><td>⭐⭐⭐⭐ Alta</td><td>⭐⭐⭐ Média</td></tr>\n<tr><td><strong>Curva de Aprendizado</strong></td><td>⭐⭐⭐ Média</td><td>⭐⭐⭐⭐ Fácil</td><td>⭐⭐⭐⭐⭐ Fácil</td></tr>\n<tr><td><strong>Suporte Browser</strong></td><td>⭐⭐⭐⭐⭐ Chrome, Firefox, Safari, Edge</td><td>⭐⭐⭐⭐ Chrome, Firefox, Edge</td><td>⭐⭐⭐⭐⭐ Todos</td></tr>\n<tr><td><strong>Comunidade</strong></td><td>⭐⭐⭐⭐ Em crescimento</td><td>⭐⭐⭐⭐ Grande</td><td>⭐⭐⭐⭐⭐ Massiva</td></tr>\n<tr><td><strong>Documentação</strong></td><td>⭐⭐⭐⭐⭐ Excelente</td><td>⭐⭐⭐⭐⭐ Excelente</td><td>⭐⭐⭐ Boa</td></tr>\n<tr><td><strong>Manutenção</strong></td><td>⭐⭐⭐⭐⭐ Baixa</td><td>⭐⭐⭐⭐ Média</td><td>⭐⭐⭐⭐⭐ Alta</td></tr>\n</table></figure>\n\n<hr>\n<h2>1. Selenium: O Padrão da Indústria</h2>\n\n<h3>História e Visão Geral</h3>\n\n<p>O Selenium é o framework mais estabelecido com mais de uma década de adoção enterprise. Foi criado em 2004 e desde então se tornou sinônimo de automação de testes web.</p>\n\n<figure><img src=\"https://media.giphy.com/media/7F7JL3BBaIN2I/giphy.gif\" alt=\"Selenium - Framework de Automação\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h3>Características Principais</h3>\n\n<ul><li><strong>Longevidade:</strong> 20+ anos de desenvolvimento contínuo</li><ol><li><strong>Adoção:</strong> Milhares de organizações em todo o mundo</li>\n<li><strong>Ecossistema:</strong> Amplo com ferramentas complementares</li>\n<li><strong>Suporte a Linguagens:</strong> Java, Python, C#, JavaScript, Ruby, Kotlin</li>\n</ol>\n<h3>Vantagens do Selenium</h3>\n\n<p>✅ <strong>Suporte cross-browser excepcional</strong> - Funciona com Chrome, Firefox, Safari, Edge, Opera, IE  <br>✅ <strong>Ampla comunidade e documentação</strong> - Milhares de tutoriais e recursos  <br>✅ <strong>Integração com múltiplas linguagens</strong> - Escolha a melhor para seu time  <br>✅ <strong>Ecossistema maduro</strong> - Selenium IDE, Selenium Grid, Appium  <br>✅ <strong>Flexibilidade</strong> - Controle total sobre Browser Driver  <br>✅ <strong>Grid para paralelização</strong> - Execute testes em múltiplas máquinas</p>\n\n<h3>Desvantagens do Selenium</h3>\n\n<p>❌ <strong>Execução mais lenta</strong> - Comparado a alternativas modernas  <br>❌ <strong>Manutenção de testes pode ser complexa</strong> - Locators frágeis  <br>❌ <strong>Requer configuração manual de WebDriver</strong> - Gestion manual de versões  <br>❌ <strong>Waits implícitos problemáticos</strong> - Pode causar flaky tests  <br>❌ <strong>API verbosa</strong> - Muito código para testes simples</p>\n\n<h3>Exemplo de Código Selenium</h3>\n\n<pre><code>from selenium import webdriver\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\nfrom selenium.webdriver.chrome.service import Service\n\n<p>def test_login_sucesso():<br>    # Configuração<br>    service = Service(\'/path/to/chromedriver\')<br>    driver = webdriver.Chrome(service=service)</p>\n\n<p>try:<br>        # Navegação<br>        driver.get(\'https://exemplo.com/login\')</p>\n\n<p># Esperar elemento<br>        wait = WebDriverWait(driver, 10)<br>        username = wait.until(<br>            EC.presence_of_element_located((By.ID, \'username\'))<br>        )</p>\n\n<p># Ações<br>        username.send_keys(\'usuario@teste.com\')<br>        driver.find_element(By.ID, \'password\').send_keys(\'senha123\')<br>        driver.find_element(By.ID, \'login-button\').click()</p>\n\n<p># Assertions<br>        assert \'Dashboard\' in driver.title<br>        wait.until(EC.url_contains(\'dashboard\'))</p>\n\n<p>finally:<br>        driver.quit()<br></code></pre></p>\n\n<h3>Quando Usar Selenium</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Cenário</th><th>Recomendação</th></tr>\n<tr><td>Projeto legacy com Selenium</td><td>Mantenha e evolua</td></tr>\n<tr><td>Necessita IE11 ou Safari antigo</td><td>Selenium é a opção</td></tr>\n<tr><td>Equipe com experiência Selenium</td><td>Use expertise existente</td></tr>\n<tr><td>Sistema com controles complexos</td><td>Flexibilidade do Selenium</td></tr>\n<tr><td>Testing cross-browser crítico</td><td>Selenium Grid</td></tr>\n</table></figure>\n\n<hr>\n<h2>2. Playwright: O Novo Líder de Performance</h2>\n\n<h3>História e Visão Geral</h3>\n\n<p>Playwright emergiu como líder de performance em 2025-2026. Desenvolvido pela Microsoft (mesma equipe do Puppeteer), oferece arquitetura moderna com WebSocket-based communication.</p>\n\n<h3>Características Principais</h3>\n<ol><li><strong>Arquitetura moderna</strong> - WebSocket-based para velocidade</li>\n<li><strong>Suporte nativo a múltiplos contextos de navegador</strong> - Isolamento automático</li>\n<li><strong>Auto-wait mechanisms</strong> - Espera automática por elementos</li>\n<li><strong>Network interception</strong> - Mock de requisições HTTP</li>\n<li><strong>Tracing integrado</strong> - Debug visual completo</li>\n</ol>\n<h3>Vantagens do Playwright</h3>\n\n<p>✅ <strong>Maior velocidade de execução</strong> - 2-10x mais rápido que Selenium  <br>✅ <strong>Suporte robusto para auto-wait</strong> - Menos flaky tests  <br>✅ <strong>Paralelização eficiente</strong> - Browser contexts isolados  <br>✅ <strong>Melhores resultados em benchmarks de 2026</strong> - Líder em performance  <br>✅ <strong>API moderna e intuitiva</strong> - Menos código para fazer mais  <br>✅ <strong>Suporte a múltiplas abas/janelas</strong> - Melhor que Cypress  <br>✅ <strong>Gravações de testes</strong> - Codegen integrado  <br>✅ <strong>Testes mobile web</strong> - Emulando dispositivos reais</p>\n\n<h3>Desvantagens do Playwright</h3>\n\n<p>❌ <strong>Ecossistema menor que Selenium</strong> - Menos integrações de terceiros  <br>❌ <strong>Curva de aprendizado para equipes habituadas a Selenium</strong> - Diferenças conceituais  <br>❌ <strong>Suporte apenas a Chromium, Firefox e Safari</strong> - Não suporta IE11</p>\n\n<h3>Exemplo de Código Playwright</h3>\n\n<pre><code>import asyncio\nfrom playwright.async_api import async_playwright\n\n<p>async def test_login_sucesso():<br>    async with async_playwright() as p:<br>        # Launch browser<br>        browser = await p.chromium.launch()<br>        context = await browser.new_context()<br>        page = await context.new_page()</p>\n\n<p>try:<br>            # Navegação<br>            await page.goto(\'https://exemplo.com/login\')</p>\n\n<p># Ações com auto-wait automático<br>            await page.fill(\'#username\', \'usuario@teste.com\')<br>            await page.fill(\'#password\', \'senha123\')<br>            await page.click(\'#login-button\')</p>\n\n<p># Assertions<br>            await page.wait_for_url(\'**/dashboard\')<br>            await page.wait_for_selector(\'.user-profile\')</p>\n\n<p># Verificação de conteúdo<br>            assert \'Dashboard\' in await page.title()</p>\n\n<p>finally:<br>            await browser.close()</p>\n\n<p># Para execução síncrona<br>def test_login_sucesso_sync():<br>    with sync_playwright() as p:<br>        browser = p.chromium.launch()<br>        page = browser.new_page()</p>\n\n<p>page.goto(\'https://exemplo.com/login\')<br>        page.fill(\'#username\', \'usuario@teste.com\')<br>        page.fill(\'#password\', \'senha123\')<br>        page.click(\'#login-button\')</p>\n\n<p>page.wait_for_url(\'**/dashboard\')<br>        assert \'Dashboard\' in page.title()</p>\n\n<p>browser.close()<br></code></pre></p>\n\n<h3>API Locators no Playwright</h3>\n\n<p>O Playwright introduziu locators modernos que são mais estáveis:</p>\n\n<pre><code># Locator moderno (recomendado)\nlocator = page.get_by_role(\'button\', name=\'Login\')\n\n<p># Locator por texto<br>locator = page.get_by_text(\'Entrar\')</p>\n\n<p># Locator por label<br>locator = page.get_by_label(\'Nome de usuário\')</p>\n\n<p># Locator por placeholder<br>locator = page.get_by_placeholder(\'Digite seu email\')</p>\n\n<p># Locator por teste ID<br>locator = page.get_by_test_id(\'submit-button\')</p>\n\n<p># Locator CSS tradicional<br>locator = page.locator(\'button.submit-btn\')<br></code></pre></p>\n\n<h3>Quando Usar Playwright</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Cenário</th><th>Recomendação</th></tr>\n<tr><td>Novo projeto</td><td>Playwright é a melhor escolha</td></tr>\n<tr><td>Performance crítica</td><td>Playwright líder</td></tr>\n<tr><td>Equipe moderna</td><td>APIs limpas e intuitivas</td></tr>\n<tr><td>CI/CD com alta frequência</td><td>Velocidade importa</td></tr>\n<tr><td>Testes mobile web</td><td>Emulação excelente</td></tr>\n<tr><td>Complexidade de abas/janelas</td><td>Suporte nativo</td></tr>\n</table></figure>\n\n<hr>\n<h2>3. Cypress: Focado na Experiência do Desenvolvedor</h2>\n\n<h3>História e Visão Geral</h3>\n\n<p>Cypress é um framework moderno focado em experiência do desenvolvedor. Diferente do Selenium, Cypress executa dentro do navegador, proporcionando maior controle e debugging.</p>\n\n<h3>Características Principais</h3>\n<ol><li><strong>Execução dentro do navegador</strong> - Não usa WebDriver</li>\n<li><strong>Time travel debugging</strong> - Volte no tempo durante falhas</li>\n<li><strong>Dashboard rico</strong> - Visualização de execuções</li>\n<li><strong>Configuração rápida</strong> - Zero config para projetos React</li>\n<li><strong>Auto-reload</strong> - Testes recarregam automaticamente</li>\n</ol>\n<h3>Vantagens do Cypress</h3>\n\n<p>✅ <strong>Configuração rápida</strong> - Funciona out-of-the-box  <br>✅ <strong>Excelente para testes de front-end</strong> - Integração com React, Vue, Angular  <br>✅ <strong>Dashboard rico para gerenciamento</strong> - Vídeos, screenshots, histórico  <br>✅ <strong>Debugging excepcional</strong> - Time travel, DevTools integrados  <br>✅ <strong>Comandos assíncronos simplificados</strong> - Sintaxe encadeada  <br>✅ <strong>Mock de servidor</strong> - Interceptação de requisições  <br>✅ <strong>Stubbing de funções</strong> - Controle total sobre código</p>\n\n<h3>Desvantagens do Cypress</h3>\n\n<p>❌ <strong>Suporte limitado a múltiplas abas/janelas</strong> - Não suporta bem  <br>❌ <strong>Não suporta iframe sem configurações específicas</strong> - Limitação técnica  <br>❌ <strong>Apenas Chrome-family por padrão</strong> - Firefox e Electron com limitações  <br>❌ <strong>Não suporta múltiplos tabs</strong> - Workflows limitados  <br>❌ <strong>Tests rodam apenas no browser</strong> - Sem suporte a desktop apps</p>\n\n<h3>Exemplo de Código Cypress</h3>\n\n<pre><code>describe(\'Login Flow\', () =&gt; {\n  beforeEach(() =&gt; {\n    cy.visit(\'/login\')\n  })\n\n<p>it(\'should login successfully with valid credentials\', () =&gt; {<br>    // Ações<br>    cy.get(\'#username\').type(\'usuario@teste.com\')<br>    cy.get(\'#password\').type(\'senha123{enter}\')</p>\n\n<p>// Assertions<br>    cy.url().should(\'include\', \'/dashboard\')<br>    cy.get(\'.user-profile\').should(\'be.visible\')<br>    cy.contains(\'Welcome\').should(\'exist\')<br>  })</p>\n\n<p>it(\'should show error with invalid credentials\', () =&gt; {<br>    cy.get(\'#username\').type(\'usuario@teste.com\')<br>    cy.get(\'#password\').type(\'senhaerrada\')<br>    cy.get(\'#login-button\').click()</p>\n\n<p>cy.get(\'.error-message\')<br>      .should(\'be.visible\')<br>      .and(\'contain\', \'Credenciais inválidas\')<br>  })</p>\n\n<p>it(\'should mock API response\', () =&gt; {<br>    cy.intercept(\'POST\', \'/api/login\', {<br>      statusCode: 401,<br>      body: { error: \'Unauthorized\' }<br>    }).as(\'loginRequest\')</p>\n\n<p>cy.get(\'#username\').type(\'usuario@teste.com\')<br>    cy.get(\'#password\').type(\'senha123\')<br>    cy.get(\'#login-button\').click()</p>\n\n<p>cy.wait(\'@loginRequest\')<br>    cy.get(\'.error-message\').should(\'exist\')<br>  })<br>})<br></code></pre></p>\n\n<h3>Quando Usar Cypress</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Cenário</th><th>Recomendação</th></tr>\n<tr><td>Projetos React/Vue/Angular</td><td>Excelente integração</td></tr>\n<tr><td>Desenvolvimento guiado por testes</td><td>Time travel debugging</td></tr>\n<tr><td>Equipe com forte background JS/TS</td><td>Sintaxe familiar</td></tr>\n<tr><td>Debugging frequente</td><td>Ferramentas excelentes</td></tr>\n<tr><td>Mock de APIs</td><td>Interceptação nativa</td></tr>\n<tr><td>Dashboard de testes</td><td>Visualização completa</td></tr>\n</table></figure>\n\n<hr>\n<h2>4. Comparativo Técnico Detalhado</h2>\n\n<h3>Performance Benchmark 2026</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Playwright</th><th>Cypress</th><th>Selenium</th></tr>\n<tr><td><strong>Teste médio (simples)</strong></td><td>0.8s</td><td>1.2s</td><td>2.5s</td></tr>\n<tr><td><strong>Suite 100 testes</strong></td><td>~80s</td><td>~120s</td><td>~250s</td></tr>\n<tr><td><strong>Uso de memória</strong></td><td>Baixo</td><td>Médio</td><td>Alto</td></tr>\n<tr><td><strong>Inicialização</strong></td><td>Rápida</td><td>Rápida</td><td>Lenta</td></tr>\n<tr><td><strong>CI pipeline (30 min)</strong></td><td>18min</td><td>22min</td><td>28min</td></tr>\n</table></figure>\n\n<h3>Suporte a Navegadores</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Browser</th><th>Playwright</th><th>Cypress</th><th>Selenium</th></tr>\n<tr><td>Chrome/Chromium</td><td>✅ Full</td><td>✅ Full</td><td>✅ Full</td></tr>\n<tr><td>Firefox</td><td>✅ Full</td><td>⚠️ Experimental</td><td>✅ Full</td></tr>\n<tr><td>Safari</td><td>✅ Full</td><td>❌ Não suporta</td><td>✅ Full</td></tr>\n<tr><td>Edge</td><td>✅ Full</td><td>✅ Full</td><td>✅ Full</td></tr>\n<tr><td>IE11</td><td>❌ Não suporta</td><td>❌ Não suporta</td><td>✅ Full</td></tr>\n</table></figure>\n\n<h3>Suporte Mobile</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Plataforma</th><th>Playwright</th><th>Cypress</th><th>Selenium</th></tr>\n<tr><td>iOS Safari</td><td>✅ Emulação</td><td>❌ Não</td><td>✅ Emulação</td></tr>\n<tr><td>Android Chrome</td><td>✅ Emulação</td><td>❌ Não</td><td>✅ Emulação</td></tr>\n<tr><td>Real devices</td><td>✅ Via第三方</td><td>❌ Não</td><td>✅ Via Appium</td></tr>\n</table></figure>\n\n<hr>\n<h2>5. Frameworks para Testes Unitários</h2>\n\n<h3>Pytest: O Padrão para Python</h3>\n\n<p>Pytest é um framework de testes \"all in one\" para Python, considerado o melhor framework de testes Python. É utilizado por Mozilla, Dropbox, Django e muitos outros projetos de renome.</p>\n\n<h4>Características</h4>\n<ol><li>Sistema de fixtures poderoso</li>\n<li>Rewriting de assertions</li>\n<li>Modelo de plugins extensível</li>\n<li>Sintaxe simples e intuitiva</li>\n<li>Parametrização de testes</li>\n</ol>\n<h4>Exemplo Pytest</h4>\n\n<pre><code>import pytest\nfrom calculator import Calculator\n\n<p>@pytest.fixture<br>def calculator():<br>    return Calculator()</p>\n\n<p>class TestCalculator:<br>    def test_soma_dois_numeros_positivos(self, calculator):<br>        assert calculator.soma(2, 3) == 5</p>\n\n<p>def test_soma_com_numero_negativo(self, calculator):<br>        assert calculator.soma(-1, 5) == 4</p>\n\n<p>@pytest.mark.parametrize(\"a,b,expected\", [<br>        (0, 0, 0),<br>        (1, 1, 2),<br>        (10, 20, 30),<br>        (-5, 5, 0),<br>    ])<br>    def test_soma_parametrizada(self, calculator, a, b, expected):<br>        assert calculator.soma(a, b) == expected</p>\n\n<p>def test_divisao_por_zero(self, calculator):<br>        with pytest.raises(ZeroDivisionError):<br>            calculator.divide(10, 0)<br></code></pre></p>\n\n<hr>\n<h3>Jest: O Framework JavaScript Mais Popular</h3>\n\n<p>Jest é o framework de testes JavaScript mais popular, integrado ao React e ecossistema Node.js. Desenvolvido pelo Facebook.</p>\n\n<h4>Características</h4>\n<ol><li>Configuração zero para projetos React</li>\n<li>Cobertura de código integrada</li>\n<li>Mocking poderoso</li>\n<li>Testes paralelos</li>\n<li>Snapshots para UI testing</li></ol></ul>\n\n<h4>Exemplo Jest</h4>\n\n<pre><code>// sum.test.js\nfunction sum(a, b) {\n  return a + b;\n}\n\n<p>describe(\'Calculator\', () =&gt; {<br>  test(\'adds two numbers\', () =&gt; {<br>    expect(sum(2, 3)).toBe(5);<br>  });</p>\n\n<p>test(\'adds negative numbers\', () =&gt; {<br>    expect(sum(-1, 1)).toBe(0);<br>  });</p>\n\n<p>describe(\'multiply\', () =&gt; {<br>    const multiply = (a, b) =&gt; a * b;</p>\n\n<p>test.each([<br>      [1, 1, 1],<br>      [2, 3, 6],<br>      [-2, 2, -4],<br>    ])(\'multiply({6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}i, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}i) = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}i\', (a, b, expected) =&gt; {<br>      expect(multiply(a, b)).toBe(expected);<br>    });<br>  });<br>});<br></code></pre></p>\n\n<hr>\n<h2>6. Recomendação Final</h2>\n\n<h3>Framework Recomendado por Cenário</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Cenário</th><th>Recomendação</th><th>Justificativa</th></tr>\n<tr><td><strong>Novo projeto em 2026</strong></td><td>Playwright</td><td>Performance líder, API moderna</td></tr>\n<tr><td><strong>Projeto React moderno</strong></td><td>Cypress</td><td>DX excelente, integração native</td></tr>\n<tr><td><strong>Projeto legacy</strong></td><td>Selenium</td><td>Manter e evoluir gradualmente</td></tr>\n<tr><td><strong>Performance crítica</strong></td><td>Playwright</td><td>2-10x mais rápido</td></tr>\n<tr><td><strong>Testes API + UI</strong></td><td>Playwright</td><td>Suporte completo</td></tr>\n<tr><td><strong>IE11 necessário</strong></td><td>Selenium</td><td>Única opção viável</td></tr>\n<tr><td><strong>Equipes DevOps</strong></td><td>Playwright</td><td>CI/CD otimizado</td></tr>\n<tr><td><strong>BDD/Testes de UX</strong></td><td>Cypress</td><td>Time travel debugging</td></tr>\n</table></figure>\n\n<h3>Conclusão do Benchmark</h3>\n\n<p><strong>Playwright é o framework mais rápido e eficiente em recursos em 2026</strong>, superando Cypress e Selenium em velocidade, paralelização e custo de CI. Para novos projetos, Playwright deve ser a primeira escolha. Para projetos existentes, avalie a migração incremental.</p>\n\n<hr>\n<h3>FAQ - Perguntas Frequentes sobre Frameworks</h3>\n\n<p><strong>P: Devo migrar do Selenium para Playwright?</strong>  <br>R: Depende. Para novos projetos, sim. Para projetos legados com suite madura, avalie custo-benefício. Considere migração incremental.</p>\n\n<p><strong>P: Cypress pode substituir Selenium completamente?</strong>  <br>R: Não em todos os casos. Cypress não suporta múltiplas abas, IE11, ou Safari nativo. Para esses casos, Selenium ou Playwright são necessários.</p>\n\n<p><strong>P: Qual framework tem melhor suporte mobile?</strong>  <br>R: Playwright oferece a melhor experiência mobile com emulação avançada. Selenium requer Appium para mobile testing.</p>\n\n<p><strong>P: Playwright é difícil de aprender?</strong>  <br>R: A curva de aprendizado é moderada. A documentação é excelente e a API é intuitiva. Equipes com experiência em Selenium podem precisar de ajustes mentais.</p>\n\n<p><strong>P: Qual framework tem melhor comunidade?</strong>  <br>R: Selenium ainda tem a maior comunidade. No entanto, Playwright e Cypress estão crescendo rapidamente em popularidade.</p>\n\n<hr>\n<em>Fonte: TestDino, FastBuilder.AI, TowardsAnalytics, Masters Software Testing, Benchmark 2026</em>', 'Benchmark de Frameworks de Testes 2026: Playwright vs Cypress vs Selenium', '', 'inherit', 'closed', 'closed', '', '180-revision-v1', '', '', '2026-07-06 22:25:37', '2026-07-07 01:25:37', '', '180', 'http://localhost:8082/ideiasti/?p=409', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('410', '0', '2026-07-06 22:25:38', '2026-07-07 01:25:38', '', 'giphy-1', '', 'inherit', 'open', 'closed', '', 'giphy-1', '', '', '2026-07-06 22:25:38', '2026-07-07 01:25:38', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-1.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('411', '0', '2026-07-06 22:25:39', '2026-07-07 01:25:39', '<p><strong>Meta Description:</strong> Descubra como a Inteligência Artificial está revolucionando a QA: automação inteligente, geração de testes, detecção de anomalias e manutenção preditiva. Guia completo para profissionais.</p>\n\n<hr>\n<h2>Estado Atual da IA em QA</h2>\n\n<p>O <strong>World Quality Report 2025</strong> revela dados impressionantes: quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão ativamente buscando GenAI</strong> em práticas de Quality Engineering (QE), mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} alcançaram implementação em escala empresarial.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-1.gif\" alt=\"AI Brain - Inteligência Artificial em QA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Esta lacuna entre interesse e implementação representa uma oportunidade significativa para profissionais e organizações que souberem aproveitar efetivamente essas tecnologias.</p>\n\n<hr>\n<h2>Por Que a Adoção de IA em QA Está Crescendo?</h2>\n\n<h3>Drivers de Adoção</h3>\n<ol><li><strong>Volume de testes crescente</strong> - Sistemas mais complexos exigem mais testes</li>\n<li><strong>Pressure de velocidade</strong> - CI/CD demanda execuções mais rápidas</li>\n<li><strong>Escassez de profissionais</strong> - Demanda supera oferta de testadores</li>\n<li><strong>Qualidade em produção</strong> - Necessidade de monitoramento contínuo</li>\n<li><strong>Custos crescentes</strong> - Automação inteligente reduz despesas</li>\n</ol>\n<h3>Benefícios Comprovados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Impacto da IA</th></tr>\n<tr><td>Redução de tempo de teste</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de custos de QA</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Melhoria em cobertura</td><td>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Detecção precoce de bugs</td><td>3-5x mais cedo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Desafios de Adoção de IA em QA</h2>\n\n<h3>1. Desalinhamento Estratégico</h3>\n\n<p>Existe um hiato crescente entre o interesse organizacional em GenAI e a prontidão real para adoção efetiva dentro de QE. O caminho da experimentação para implementação é mais complexo do que o antecipado.</p>\n\n<h4>Sinais de Desalinhamento</h4>\n\n<ul><li>GenAI vista como \"solução mágica\" sem estratégia clara</li><ol><li>Falta de alinhamento entre TI e negócios</li>\n<li>Expectativas irreais sobre capacidades</li>\n<li>Subestimação de esforço de integração</li>\n</ol>\n<h3>2. Complexidade de Implementação</h3>\n\n<p>A implementação de IA em QA requer alinhamento entre inovação operacional e oversight estratégico. Desafios incluem:</p>\n\n<h4>Desafios Técnicos</h4>\n<ol><li>Integração com sistemas legados</li>\n<li>Qualidade dos dados de treinamento</li>\n<li>Escolha de modelos adequados</li>\n<li>Manutenção de modelos em produção</li>\n</ol>\n<h4>Desafios Organizacionais</h4>\n<ol><li>Resistência cultural</li>\n<li>Falta de competências</li>\n<li>Processos não adaptados</li>\n<li>Governança de IA</li>\n</ol>\n<h3>3. Questões Éticas e de Governança</h3>\n<ol><li>Viés em modelos de IA</li>\n<li>Transparência nas decisões</li>\n<li>Responsabilidade por falhas</li>\n<li>Conformidade regulatória</li>\n</ol>\n<hr>\n<h2>Aplicações de IA em QA: Casos de Uso Detalhados</h2>\n\n<h3>1. Geração Automatizada de Testes</h3>\n\n<p>IA pode gerar casos de teste automaticamente baseados em requisitos e código. Esta é uma das aplicações mais promissoras.</p>\n\n<figure><img src=\"https://media.giphy.com/media/VbZ0cWw6cVPMM/giphy.gif\" alt=\"Automação de Testes com IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Requisitos → Análise de NLP → Cenários de Teste → Casos de Teste\n    ↓                                                        ↓\n Código → Análise Estática → Cobertura → Testes Sugeridos\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de unit tests</td><td>Diffblue</td></tr>\n<tr><td><strong>Testim</strong></td><td>Testes E2E com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>Automação sem código com IA</td><td>Avo Automation</td></tr>\n</table></figure>\n\n<h4>Exemplo: Geração de Testes com GenAI</h4>\n\n<pre><code># Exemplo conceitual de como IA pode gerar testes\nimport openai\n\n<p>def gerar_testes_para_requisito(requisito):<br>    prompt = f\"\"\"<br>    Gere casos de teste para o seguinte requisito:</p>\n\n<p>Requisito: {requisito}</p>\n\n<p>Formato de saída (JSON):<br>    {{<br>        \"casos_de_teste\": [<br>            {{<br>                \"id\": \"CT-001\",<br>                \"titulo\": \"...\",<br>                \"pre_condicoes\": [...],<br>                \"passos\": [...],<br>                \"dados_teste\": {{...}},<br>                \"resultado_esperado\": \"...\"<br>            }}<br>        ]<br>    }}<br>    \"\"\"</p>\n\n<p>response = openai.chat.completions.create(<br>        model=\"gpt-4\",<br>        messages=[{\"role\": \"user\", \"content\": prompt}]<br>    )</p>\n\n<p>return json.loads(response.choices[0].message.content)<br></code></pre></p>\n\n<h3>2. Detecção de Anomalias</h3>\n\n<p>Algoritmos de machine learning identificam padrões incomuns que indicam defeitos, revolucionando o monitoramento de qualidade.</p>\n\n<h4>Técnicas Utilizadas</h4>\n\n<p>##### Análise de Séries Temporais<br><ol><li>Identificação de anomalias em métricas de performance</li><br><li>Detecção de degradação gradual</li><br><li>Alertas proativos sobre problemas</li><br></ol><br>##### Clustering<br><ol><li>Agrupamento de testes similares</li><br><li>Identificação de testes atípicos</li><br><li>Detecção de padrões de falha</li><br></ol><br>##### Redes Neurais<br><ol><li>Detecção de padrões complexos</li><br><li>Aprendizado de comportamentos normais</li><br><li>Previsão de falhas</li><br></ol><br><h4>Ferramentas de Detecção de Anomalias</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Aplicação</th></tr>\n<tr><td><strong>Elastic APM</strong></td><td>APM</td><td>Detecção de anomalias em produção</td></tr>\n<tr><td><strong>Datadog</strong></td><td>Monitoring</td><td>ML para métricas</td></tr>\n<tr><td><strong>New Relic</strong></td><td>APM</td><td>Detecção inteligente</td></tr>\n<tr><td><strong>Grafana + Loki</strong></td><td>Logging</td><td>Análise de logs com ML</td></tr>\n</table></figure>\n\n<h3>3. Manutenção Inteligente de Testes</h3>\n\n<p>IA ajuda a identificar e remover testes obsoletos ou flaky, mantendo a suite de testes saudável.</p>\n\n<h4>Problemas que a IA Resolve</h4>\n\n<p><strong>Testes Flaky (Instáveis)</strong><br><ol><li>Identificação de padrões que causam instabilidade</li><br><li>Predição de quais testes podem falhar</li><br><li>Sugestões de correções</li><br><li>Quarentena automática</li><br></ol><br><strong>Testes Obsoletos</strong><br><ol><li>Detecção de funcionalidades removidas</li><br><li>Identificação de código não coberto</li><br><li>Sugestões de remoção segura</li><br></ol><br><h4>Exemplo de Detecção de Testes Flaky</h4></p>\n\n<pre><code># Sistema simplificado de detecção de testes flaky\nclass FlakyTestDetector:\n    def __init__(self):\n        self.test_history = {}\n        self.ml_model = load_trained_model()\n\n<p>def analyze_test(self, test_name, execution_history):<br>        features = self.extract_features(execution_history)<br>        flaky_probability = self.ml_model.predict_proba([features])[0]</p>\n\n<p>if flaky_probability &gt; 0.7:<br>            return {<br>                \"test\": test_name,<br>                \"flaky_probability\": flaky_probability,<br>                \"recommendation\": \"QUARANTINE\",<br>                \"reasons\": self.explain_prediction(features)<br>            }<br>        return {\"test\": test_name, \"flaky_probability\": flaky_probability}</p>\n\n<p>def extract_features(self, history):<br>        return [<br>            history.success_rate,<br>            history.avg_duration,<br>            history.recent_failures,<br>            history.environment_changes,<br>            history.dependency_changes<br>        ]<br></code></pre></p>\n\n<h3>4. Análise de Código Estático com IA</h3>\n\n<p>Identifica potenciais problemas de qualidade antes da execução, usando análise semântica avançada.</p>\n\n<h4>Capacidades Avançadas</h4>\n<ol><li><strong>Detecção de vulnerabilidades</strong> - OWASP Top 10</li>\n<li><strong>Análise de dependências</strong> - Bibliotecas desatualizadas</li>\n<li><strong>Code smells</strong> - Padrões problemáticos</li>\n<li><strong>Débito técnico</strong> - Métricas de qualidade</li>\n</ol>\n<h4>Ferramentas com IA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Capacidades IA</th><th>Integração</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Débito técnico, code smells</td><td>CI/CD</td></tr>\n<tr><td><strong>Snyk</strong></td><td>Vulnerabilidades, licenças</td><td>IDE, CI</td></tr>\n<tr><td><strong>CodeClimate</strong></td><td>Quality, maintainability</td><td>GitHub</td></tr>\n<tr><td><strong>DeepSource</strong></td><td>Análise estática com ML</td><td>Git</td></tr>\n</table></figure>\n\n<h3>5. Testes Visuais Automatizados</h3>\n\n<p>Comparação de interfaces visuais usando visão computacional para detectar regressões.</p>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Página Capturada → Modelo de Visão Computacional → Comparação com Baseline\n     ↓                          ↓                                    ↓\n  Screenshots           Detecção de Elementos           Diff Visual\n                                            ↓\n                                    Alertas de Regressão\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tecnologia</th><th>Diferencial</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Visual AI</td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de precisão</td></tr>\n<tr><td><strong> Percy</strong></td><td>Visual testing</td><td>Integração simples</td></tr>\n<tr><td><strong>Chromatic</strong></td><td>Visual regression</td><td>Para Storybook</td></tr>\n<tr><td><strong>Lost Pixel</strong></td><td>Open source</td><td>Self-hosted</td></tr>\n</table></figure>\n\n<h3>6. Oráculos de Teste Baseados em IA</h3>\n\n<p>Validação de resultados usando modelos treinados para determinar se o comportamento está correto.</p>\n\n<h4>Tipos de Oráculos</h4>\n<ol><li><strong>Oráculo de Imagem</strong> - Validação visual de UI</li>\n<li><strong>Oráculo de Texto</strong> - Análise de conteúdo</li>\n<li><strong>Oráculo de Comportamento</strong> - Detecção de anomalias</li>\n<li><strong>Oráculo de Dados</strong> - Validação de datasets</li>\n</ol>\n<hr>\n<h2>Ferramentas de IA para QA: Comparativo</h2>\n\n<h3>Plataformas Completas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Testim</strong></td><td>Automação inteligente E2E</td><td>$600+/mês</td><td>Equipes enterprise</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Automação com ML</td><td>Sob consulta</td><td>Escala enterprise</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>$500+/mês</td><td>CI/CD integrado</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>No-code com IA</td><td>Sob consulta</td><td>Enterprise</td></tr>\n<tr><td><strong>Perfecto</strong></td><td>Testes mobile/web com IA</td><td>Sob consulta</td><td>Mobile testing</td></tr>\n</table></figure>\n\n<h3>Ferramentas Especializadas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais</td><td>$100+/mês</td><td>UI testing</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Unit tests</td><td>$299/assinante</td><td>Dev teams</td></tr>\n<tr><td><strong>Snyk</strong></td><td>SCA</td><td>Grátis + Pro</td><td>Developers</td></tr>\n<tr><td><strong>SonarCloud</strong></td><td>SAST</td><td>Grátis + Pro</td><td>CI/CD</td></tr>\n</table></figure>\n\n<h3>Ferramentas Emerging (2025-2026)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Status</th></tr>\n<tr><td><strong>CodiumAI</strong></td><td>Testes gerados automaticamente</td><td>Beta</td></tr>\n<tr><td><strong>Mutable AI</strong></td><td>Code review + tests</td><td>Beta</td></tr>\n<tr><td><strong>Dagger</strong></td><td>CI/CD programável</td><td>GA</td></tr>\n<tr><td><strong>Trunk</strong></td><td>Linting inteligente</td><td>GA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando IA em QA: Roadmap Prático</h2>\n\n<h3>Fase 1: Avaliação e Planejamento (1-2 meses)</h3>\n\n<h4>Checklist de Avaliação</h4>\n<ol><li>[ ] Mapeamento de processos atuais de QA</li>\n<li>[ ] Identificação de pontos de dor</li>\n<li>[ ] Análise de ROI potencial</li>\n<li>[ ] Avaliação de maturidade tecnológica</li>\n<li>[ ] Levantamento de stakeholders</li>\n</ol>\n<h4>Métricas de Baseline</h4>\n\n<p>Antes de implementar, estabeleça métricas de referência:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Ferramenta</th></tr>\n<tr><td>Tempo de teste</td><td>Duração de suite</td><td>CI/CD logs</td></tr>\n<tr><td>Cobertura de teste</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>Coverage tools</td></tr>\n<tr><td>Taxa de defeitos</td><td>Bugs em produção</td><td>Bug tracker</td></tr>\n<tr><td>Testes flaky</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas instáveis</td><td>CI/CD</td></tr>\n<tr><td>Custo de QA</td><td>$/teste executado</td><td>Financeiro</td></tr>\n</table></figure>\n\n<h3>Fase 2: Pilot (2-3 meses)</h3>\n\n<h4>Escolha do Piloto</h4>\n\n<p>Selecione um projeto ou área com:<br><ol><li>✅ Escopo controlado</li><br><li>✅ Equipe aberta a inovação</li><br><li>✅ Processos definidos</li><br><li>✅ Métricas disponíveis</li><br></ol><br><h4>Pilotos Recomendados</h4><br><ol><li><strong>Geração de unit tests</strong> - Diffblue, CodiumAI</li><br><li><strong>Testes visuais</strong> - Applitools</li><br><li><strong>Detecção de flaky tests</strong> - Ferramentas de CI</li><br><li><strong>Análise estática</strong> - SonarQube, Snyk</li><br></ol><br><h3>Fase 3: Expansão (3-6 meses)</h3></p>\n\n<h4>Escalar Sucesso</h4>\n<ol><li>Documente aprendizados</li>\n<li>Treine outras equipes</li>\n<li>Padronize processos</li>\n<li>Melhore integrações</li>\n</ol>\n<h4>KPIs de Sucesso</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Meta (6 meses)</th></tr>\n<tr><td>Redução de tempo de teste</td><td>30-40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Aumento de cobertura</td><td>20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de defeitos em prod</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>ROI positivo</td><td>Sim</td></tr>\n</table></figure>\n\n<h3>Fase 4: Maturidade (6-12 meses)</h3>\n\n<h4>Implementação Enterprise</h4>\n<ol><li>Integração completa com CI/CD</li>\n<li>IA em produção (monitoramento)</li>\n<li>Maintenance automatizado</li>\n<li>Reporting avançado</li>\n</ol>\n<hr>\n<h2>Futuro da IA em QA: Tendências 2026-2028</h2>\n\n<h3>1. Testes Autônomos</h3>\n\n<p>Sistemas que automaticamente:<br><ol><li>Geram testes baseados em requisitos</li><br><li>Executam testes continuamente</li><br><li>Detectam e reportam falhas</li><br><li>Propõem correções</li><br></ol><br><h3>2. Manutenção Preditiva</h3></p>\n\n<p>IA que prevê:<br><ol><li>Quando testes vão falhar</li><br><li>Quando código precisa de mais testes</li><br><li>Quando componentes estão em risco</li><br><li>Quando fazer refactoring</li><br></ol><br><h3>3. GenAI Nativa em QA</h3></p>\n\n<p>Modelos treinados especificamente para:<br><ol><li>Entender código e testes</li><br><li>Gerar código de teste</li><br><li>Analisar requisitos</li><br><li>Documentar testes</li><br></ol><br><h3>4. Testes em Produção com IA</h3></p>\n\n<p>Monitoramento inteligente:<br><ol><li>Detecção de anomalias em produção</li><br><li>Geração automática de testes de regressão</li><br><li>Validação de deployments</li><br><li>Root cause analysis</li><br></ol><br><hr><br><h2>Considerações Éticas e Best Practices</h2></p>\n\n<h3>Governança de IA em QA</h3>\n\n<h4>Princípios</h4>\n<ol><li><strong>Transparência</strong> - Documente como a IA toma decisões</li>\n<li><strong>Responsabilidade</strong> - Humanos mantêm responsabilidade final</li>\n<li><strong>Fairness</strong> - Evite viés em modelos</li>\n<li><strong>Privacidade</strong> - Proteja dados sensíveis</li>\n<li><strong>Segurança</strong> - Proteja modelos contra ataques</li>\n</ol>\n<h4>Checklist de Governança</h4>\n<ol><li>[ ] Política de uso de IA em QA documentada</li>\n<li>[ ] Processos de revisão de decisões de IA</li>\n<li>[ ] Documentação de modelos utilizados</li>\n<li>[ ] Plano de contingência para falhas de IA</li>\n<li>[ ] Treinamento de equipe em uso responsável</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A IA está transformando fundamentalmente a QA, oferecendo oportunidades sem precedentes para aumentar eficiência, cobertura e qualidade. Embora a adoção em escala ainda seja um desafio, organizações que investem estrategicamente em IA para QA estão obtendo vantagens competitivas significativas.</p>\n\n<p><strong>Resumo dos Principais Aprendizados:</strong></p>\n\n<p>✅ IA pode reduzir tempo de teste em 40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}  <br>✅ GenAI está sendo buscada por 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações, mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram em escala  <br>✅ Ferramentas como Playwright, Applitools e Testim estão liderando a adoção  <br>✅ Implementação requer estratégia, não apenas ferramentas  <br>✅ Futuro aponta para testes autônomos e manutenção preditiva</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem toda organização precisa de todas as capacidades</li><br><li><strong>Comece pequeno</strong> - Pilotos controlados são mais eficazes</li><br><li><strong>Meça resultados</strong> - Métricas são essenciais</li><br><li><strong>Treine sua equipe</strong> - Competências em IA são necessárias</li><br><li><strong>Governarize</strong> - Adote práticas éticas desde o início</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre IA em QA</h3></p>\n\n<p><strong>P: A IA vai substituir testadores humanos?</strong>  <br>R: Não. A IA complementa o trabalho humano, permitindo que testadores foquem em atividades estratégicas, exploratory testing e design de testes.</p>\n\n<p><strong>P: Qual é o ROI da implementação de IA em QA?</strong>  <br>R: O ROI típico é de 200-500{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em 12-18 meses, considerando redução de tempo de teste, aumento de cobertura e redução de defeitos em produção.</p>\n\n<p><strong>P: Preciso de especialistas em dados para implementar IA em QA?</strong>  <br>R: Não necessariamente. Muitas ferramentas são \"plug-and-play\" e não requerem conhecimento de ML. No entanto, para implementações avançadas, especialistas são úteis.</p>\n\n<p><strong>P: Quais são os principais riscos do uso de IA em QA?</strong>  <br>R: Os principais riscos incluem: dependência excessiva, viés em modelos, falta de transparência e custos inesperados de manutenção.</p>\n\n<p><strong>P: Quando devo começar a usar IA em QA?</strong>  <br>R: Se você tem mais de 100 testes automatizados ou gastando mais de 20 horas/semana em QA, é um bom momento para avaliar ferramentas de IA.</p>\n\n<hr>\n<em>Fonte: World Quality Report 2025, Software Testing Magazine, Gartner Research, IEEE Software</em>', 'Inteligência Artificial em Quality Assurance: Guia Completo para 2025-2026', '', 'inherit', 'closed', 'closed', '', '181-revision-v1', '', '', '2026-07-06 22:25:39', '2026-07-07 01:25:39', '', '181', 'http://localhost:8082/ideiasti/?p=411', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('412', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Descubra as principais conclusões sobre qualidade de software, tendências de QA para 2025-2026, frameworks de teste e o papel da IA. Guia completo com recomendações práticas.</p>\n\n<hr>\n<h2>Síntese dos Aprendizados</h2>\n\n<figure><img src=\"https://media.giphy.com/media/3o7TKS4RmR4xF42n7S/giphy.gif\" alt=\"Future Tech - Tecnologia do Futuro\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>A Qualidade de Software evoluiu significativamente, passando de uma atividade de verificação final para um processo contínuo e integrado ao longo de todo o ciclo de desenvolvimento. Esta transformação reflete a crescente importância do software na sociedade moderna e as demandas cada vez maiores por sistemas confiáveis, seguros e eficientes.</p>\n\n<hr>\n<h2>Principais Insights: O Que Aprendemos</h2>\n\n<h3>1. Tendências para 2025-2026</h3>\n\n<p>O cenário da qualidade de software está sendo moldado por tendências tecnológicas e metodológicas que prometem revolucionar a forma como testamos e garantimos a qualidade.</p>\n\n<h4>As Tendências Mais Impactantes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tendência</th><th>Impacto</th><th>Adoção</th></tr>\n<tr><td><strong>IA e GenAI em QA</strong></td><td>Transformador</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} buscam, 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram</td></tr>\n<tr><td><strong>Playwright como Líder</strong></td><td>Performance 2-10x</td><td>Crescimento acelerado</td></tr>\n<tr><td><strong>Shift-Left Testing</strong></td><td>Redução de custos 10x</td><td>Maturidade crescente</td></tr>\n<tr><td><strong>Hiperautomação</strong></td><td>Eficiência operacional</td><td>Adoção em expansão</td></tr>\n<tr><td><strong>Testes em Nuvem</strong></td><td>Escalabilidade</td><td>Enterprise adotando</td></tr>\n<tr><td><strong>Segurança como Prioridade</strong></td><td>Risco reduzido</td><td>Obrigatório</td></tr>\n</table></figure>\n\n<h4>Por Que Estas Tendências Importam?</h4>\n\n<p><strong>IA e GenAI</strong> estão democratizando a automação e permitindo que equipes menores façam mais. A capacidade de gerar testes automaticamente, detectar anomalias e manter suites de teste inteligentes está mudando fundamentalmente o papel dos profissionais de QA.</p>\n\n<p><strong>Playwright</strong> representa a nova geração de frameworks de teste, oferecendo performance, confiabilidade e developer experience que superam alternativas anteriores. Para novos projetos, é a escolha óbvia.</p>\n\n<p><strong>Shift-Left</strong> não é apenas uma tendência, mas uma mudança de mentalidade. Ao testar mais cedo, organizações estão economizando tempo e dinheiro significativos.</p>\n\n<h3>2. Frameworks de Testes: Comparativo Final</h3>\n\n<h4>Recomendação por Cenário</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Cenário</th><th>Framework Recomendado</th><th>Alternativa</th></tr>\n<tr><td>Novo projeto 2026</td><td><strong>Playwright</strong></td><td>Cypress</td></tr>\n<tr><td>Performance crítica</td><td><strong>Playwright</strong></td><td>-</td></tr>\n<tr><td>Projeto React</td><td>Cypress</td><td>Playwright</td></tr>\n<tr><td>Legacy com Selenium</td><td>Manter/Evoluir</td><td>Migrar gradualmente</td></tr>\n<tr><td>IE11 necessário</td><td>Selenium</td><td>-</td></tr>\n<tr><td>Mobile testing</td><td>Playwright + Appium</td><td>-</td></tr>\n<tr><td>API testing</td><td>Playwright + RestAssured</td><td>Postman</td></tr>\n</table></figure>\n\n<h4>Conclusão Técnica</h4>\n\n<p><strong>Playwright é o framework mais rápido e eficiente em recursos em 2026</strong>, superando Cypress e Selenium em:</p>\n\n<p>✅ <strong>Velocidade</strong> - 2-10x mais rápido  <br>✅ <strong>Paralelização</strong> - Browser contexts isolados  <br>✅ <strong>Custo CI</strong> - Menor tempo = menor custo  <br>✅ <strong>Confiabilidade</strong> - Menos flaky tests  <br>✅ <strong>API moderna</strong> - Menos código, mais resultado</p>\n\n<p><strong>Cypress</strong> permanece excelente para:</p>\n\n<p>✅ <strong>Projetos React/Vue</strong> - Integração nativa  <br>✅ <strong>Developer Experience</strong> - Time travel debugging  <br>✅ <strong>TeamsJavaScript</strong> - Curva de aprendizado suave</p>\n\n<p><strong>Selenium</strong> continua relevante para:</p>\n\n<p>✅ <strong>Projetos legacy</strong> - Investimento a proteger  <br>✅ <strong>Suporte a browsers antigos</strong> - IE11, Safari antigo  <br>✅ <strong>Ecossistema massivo</strong> - Ferramentas complementares</p>\n\n<h4>Frameworks Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Recomendação</th><th>Por Que</th></tr>\n<tr><td><strong>Python</strong></td><td>pytest</td><td>Flexível, poderoso, comunidade ativa</td></tr>\n<tr><td><strong>JavaScript</strong></td><td>Jest</td><td>Integrado ao ecossistema Node, zero config</td></tr>\n<tr><td><strong>Java</strong></td><td>JUnit 5</td><td>Padrão da indústria, extensível</td></tr>\n<tr><td><strong>C#</strong></td><td>xUnit</td><td>Moderno, simples, recomendado pela Microsoft</td></tr>\n</table></figure>\n\n<h3>3. Tipos de Testes: Arquitetura Completa</h3>\n\n<h4>Pirâmide de Testes Ideal</h4>\n\n<pre><code>                        /\n                       /  \n                      / E2E        10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Validação end-to-end\n                     /      \n                    /Integração   20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Interfaces e comunicação\n                   /            \n                  /  Unitários    70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Base sólida de testes\n                 /________________\n</code></pre>\n\n<h4>Quando Usar Cada Tipo</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo de Teste</th><th>Quando</th><th>Objetivo Principal</th></tr>\n<tr><td><strong>Unitário</strong></td><td>Durante desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Integração</strong></td><td>Após unitários</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Sistema</strong></td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Aceitação</strong></td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Performance</strong></td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Segurança</strong></td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Usabilidade</strong></td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n<tr><td><strong>Regressão</strong></td><td>A cada mudança</td><td>Garantir não-regressão</td></tr>\n</table></figure>\n\n<hr>\n<h2>Recomendações Práticas</h2>\n\n<h3>1. Adotar Estratégia Híbrida</h3>\n\n<p>Combinar testes manuais e automatizados conforme necessidade. A automação não substitui completamente os testes manuais, especialmente para:</p>\n\n<p>✅ <strong>Exploratory Testing</strong> - Descobrir problemas não previstos  <br>✅ <strong>Testes de Usabilidade</strong> - Avaliar experiência do usuário  <br>✅ <strong>Testes de UX</strong> - Validar design e fluxo  <br>✅ <strong>Cenários complexos</strong> - Que requerem julgamento humano</p>\n\n<h3>2. Investir em Capacitação</h3>\n\n<p>Equipes precisam estar atualizadas com novas tecnologias. Plano de desenvolvimento:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Trimestre</th><th>Foco</th><th>Ação</th></tr>\n<tr><td><strong>Q1</strong></td><td>Fundamentos</td><td>Certificação ISTQB Foundation</td></tr>\n<tr><td><strong>Q2</strong></td><td>Automação</td><td>Aprender Playwright ou Cypress</td></tr>\n<tr><td><strong>Q3</strong></td><td>Cloud &amp; DevOps</td><td>AWS/Azure DevOps</td></tr>\n<tr><td><strong>Q4</strong></td><td>IA em QA</td><td>Hands-on com ferramentas de IA</td></tr>\n</table></figure>\n\n<h3>3. Priorizar Segurança</h3>\n\n<p>Incluir testes de penetração no pipeline de CI/CD. Em 2025-2026, segurança não é opcional:</p>\n\n<ul><li><strong>SAST</strong> - Análise estática integrada ao IDE</li><ol><li><strong>DAST</strong> - Scanner dinâmico no pipeline</li>\n<li><strong>SCA</strong> - Verificação de dependências</li>\n<li><strong>Pentest</strong> - Testes manuais periódicos</li>\n</ol>\n<h3>4. Monitorar Métricas</h3>\n\n<p>Usar dados para melhorar continuamente processos de QA. Métricas essenciais:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Meta</th></tr>\n<tr><td><strong>Cobertura de código</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Tempo de teste</strong></td><td>Duração de suite</td><td>Redução contínua</td></tr>\n<tr><td><strong>Taxa de falhas</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de builds com falhas</td><td>&lt;5{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Defeitos em prod</strong></td><td>Bugs por release</td><td>Tendência decreasing</td></tr>\n<tr><td><strong>MTTR</strong></td><td>Tempo para correção</td><td>&lt;24 horas</td></tr>\n</table></figure>\n\n<hr>\n<h2>Perspectivas Futuras</h2>\n\n<h3>O Que Vem Pela Frente</h3>\n\n<p>O futuro da QA está intrinsecamente ligado à IA. Organizações que conseguirem implementar GenAI efetivamente terão vantagem competitiva significativa. A chave está em encontrar o equilíbrio entre:<br><ol><li><strong>Automação inteligente</strong> - IA fazendo o trabalho repetitivo</li><br><li><strong>Intervenção humana estratégica</strong> - Especialistas focando no que importa</li><br><li><strong>Melhoria contínua</strong> - Aprendendo com dados e feedback</li><br><li><strong>Escalabilidade</strong> - Fazendo mais com menos recursos</li><br></ol><br><h3>As 5 Previsões para 2027-2028</h3></p>\n\n<h4>1. Testes Autônomos</h4>\n\n<p>Sistemas auto-testantes que:<ol><li>Detectam requisitos automaticamente</li><br><li>Geram testes sem intervenção</li><br><li>Executam continuamente</li><br><li>Detectam falhas em produção</li><br><li>Propõem correções</li><br></ol><br><h4>2. Auge da Hiperautomação</h4></p>\n\n<p>QA completamente automatizado com:<ol><li>Geração automática de código de teste</li><br><li>Manutenção preditiva de suites</li><br><li>Detecção proativa de falhas</li><br><li>Integração total com DevOps</li><br></ol><br><h4>3. Profissionais Evoluídos</h4></p>\n\n<p>Engenheiros de qualidade com:<ol><li>Habilidades em IA/ML</li><br><li>Competências em programação</li><br><li>Conhecimento de бизнес</li><br><li>Capabilities analíticas avançadas</li><br></ol><br><h4>4. Qualidade Contínua</h4></p>\n\n<p>Quality integrada em todos os estágios:<ol><li>Design orientado por qualidade</li><br><li>Desenvolvimento com testes-first</li><br><li>Deploy com quality gates</li><br><li>Monitoramento em produção</li><br></ol><br><h4>5. Shift-Right Expandido</h4></p>\n\n<p>Testes em produção com:<ol><li>Feature flags para experiments</li><br><li>Canary deployments</li><br><li>Real user monitoring</li><br><li>Feedback loops automáticos</li><br></ol><br><hr><br><h2>Como Começar Hoje</h2></p>\n\n<h3>Para Equipes Iniciantes</h3>\n<ol><li><strong>Comece com unit tests</strong> - pytest ou Jest</li>\n<li><strong>Automação básica</strong> - Selenium ou Playwright</li>\n<li><strong>CI/CD</strong> - GitHub Actions ou GitLab CI</li>\n<li><strong>Métricas simples</strong> - Cobertura e tempo</li>\n</ol>\n<h3>Para Equipes Intermediárias</h3>\n<ol><li><strong>Evolua para Playwright</strong> - Performance superior</li>\n<li><strong>Implemente testes de API</strong> - Postman ou RestAssured</li>\n<li><strong>Adicione performance testing</strong> - k6 ou JMeter</li>\n<li><strong>Integre segurança</strong> - SonarQube + Snyk</li>\n</ol>\n<h3>Para Equipes Avançadas</h3>\n<ol><li><strong>Explore IA em QA</strong> - Testim, Applitools</li>\n<li><strong>Implemente quality gates</strong> - Automação de decisões</li>\n<li><strong>Monitore em produção</strong> - APM + alerting</li>\n<li><strong>Adote testing em produção</strong> - Feature flags, canary</li>\n</ol>\n<hr>\n<h2>Mensagem Final</h2>\n\n<p>A qualidade de software não é um destino, mas uma jornada contínua de melhoria. As organizações que abraçam esta mentalidade, investem em pessoas e tecnologias certas, e mantêm o foco no valor para o cliente estarão bem posicionadas para o sucesso.</p>\n\n<p><strong>Lembre-se:</strong></p>\n\n<p>✅ <strong>Qualidade é responsabilidade de todos</strong> - Não apenas de QA  <br>✅ <strong>Automação é meio, não fim</strong> - O objetivo é qualidade, não automação  <br>✅ <strong>Pessoas fazem a diferença</strong> - Ferramentas são auxiliares  <br>✅ <strong>Melhoria contínua</strong> - Kaizen aplicada a QA  <br>✅ <strong>Valor para o cliente</strong> - Qualidade só faz sentido se entregar valor</p>\n\n<hr>\n<h2>Recursos Adicionais</h2>\n\n<h3>Leituras Recomendadas</h3>\n<ol><li>\"How Google Tests Software\" - James Whittaker</li>\n<li>\"Agile Testing\" - Lisa Crispin e Janet Gregory</li>\n<li>\"The Phoenix Project\" - Gene Kim</li>\n<li>\"Accelerate\" - Nicole Forsgren</li>\n</ol>\n<h3>Certificações</h3>\n<ol><li><strong>ISTQB</strong> - Foundation, Advanced, Expert</li>\n<li><strong>ICAgile</strong> - Agile Testing</li>\n<li><strong>AWS/Azure DevOps</strong> - Cloud certifications</li>\n<li><strong>Scrum.org</strong> - Professional Scrum Tester</li>\n</ol>\n<h3>Comunidades</h3>\n<ol><li>Ministry of Testing</li>\n<li>Selenium Community</li>\n<li>Playwright Community</li>\n<li>Software Testing Notes (Reddit)</li></ol></ul>\n\n<hr>\n<h3>FAQ - Perguntas Finais</h3>\n\n<p><strong>P: Qual é o futuro dos testadores manuais?</strong>  <br>R: Testadores evoluem para engenheiros de qualidade com habilidades em automação, análise de dados e IA. O foco muda de execução para estratégia.</p>\n\n<p><strong>P: Quando devo migrar do Selenium para Playwright?</strong>  <br>R: Para novos projetos, agora. Para projetos legacy, considere migração incremental quando a suite precisar de manutenção significativa.</p>\n\n<p><strong>P: Como justificar investimento em QA para a gestão?</strong>  <br>R: Use dados: custo de defeitos em produção vs. custo de detecção precoce, ROI de automação, métricas de qualidade.</p>\n\n<p><strong>P: Qual é a melhor abordagem para implementar IA em QA?</strong>  <br>R: Comece com pilotos controlados, meça resultados rigorosamente, escale o que funciona.</p>\n\n<p><strong>P: Como manter a motivação da equipe de QA?</strong>  <br>R: Invista em capacitação, mostre impacto do trabalho, automatize o repetitivo, valorize contribuições estratégicas.</p>\n\n<hr>\n<em>Dissertação atualizada em: 19/03/2026</em>  \n<em>Este guia faz parte de uma série completa sobre Qualidade de Software e QA</em>', 'Conclusão: O Futuro da Qualidade de Software e QA', '', 'inherit', 'closed', 'closed', '', '182-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '182', 'http://localhost:8082/ideiasti/?p=412', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('413', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda como implementar automação de testes de forma eficiente. Guia completo com estratégias, ferramentas, frameworks e melhores práticas para 2025.</p>\n\n<hr>\n<h2>O Que é Automação de Testes?</h2>\n\n<p>A automação de testes é o processo de usar ferramentas e scripts especializados para executar testes de software automaticamente, reduzindo a necessidade de intervenção manual e aumentando a eficiência, cobertura e consistência dos testes.</p>\n\n<h3>Por Que Automatizar Testes?</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Benefício</th><th>Impacto</th><th>Resultado</th></tr>\n<tr><td><strong>Velocidade</strong></td><td>Execução 10x mais rápida</td><td>Time-to-market reduzido</td></tr>\n<tr><td><strong>Consistência</strong></td><td>Resultados reprodutíveis</td><td>Confiabilidade aumentada</td></tr>\n<tr><td><strong>Cobertura</strong></td><td>Milhares de combinações</td><td>Qualidade aprimorada</td></tr>\n<tr><td><strong>Custo</strong></td><td>Redução de 50-70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>ROI positivo</td></tr>\n<tr><td><strong>Feedback</strong></td><td>Ciclos de feedback rápidos</td><td>Desenvolvimento ágil</td></tr>\n</table></figure>\n\n<hr>\n<h2>Quando Automatizar vs. Quando Manter Manual</h2>\n\n<h3>Critérios para Automatização</h3>\n\n<p><strong>AUTOMATIZAR quando:</strong></p>\n\n<p>✅ Testes executam frequentemente (regressão)  <br>✅ Cenários com múltiplas combinações de dados  <br>✅ Testes de performance e carga  <br>✅ Processos críticos com alto risco  <br>✅ Necessidade de execução em múltiplos navegadores  <br>✅ Integração contínua (CI/CD)</p>\n\n<p><strong>MANTER MANUAL quando:</strong></p>\n\n<p>✅ Testes executam uma única vez  <br>✅ Cenários exploratórios e discovery  <br>✅ Testes de usabilidade e UX  <br>✅ Correção rápida de bugs  <br>✅ Projetos com orçamento limitado  <br>✅ Sistemas em fase inicial de desenvolvimento</p>\n\n<hr>\n<h2>Estratégias de Automação de Testes</h2>\n\n<h3>1. Pirâmide de Automação</h3>\n\n<pre><code>                    /\n                   /  \n                  /  E2E        10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes end-to-end\n                 /________\n                /          \n               / Integração   20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes de API e serviços\n              /____________\n             /              \n            /   Unitários     70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes unitários\n           /__________________\n</code></pre>\n\n<h3>2. Modelo de Seleção de Testes</h3>\n\n<h4>Quadrante de Automação (Brian Marick)</h4>\n\n<pre><code>                    ↑\n                    │   Exploratory\n                    │   Tests\n                    │   (★ ★ ★)\n         ↓         │   Usability\n    Technology     │   Tests\n    Driven         │   (★ ★)\n    Tests          │\n    (★)            │\n         Unit      │   Product\n         Tests     │   Requirements\n    (★ ★ ★)       │   (★ ★ ★)\n         ←——————————→↓\n              ↓\n         Business\n         Facing\n         Tests\n</code></pre>\n\n<h3>3. Estratégia \"First, Then, Always\"</h3>\n<ol><li><strong>First</strong> - Testes mais críticos para o negócio</li>\n<li><strong>Then</strong> - Testes com maior frequência de execução</li>\n<li><strong>Always</strong> - Regressão completa em cada release</li>\n</ol>\n<hr>\n<h2>Frameworks de Automação: Escolhendo o Certo</h2>\n\n<h3>Frameworks Web (E2E)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Framework</th><th>Melhor Para</th><th>Linguagem</th><th>Curva</th></tr>\n<tr><td><strong>Playwright</strong></td><td>Performance, multi-browser</td><td>TS/JS/Python</td><td>Média</td></tr>\n<tr><td><strong>Cypress</strong></td><td>DX, projetos React</td><td>JS/TS</td><td>Baixa</td></tr>\n<tr><td><strong>Selenium</strong></td><td>Legacy, cross-browser</td><td>Qualquer</td><td>Média</td></tr>\n<tr><td><strong>Puppeteer</strong></td><td>Chrome-focused</td><td>JS/TS</td><td>Baixa</td></tr>\n</table></figure>\n\n<h3>Frameworks Mobile</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Framework</th><th>Plataforma</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>Appium</strong></td><td>iOS, Android</td><td>Qualquer</td><td>Cross-platform</td></tr>\n<tr><td><strong>Espresso</strong></td><td>Android</td><td>Java/Kotlin</td><td>Android nativo</td></tr>\n<tr><td><strong>XCTest</strong></td><td>iOS</td><td>Swift/Obj-C</td><td>iOS nativo</td></tr>\n<tr><td><strong>Detox</strong></td><td>React Native</td><td>JS/TS</td><td>React Native</td></tr>\n</table></figure>\n\n<h3>Frameworks API</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Framework</th><th>Linguagem</th><th>Características</th></tr>\n<tr><td><strong>RestAssured</strong></td><td>Java</td><td>DSL fluent</td></tr>\n<tr><td><strong>Supertest</strong></td><td>JavaScript</td><td>Express integration</td></tr>\n<tr><td><strong>HTTPie</strong></td><td>Python</td><td>CLI tool</td></tr>\n<tr><td><strong>Postman/Newman</strong></td><td>-</td><td>Collection execution</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando Automação: Passo a Passo</h2>\n\n<h3>Passo 1: Definir Objetivos e KPIs</h3>\n\n<p><strong>KPIs de Automação de Testes:</strong></p>\n\n<pre><code>📊 Taxa de Automação = (Casos automatizados / Total casos) × 100\n🎯 ROI de Automação = (Custo manual - Custo automatizado) / Custo automatizado\n⏱️ Tempo Economizado = Tempo manual - Tempo automatizado\n🔢 Defeitos Encontrados = Total defeitos detectados por automação\n</code></pre>\n\n<h3>Passo 2: Selecionar Ferramentas</h3>\n\n<p><strong>Critérios de Seleção:</strong><br><ol><li>Compatibilidade com tecnologias do projeto</li><br><li>Suporte a navegadores/dispositivos necessários</li><br><li>Curva de aprendizado da equipe</li><br><li>Custo de licença e manutenção</li><br><li>Comunidade e suporte</li><br><li>Integração com CI/CD</li><br></ol><br><h3>Passo 3: Criar Framework Base</h3></p>\n\n<pre><code># Estrutura de projeto típica\nproject/\n├── tests/\n│   ├── unit/\n│   ├── integration/\n│   ├── e2e/\n│   └── api/\n├── pages/           # Page Objects\n├── components/      # Componentes reutilizáveis\n├── fixtures/        # Dados de teste\n├── helpers/         # Funções utilitárias\n├── reports/         # Relatórios\n├── config/          # Configurações\n├── conftest.py      # Setup global\n├── pytest.ini       # Configuração pytest\n└── requirements.txt # Dependências\n</code></pre>\n\n<h3>Passo 4: Implementar Page Objects</h3>\n\n<pre><code># pages/login_page.py\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n<p>class LoginPage:<br>    URL = \"https://exemplo.com/login\"</p>\n\n<p>def __init__(self, driver):<br>        self.driver = driver<br>        self.wait = WebDriverWait(driver, 10)</p>\n\n<p>def load(self):<br>        self.driver.get(self.URL)<br>        return self</p>\n\n<p>def enter_username(self, username):<br>        element = self.wait.until(<br>            EC.presence_of_element_located((By.ID, \"username\"))<br>        )<br>        element.send_keys(username)<br>        return self</p>\n\n<p>def enter_password(self, password):<br>        self.driver.find_element(By.ID, \"password\").send_keys(password)<br>        return self</p>\n\n<p>def click_login(self):<br>        self.driver.find_element(By.ID, \"login-button\").click()<br>        return self</p>\n\n<p>def login(self, username, password):<br>        return (self<br>            .load()<br>            .enter_username(username)<br>            .enter_password(password)<br>            .click_login())<br></code></pre></p>\n\n<h3>Passo 5: Configurar Execução Paralela</h3>\n\n<pre><code># playwright.config.ts\nimport { defineConfig, devices } from \'@playwright/test\';\n\n<p>export default defineConfig({<br>  testDir: \'./tests/e2e\',<br>  fullyParallel: true,           // Execução paralela<br>  forbidOnly: !!process.env.CI,<br>  retries: process.env.CI ? 2 : 0,<br>  workers: process.env.CI ? 1 : undefined,  // workers em CI<br>  reporter: \'html\',</p>\n\n<p>use: {<br>    baseURL: \'https://exemplo.com\',<br>    trace: \'on-first-retry\',<br>    screenshot: \'only-on-failure\',<br>  },</p>\n\n<p>projects: [<br>    { name: \'chromium\', use: { ...devices[\'Desktop Chrome\'] } },<br>    { name: \'firefox\', use: { ...devices[\'Desktop Firefox\'] } },<br>    { name: \'webkit\', use: { ...devices[\'Desktop Safari\'] } },<br>  ],<br>});<br></code></pre></p>\n\n<hr>\n<h2>Boas Práticas de Automação</h2>\n\n<h3>1. Princípios SOLID em Testes</h3>\n\n<ul><li><strong>S</strong>ingle Responsibility: Cada teste uma coisa</li><ol><li><strong>O</strong>pen/Closed: Testes extensíveis, não modificáveis</li>\n<li><strong>L</strong>iskov Substitution: Sem dependências hard-coded</li>\n<li><strong>I</strong>nterface Segregation: Múltiplas interfaces específicas</li>\n<li><strong>D</strong>ependency Inversion: Depender de abstrações</li></ol></ul>\n\n<h3>2. Nomenclatura de Testes</h3>\n\n<pre><code># Padrão: test_[funcionalidade]_[cenário]_[resultado_esperado]\ndef test_login_com_credenciais_validas_exibe_dashboard():\n    pass\n\n<p>def test_login_com_senha_invalida_exibe_mensagem_erro():<br>    pass</p>\n\n<p>def test_carrinho_com_produto_adicionado_calcula_frete():<br>    pass<br></code></pre></p>\n\n<h3>3. Dados de Teste</h3>\n\n<pre><code># fixtures/conftest.py\nimport pytest\nfrom faker import Faker\n\n<p>fake = Faker(\'pt_BR\')</p>\n\n<p>@pytest.fixture<br>def usuario_valido():<br>    return {<br>        \"nome\": fake.name(),<br>        \"email\": fake.email(),<br>        \"senha\": \"Senha@123\",<br>        \"cpf\": fake.cpf()<br>    }</p>\n\n<p>@pytest.fixture<br>def produto():<br>    return {<br>        \"nome\": fake.word().capitalize(),<br>        \"preco\": fake.random_number(digits=3),<br>        \"sku\": fake.uuid4()[:8].upper()<br>    }<br></code></pre></p>\n\n<h3>4. Reportes e Logs</h3>\n\n<pre><code>import logging\nimport allure\n\n<p>logger = logging.getLogger(__name__)</p>\n\n<p>@allure.feature(\"Autenticação\")<br>@allure.story(\"Login de usuário\")<br>@allure.severity(allure.severity_level.CRITICAL)<br>def test_login_sucesso(usuario_valido):<br>    logger.info(f\"Iniciando teste de login para: {usuario_valido[\'email\']}\")</p>\n\n<p>with allure.step(\"Acessar página de login\"):<br>        login_page.load()</p>\n\n<p>with allure.step(\"Preencher credenciais\"):<br>        login_page.login(usuario_valido[\"email\"], usuario_valido[\"senha\"])</p>\n\n<p>with allure.step(\"Verificar redirecionamento\"):<br>        assert \"/dashboard\" in driver.current_url</p>\n\n<p>logger.info(\"Teste de login concluído com sucesso\")<br></code></pre></p>\n\n<hr>\n<h2>Integração com CI/CD</h2>\n\n<h3>GitHub Actions</h3>\n\n<pre><code># .github/workflows/test.yml\nname: Testes Automatizados\n\n<p>on:<br>  push:<br>    branches: [main, develop]<br>  pull_request:<br>    branches: [main]</p>\n\n<p>jobs:<br>  unit-tests:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - uses: actions/setup-python@v5<br>        with:<br>          python-version: \'3.11\'<br>      - run: pip install pytest pytest-cov<br>      - run: pytest tests/unit/ -v --cov=src --cov-report=xml<br>      - uses: codecov/codecov-action@v3</p>\n\n<p>e2e-tests:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - uses: actions/setup-node@v4<br>        with:<br>          node-version: \'20\'<br>      - run: npm ci<br>      - run: npx playwright install --with-deps<br>      - run: npm run test:e2e<br>      - uses: actions/upload-artifact@v4<br>        if: always()<br>        with:<br>          name: playwright-report<br>          path: playwright-report/<br></code></pre></p>\n\n<hr>\n<h2>Métricas e ROI de Automação</h2>\n\n<h3>Calculadora de ROI</h3>\n\n<pre><code>Custo Manual por Ciclo:\n  - 1000 casos × 10 min × R$0,50/min = R$5.000/ciclo\n\n<p>Custo Automatizado por Ciclo:<br>  - Setup: R$20.000<br>  - Manutenção: R$500/mês<br>  - Execução: 1000 casos × 2 min × R$0,10/min = R$200/ciclo</p>\n\n<p>Após 12 meses:<br>  - Manual: R$5.000 × 12 = R$60.000<br>  - Automatizado: R$20.000 + (R$500 × 12) + (R$200 × 12) = R$26.400</p>\n\n<p>Economia: R$60.000 - R$26.400 = R$33.600 (56{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})<br></code></pre></p>\n\n<h3>Dashboard de Métricas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Target</th><th>Status</th></tr>\n<tr><td>Taxa de Automação</td><td>&gt;70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>✅ 65{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Cobertura de Código</td><td>&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>✅ 78{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Tempo de Suite</td><td>&lt;30 min</td><td>⚠️ 45 min</td></tr>\n<tr><td>Flaky Tests</td><td>&lt;2{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>✅ 1.5{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Defeitos em Produção</td><td>&lt;5/release</td><td>✅ 3</td></tr>\n</table></figure>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A automação de testes é essencial para equipes que buscam qualidade em escala. Implementar uma estratégia eficaz requer planejamento, ferramentas certas e compromisso com melhoria contínua.</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie</strong> - Mapeie sua situação atual</li><br><li><strong>Priorize</strong> - Comece pelos testes mais impactantes</li><br><li><strong>Implemente</strong> - Construa sua framework</li><br><li><strong>Integre</strong> - CI/CD é fundamental</li><br><li><strong>Melhore</strong> - Métricas guiam evolução</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Qual a melhor ferramenta para começar?</strong>  <br>R: Playwright ou Cypress para E2E, pytest para API/unit. Ambos têm curva suave e documentação excelente.</p>\n\n<p><strong>P: Quantos testes devo automatizar?</strong>  <br>R: Foque em 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes mais executados (regressão) e críticos para o negócio.</p>\n\n<p><strong>P: Como lidar com testes flaky?</strong>  <br>R: Auto-wait robustos, retries configuráveis, isolamento de testes, investigar root cause.</p>\n\n<p><strong>P: Automação substitui testes manuais?</strong>  <br>R: Não. Automação executa testes existentes; exploratory testing ainda descobre bugs novos.</p>', 'Automação de Testes: Guia Completo para Implementação Eficiente', '', 'inherit', 'closed', 'closed', '', '183-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '183', 'http://localhost:8082/ideiasti/?p=413', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('414', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda estratégias de testes ágeis para equipes Scrum, Kanban e DevOps. Como implementar qualidade contínua em ciclos de desenvolvimento rápidos.</p>\n\n<hr>\n<h2>Introdução aos Testes Ágeis</h2>\n\n<p>Testes ágeis é uma abordagem que integra atividades de teste ao longo de todo o ciclo de desenvolvimento ágil, em vez de tratá-las como uma fase separada após a implementação. Esta filosofia promove qualidade contínua e colaboração entre desenvolvedores e testadores.</p>\n\n<h3>Princípios Fundamentais</h3>\n<ol><li><strong>Qualidade é responsabilidade de todos</strong> - Toda equipe é responsável pela qualidade</li>\n<li><strong>Testar cedo e frequentemente</strong> - Shift-Left em ação</li>\n<li><strong>Automação como habilitador</strong> - CI/CD e testes automatizados</li>\n<li><strong>Feedback rápido</strong> - loops de feedback curtos</li>\n<li><strong>Adaptação contínua</strong> - Melhoria baseada em retrospectivas</li>\n</ol>\n<hr>\n<h2>Testes em Diferentes Frameworks Ágeis</h2>\n\n<h3>1. Testes em Scrum</h3>\n\n<h4>Distribuição de Testes por Sprint</h4>\n\n<pre><code>Sprint (2 semanas)\n├── Semana 1\n│   ├── Dia 1-2: Planejamento + Desenvolvimento User Stories\n│   ├── Dia 3-4: Desenvolvimento + Testes Unitários\n│   └── Dia 5: Integração + Testes de Integração\n│\n└── Semana 2\n    ├── Dia 1-2: Testes manuais/exploratórios\n    ├── Dia 3-4: Automação de regressão\n    └── Dia 5: Demo + Retrospectiva\n</code></pre>\n\n<h4>Definition of Done (DoD)</h4>\n\n<p>Cada User Story só está \"Done\" quando:</p>\n\n<ul><li>[ ] Código implementado</li><ol><li>[ ] Unit tests escritos e passando (&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} coverage)</li>\n<li>[ ] Code review aprovado</li>\n<li>[ ] Testes de integração passando</li>\n<li>[ ] Testes funcionais passando</li>\n<li>[ ] Critérios de aceitação cumpridos</li>\n<li>[ ] Documentação atualizada</li>\n<li>[ ] Ready for Production</li>\n</ol>\n<h4>Definition of Ready (DoR)</h4>\n\n<p>Antes de entrar no Sprint:<br><ol><li>[ ] Critérios de aceitação definidos</li><br><li>[ ] Critérios de aceite claros e testáveis</li><br><li>[ ] Dependências identificadas</li><br><li>[ ] Estimativa de tamanho feita</li><br><li>[ ] Wireframes/UI definidos (se aplicável)</li><br></ol><br><h3>2. Testes em Kanban</h3></p>\n\n<h4>WIP Limits para QA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Etapa</th><th>WIP Limit</th><th>Razón</th></tr>\n<tr><td>To Do</td><td>10</td><td>Capacidade da equipe</td></tr>\n<tr><td>In Progress</td><td>5</td><td>Permite foco</td></tr>\n<tr><td>Testing</td><td>3</td><td>Qualidade no teste</td></tr>\n<tr><td>Review</td><td>2</td><td>bottlenecks visíveis</td></tr>\n<tr><td>Done</td><td>∞</td><td>Meta, não limite</td></tr>\n</table></figure>\n\n<h4>Fluxo de Testes Contínuo</h4>\n\n<pre><code>Backlog → Ready → In Dev → In Test → Ready to Deploy → Done\n              ↑                                   ↓\n              ←←←←←← BUG FOUND ←←←←←←←←←←←←←←←←←←←\n</code></pre>\n\n<h3>3. Testes em SAFe (Scaled Agile)</h3>\n\n<h4>Hierarquia de Testes</h4>\n\n<pre><code>Portfolio\n    ↓\nValue Stream\n    ↓\nLarge Solution (Program)\n    ├── Solution Demo\n    ├── Solution Acceptance\n    └── System Integration\n        ↓\n    Agile Release Train (ART)\n    ├── Iteration Planning\n    ├── Continuous Delivery Pipeline\n    └── System Demo\n        ↓\n    Team\n    ├── Unit Tests\n    ├── Component Tests\n    └── Feature Tests\n</code></pre>\n\n<hr>\n<h2>Estratégias de Teste por Fase Ágil</h2>\n\n<h3>Sprint 0: Preparação</h3>\n\n<p><strong>Atividades de Teste:</strong></p>\n\n<p>✅ Configurar ambiente de teste  <br>✅ Implementar framework de automação  <br>✅ Definir estratégia de testes  <br>✅ Criar templates de casos de teste  <br>✅ Estabelecer métricas de qualidade</p>\n\n<h3>Durante o Sprint</h3>\n\n<h4>Daily Testing Activities</h4>\n<ol><li><strong>Code Reviews</strong> - Verificar antes de commitar</li>\n<li><strong>Unit Tests</strong> - Desenvolvedor escreve junto com código</li>\n<li><strong>Peer Testing</strong> - Testar funcionalidades de colegas</li>\n<li><strong>Continuous Integration</strong> - Execução automática em cada commit</li>\n</ol>\n<h4>Quando Receber uma User Story</h4>\n\n<pre><code>1. READ → Ler critérios de aceitação<ol><li>DISCUSS → Tirar dúvidas com PO/analista</li>\n<li>CLARIFY →确保 compreensão comum</li>\n<li>PLAN → Identificar casos de teste</li>\n<li>TEST → Executar durante desenvolvimento</li>\n<li>AUTOMATE → Scripts de automação</li>\n<li>VERIFY → Confirmar que está \"Done\"</li>\n</ol></code></pre>\n\n<h3>Fim do Sprint</h3>\n\n<h4>Sprint Review Testing</h4>\n<ol><li>Demonstração de funcionalidades</li>\n<li>Validação com stakeholders</li>\n<li>Verificação de DoD</li>\n<li>Feedback do Product Owner</li>\n</ol>\n<h4>Sprint Retrospective</h4>\n<ol><li>O que funcionou bem em QA?</li>\n<li>O que precisa melhorar?</li>\n<li>Ações de melhoria para próximo sprint</li>\n</ol>\n<hr>\n<h2>Testes Ágeis em Prática</h2>\n\n<h3>Behavior-Driven Development (BDD)</h3>\n\n<h4>O Ciclo BDD</h4>\n\n<pre><code>        SPECIFICATION\n              ↓\n    ┌─────────────────────┐\n    │   User Stories      │\n    │   (Given-When-Then) │\n    └─────────────────────┘\n              ↓\n        IMPLEMENTATION\n              ↓\n    ┌─────────────────────┐\n    │   Executable Specs  │\n    │   (Cucumber/Behave) │\n    └─────────────────────┘\n              ↓\n         VALIDATION\n              ↓\n         FEEDBACK\n</code></pre>\n\n<h4>Exemplo de Cenário BDD</h4>\n\n<pre><code># features/login.feature\nFeature: Login de Usuário\n\n<p>Como um usuário registrado<br>  Quero fazer login no sistema<br>  Para acessar minha conta</p>\n\n<p>Scenario: Login com credenciais válidas<br>    Given que estou na página de login<br>    And o usuário \"joao@exemplo.com\" está registrado<br>    When eu preencho o campo email com \"joao@exemplo.com\"<br>    And eu preencho o campo senha com \"Senha@123\"<br>    And clico no botão \"Entrar\"<br>    Then sou redirecionado para o dashboard<br>    And uma mensagem de boas-vindas é exibida</p>\n\n<p>Scenario: Login com senha incorreta<br>    Given que estou na página de login<br>    And o usuário \"joao@exemplo.com\" está registrado<br>    When eu preencho o campo email com \"joao@exemplo.com\"<br>    And eu preencho o campo senha com \"senhaerrada\"<br>    And clico no botão \"Entrar\"<br>    Then permaneço na página de login<br>    And uma mensagem de erro \"Credenciais inválidas\" é exibida<br></code></pre></p>\n\n<pre><code># steps/login_steps.py\nfrom behave import given, when, then\nfrom selenium.webdriver.common.by import By\n\n<p>@given(\'que estou na página de login\')<br>def step_impl(context):<br>    context.driver.get(\'https://exemplo.com/login\')</p>\n\n<p>@when(\'eu preencho o campo email com \"{email}\"\')<br>def step_impl(context, email):<br>    context.driver.find_element(By.ID, \'email\').send_keys(email)</p>\n\n<p>@then(\'sou redirecionado para o dashboard\')<br>def step_impl(context):<br>    assert \'dashboard\' in context.driver.current_url<br></code></pre></p>\n\n<h3>Test-Driven Development (TDD)</h3>\n\n<h4>Ciclo Red-Green-Refactor</h4>\n\n<pre><code>    RED          GREEN         REFACTOR\n     ↓            ↓              ↓\n┌─────────┐  ┌─────────┐   ┌─────────────┐\n│Escreva   │  │Faça o   │   │Melhore o    │\n│Teste que │→ │teste    │→  │código sem   │\n│falha    │  │passar   │   │alterar      │\n└─────────┘  └─────────┘   │comportamento│\n     ↑                        └─────────────┘\n     └──────────────────────────────┘\n              (Repetir)\n</code></pre>\n\n<h4>Exemplo TDD</h4>\n\n<pre><code># TDD: Calculadora de desconto\n\n<p># 1. RED - Escrever teste que falha<br>def test_calcular_desconto_10_porcento():<br>    resultado = calcular_desconto(100, 10)<br>    assert resultado == 90  # Falha!</p>\n\n<p># 2. GREEN - Implementar código mínimo<br>def calcular_desconto(valor, percentual):<br>    return valor - (valor * percentual / 100)</p>\n\n<p># 3. REFACTOR - Melhorar código<br>def calcular_desconto(valor: float, percentual: float) -&gt; float:<br>    \"\"\"Calcula o valor final após desconto.\"\"\"<br>    if not 0 &lt;= percentual &lt;= 100:<br>        raise ValueError(\"Percentual deve estar entre 0 e 100\")<br>    return valor * (1 - percentual / 100)<br></code></pre></p>\n\n<hr>\n<h2>Automação de Testes em Ambientes Ágeis</h2>\n\n<h3>Pirâmide de Testes Ágil</h3>\n\n<pre><code>                    /\n                   /  \n                  / E2E      10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes end-to-end\n                 /________   Testes de aceitação de usuário\n                /          \n               /Integração   20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes de API/serviços\n              /______________\n             /                \n            /   Unitários       70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes unitários\n           /____________________ Rápidos, isolados, confiáveis\n</code></pre>\n\n<h3>Ferramentas por Camada</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Camada</th><th>Ferramentas</th><th>Linguagem</th></tr>\n<tr><td><strong>Unit</strong></td><td>JUnit, pytest, Jest, Mocha</td><td>Qualquer</td></tr>\n<tr><td><strong>Integration</strong></td><td>TestContainers, Postman</td><td>Qualquer</td></tr>\n<tr><td><strong>E2E</strong></td><td>Playwright, Cypress, Selenium</td><td>TS/JS/Python</td></tr>\n<tr><td><strong>Contract</strong></td><td>Pact, Spring Cloud Contract</td><td>Java/JS</td></tr>\n<tr><td><strong>Performance</strong></td><td>k6, JMeter, Gatling</td><td>Multi</td></tr>\n</table></figure>\n\n<h3>CI/CD Pipeline com Testes</h3>\n\n<pre><code># .github/workflows/ci.yml\nname: CI Pipeline\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  test:<br>    runs-on: ubuntu-latest</p>\n\n<p>services:<br>      postgres:<br>        image: postgres:15<br>        env:<br>          POSTGRES_DB: testdb<br>          POSTGRES_USER: test<br>          POSTGRES_PASSWORD: test</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p># Build<br>      - name: Build application<br>        run: npm ci &amp;&amp; npm run build</p>\n\n<p># Testes Unitários<br>      - name: Unit tests<br>        run: npm run test:unit -- --coverage<br>        env:<br>          DB_HOST: postgres</p>\n\n<p># Testes de Integração<br>      - name: Integration tests<br>        run: npm run test:integration<br>        env:<br>          DB_HOST: postgres</p>\n\n<p># Testes E2E<br>      - name: E2E tests<br>        run: npm run test:e2e<br>        if: github.event_name == \'push\'</p>\n\n<p># Análise de Código<br>      - name: SonarCloud Analysis<br>        uses: SonarSource/sonarcloud-github-action@master<br>        env:<br>          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}</p>\n\n<p># Upload Coverage<br>      - name: Upload coverage<br>        uses: codecov/codecov-action@v3<br></code></pre></p>\n\n<hr>\n<h2>Métricas Ágeis de Qualidade</h2>\n\n<h3>burndown de Defeitos</h3>\n\n<pre><code>Dias:   1  2  3  4  5  6  7  8  9 10\n        │  │  │  │  │  │  │  │  │  │\nIdeal ──└──┴──┴──┴──┴──┴──┴──┴──┴──┘\n        │\nReal ───└──┬──┬──┬──┐     ┌──┬──┬──┘\n          │  │  │  │     │  │  │\n         d1 d2 d3 d4     d7 d8 d9\n\n<p>Meta: Reduzir defeitos abertos ao longo do sprint<br></code></pre></p>\n\n<h3>Relatório de Qualidade do Sprint</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Sprint Anterior</th><th>Sprint Atual</th><th>Target</th></tr>\n<tr><td>Defeitos abertos no início</td><td>15</td><td>12</td><td>&lt;10</td></tr>\n<tr><td>Defeitos criados</td><td>8</td><td>6</td><td>&lt;5</td></tr>\n<tr><td>Defeitos resolvidos</td><td>11</td><td>10</td><td>&gt;8</td></tr>\n<tr><td>Defeitos em aberto no fim</td><td>12</td><td>8</td><td>&lt;5</td></tr>\n<tr><td>Cobertura de código</td><td>72{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>78{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Testes passando</td><td>95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>97{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&gt;98{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n</table></figure>\n\n<h3>Velocity de Testes</h3>\n\n<pre><code># Métricas de velocity de testes\nvelocity_data = {\n    \"sprints\": [1, 2, 3, 4, 5],\n    \"testes_automatizados\": [45, 68, 92, 115, 140],\n    \"cobertura\": [45, 55, 65, 73, 80],\n    \"tempo_execucao_min\": [60, 50, 42, 35, 30]\n}\n\n<p># Tendências<br>tendencia_teste = calculate_trend(velocity_data[\"testes_automatizados\"])<br>tendencia_cobertura = calculate_trend(velocity_data[\"cobertura\"])<br>tendencia_tempo = calculate_trend(velocity_data[\"tempo_execucao_min\"], descending=True)<br></code></pre></p>\n\n<hr>\n<h2>Desafios e Soluções</h2>\n\n<h3>Desafio 1: Falta de Tempo para Testes</h3>\n\n<p><strong>Soluções:</strong><br><ol><li>Automatizar tarefas repetitivas</li><br><li>Priorizar testes de maior impacto</li><br><li>Implementar Shift-Left</li><br><li>Dedicated time para automação</li><br></ol><br><h3>Desafio 2: Testes Lentes no CI</h3></p>\n\n<p><strong>Soluções:</strong><br><ol><li>Execução paralela</li><br><li>Selecionar testes por impacto</li><br><li>Cache de dependências</li><br><li>Execução em cloud</li><br></ol><br><h3>Desafio 3: Testes Flaky</h3></p>\n\n<p><strong>Soluções:</strong><br><ol><li>Waits explícitos ao invés de sleeps</li><br><li>Isolamento de testes</li><br><li>Retry strategies</li><br><li>Investigar root cause</li><br></ol><br><h3>Desafio 4: Cobertura Insuficiente</h3></p>\n\n<p><strong>Soluções:</strong><br><ol><li>TDD para novos features</li><br><li>Code coverage gates</li><br><li>Análise de risco para priorizar</li><br><li>Pair testing com devs</li><br></ol><br><hr><br><h2>Checklist de Testes Ágeis</h2></p>\n\n<h3>Antes do Sprint</h3>\n<ol><li>[ ] User Stories com critérios de aceitação claros</li>\n<li>[ ] Ambiente de teste configurado</li>\n<li>[ ] Framework de automação pronto</li>\n<li>[ ] Dados de teste准备好了</li>\n</ol>\n<h3>Durante o Sprint</h3>\n<ol><li>[ ] Unit tests escritos com código</li>\n<li>[ ] Code reviews realizados</li>\n<li>[ ] CI pipeline passando</li>\n<li>[ ] Testes manuais/exploratórios executados</li>\n</ol>\n<h3>Fim do Sprint</h3>\n<ol><li>[ ] Todos os testes passando</li>\n<li>[ ] DoD cumprido para cada story</li>\n<li>[ ] Regressão executada</li>\n<li>[ ] Métricas atualizadas</li>\n<li>[ ] Retrospectiva de QA realizada</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes ágeis não são apenas sobre ferramentas e automação - são sobre uma mentalidade de qualidade compartilhada por toda a equipe. As chaves para o sucesso são:<br><ol><li><strong>Integração</strong> - Testes não são fase separada</li><br><li><strong>Automação</strong> - Habilitador de velocidade</li><br><li><strong>Colaboração</strong> - Todos responsáveis por qualidade</li><br><li><strong>Feedback</strong> - Loops curtos de informação</li><br><li><strong>Melhoria</strong> - Retrospectivas e adaptação</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Como introduzir testes em uma equipe que não faz?</strong>  <br>R: Comece com unit tests, demonstre valor com métricas, expanda gradualmente.</p>\n\n<p><strong>P: Quantos testadores uma equipe ágil precisa?</strong>  <br>R: Não há número fixo. A proporção ideal depende da complexidade do projeto e maturidade da equipe.</p>\n\n<p><strong>P: Testes manuais ainda fazem sentido em ágil?</strong>  <br>R: Sim! Exploratory testing, UX testing e testes de novos cenários ainda são valiosos.</p>\n\n<p><strong>P: Como medir sucesso de testes ágeis?</strong>  <br>R: Métricas como cobertura, tempo de execução, defeitos em produção e velocity.</p>', 'Testes Ágeis: Estratégias para Equipes Ágeis e DevOps', '', 'inherit', 'closed', 'closed', '', '184-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '184', 'http://localhost:8082/ideiasti/?p=414', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('415', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Domine testes de performance: load testing, stress testing, spike testing e soak testing. Aprenda a usar JMeter, k6, Gatling e interprete resultados para otimizar seus sistemas.</p>\n\n<hr>\n<h2>Introdução aos Testes de Performance</h2>\n\n<p>Testes de performance são testes não-funcionais que avaliam quão bem um sistema se comporta sob diferentes condições de carga, volume e estresse. São críticos para garantir que aplicações atendam aos requisitos de velocidade, escalabilidade e estabilidade.</p>\n\n<h3>Por Que Testes de Performance São Essenciais?</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Impacto</th><th>Dados</th></tr>\n<tr><td><strong>Receita</strong></td><td>1 segundo de delay = 7{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos conversões</td></tr>\n<tr><td><strong>Usuários</strong></td><td>53{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} abandonam site se &gt;3s para carregar</td></tr>\n<tr><td><strong>Receita Amazon</strong></td><td>1 segundo de delay = $1.6B/ano em vendas</td></tr>\n<tr><td><strong>Google</strong></td><td>500ms extra = 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos buscas</td></tr>\n</table></figure>\n\n<hr>\n<h2>Tipos de Testes de Performance</h2>\n\n<h3>1. Load Testing (Teste de Carga)</h3>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas em produção.</p>\n\n<p><strong>Objetivos:</strong><br><ul><li>Medir tempos de resposta</li><ol><li>Verificar throughput máximo</li><br><li>Identificar bottlenecks</li><br><li>Validar SLAs</li><br></ol><br><strong>Exemplo de Cenário:</strong><br><pre><code>Carga esperada: 1000 usuários simultâneos<br>Horário de pico: 10:00-12:00 e 14:00-16:00<br>Transações por hora: 10.000<br></code></pre></p>\n\n<h3>2. Stress Testing (Teste de Estresse)</h3>\n\n<p>Avalia os limites do sistema além da capacidade normal.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar ponto de quebra</li><br><li>Medir degradação graciosa</li><br><li>Verificar recovery</li><br><li>Testar failovers</li><br></ol><br><strong>Cenário:</strong><br><pre><code>Normal: 1000 usuários<br>Stress: 2000 → 3000 → 5000 → 8000 → 10000 usuários<br>Objetivo: Encontrar onde o sistema quebra<br></code></pre></p>\n\n<h3>3. Spike Testing (Teste de Pico)</h3>\n\n<p>Avalia reações a picos súbitos de carga.</p>\n\n<pre><code>Carga normal: 1000 usuários\nPico: 5000 usuários em 5 segundos\nRecovery: 1000 usuários\nPadrão: On-off-on-off\n</code></pre>\n\n<h3>4. Soak Testing (Teste de Resistência)</h3>\n\n<p>Executa carga sustentada por período prolongado.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Connection pool exhaustion</li><br><li>Log rotation issues</li><br><li>Database connection limits</li><br><li>Disk space issues</li><br></ol><br><strong>Duração:</strong> 8-24+ horas contínuas</p>\n\n<h3>5. Endurance Testing</h3>\n\n<p>Similar ao Soak, mas com foco em validação de SLAs por longo período.</p>\n\n<hr>\n<h2>Métricas de Performance</h2>\n\n<h3>Métricas Principais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Descrição</th><th>Target Típico</th></tr>\n<tr><td><strong>Response Time (Avg)</strong></td><td>Tempo médio de resposta</td><td>&lt;2s para web, &lt;500ms para API</td></tr>\n<tr><td><strong>Response Time (P95)</strong></td><td>95º percentil</td><td>&lt;3s</td></tr>\n<tr><td><strong>Response Time (P99)</strong></td><td>99º percentil</td><td>&lt;5s</td></tr>\n<tr><td><strong>Throughput</strong></td><td>Requisições por segundo</td><td>Conforme especificado</td></tr>\n<tr><td><strong>Error Rate</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de requisições com erro</td><td>&lt;1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>CPU Usage</strong></td><td>Utilização de CPU</td><td>&lt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Memory Usage</strong></td><td>Utilização de memória</td><td>&lt;85{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Network I/O</strong></td><td>Largura de banda</td><td>Dentro de capacidade</td></tr>\n<tr><td><strong>Disk I/O</strong></td><td>Operações de disco</td><td>&lt;70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} capacidade</td></tr>\n</table></figure>\n\n<h3>Como Medir Percentis</h3>\n\n<pre><code>Lista de tempos de resposta (ms):\n[120, 150, 180, 200, 220, 250, 280, 300, 350, 400, 500, 600, 800, 1000]\n\n<p>Média: 334ms<br>Mediana (P50): 275ms<br>P95: 800ms (5{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} acima = 800ms)<br>P99: 1000ms (1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} acima = 1000ms)<br></code></pre></p>\n\n<hr>\n<h2>Ferramentas de Teste de Performance</h2>\n\n<h3>1. Apache JMeter</h3>\n\n<p><strong>Melhor para:</strong> Projetos enterprise, testes complexos</p>\n\n<h4>Instalação e Configuração</h4>\n\n<pre><code># Download JMeter\nwget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.6.3.tgz\ntar -xzf apache-jmeter-5.6.3.tgz\n\n<p># Executar (requer Java 8+)<br>cd apache-jmeter-5.6.3/bin<br>./jmeter.sh<br></code></pre></p>\n\n<h4>Exemplo de Plano de Teste (GUI)</h4>\n\n<pre><code>Test Plan\n├── Thread Group (Users: 100, Ramp-up: 10s, Loop: 10)\n│   ├── HTTP Request Defaults (Server: api.exemplo.com)\n│   │   └── Path: /api/produtos\n│   ├── HTTP Cookie Manager\n│   ├── Listeners\n│   │   ├── Summary Report\n│   │   ├── View Results Tree\n│   │   └── Graph Results\n</code></pre>\n\n<h4>Script JMeter (CLI)</h4>\n\n<pre><code>\n\n  \n    \n      API Load Test\n    \n    \n      \n        100\n        10\n        10\n      \n      \n        \n          api.exemplo.com\n          GET\n          /api/produtos\n        \n      \n    \n  \n\n</code></pre>\n\n<pre><code># Executar via CLI\n./jmeter.sh -n -t api_test.jmx -l results.jtl -e -o html_report\n</code></pre>\n\n<h3>2. k6 (Grafana k6)</h3>\n\n<p><strong>Melhor para:</strong> DevOps, scripts em JS, CI/CD integrado</p>\n\n<h4>Instalação</h4>\n\n<pre><code># macOS\nbrew install k6\n\n<p># Linux<br>sudo gpg -k<br>sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69<br>echo \"deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main\" | sudo tee /etc/apt/sources.list.d/k6.list<br>sudo apt-get update<br>sudo apt-get install k6<br></code></pre></p>\n\n<h4>Script k6 - Load Test Básico</h4>\n\n<pre><code>// load-test.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\nimport { Rate, Trend } from \'k6/metrics\';\n\n<p>// Métricas customizadas<br>const errorRate = new Rate(\'errors\');<br>const responseTime = new Trend(\'response_time\');</p>\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },   // Ramp-up<br>    { duration: \'5m\', target: 100 },   // Steady state<br>    { duration: \'2m\', target: 200 },   // Stress<br>    { duration: \'5m\', target: 200 },   // Steady state<br>    { duration: \'2m\', target: 0 },     // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das req &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // &lt; 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>    errors: [\'rate&lt;0.1&#039;],               // &lt; 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de erros<br>  },<br>};</p>\n\n<p>const BASE_URL = \'https://api.exemplo.com\';</p>\n\n<p>export default function () {<br>  // Login para obter token<br>  const loginRes = http.post(<code>${BASE_URL}/auth/login</code>, {<br>    email: \'usuario@teste.com\',<br>    password: \'senha123\',<br>  });</p>\n\n<p>check(loginRes, {<br>    \'login status 200\': (r) =&gt; r.status === 200,<br>    \'token received\': (r) =&gt; r.json(\'token\') !== undefined,<br>  });</p>\n\n<p>const token = loginRes.json(\'token\');</p>\n\n<p>// Listar produtos com token<br>  const productsRes = http.get(<code>${BASE_URL}/api/produtos</code>, {<br>    headers: {<br>      \'Authorization\': <code>Bearer ${token}</code>,<br>    },<br>  });</p>\n\n<p>responseTime.add(productsRes.timings.duration);<br>  errorRate.add(productsRes.status !== 200);</p>\n\n<p>check(productsRes, {<br>    \'products status 200\': (r) =&gt; r.status === 200,<br>    \'products returned\': (r) =&gt; r.json(\'data\').length &gt; 0,<br>  });</p>\n\n<p>sleep(1);<br>}<br></code></pre></p>\n\n<h4>Script k6 - Spike Test</h4>\n\n<pre><code>// spike-test.js\nimport http from \'k6/http\';\nimport { check } from \'k6\';\n\n<p>export const options = {<br>  scenarios: {<br>    spike_test: {<br>      executor: \'ramping-vus\',<br>      startVUs: 0,<br>      stages: [<br>        { duration: \'10s\', target: 100 },   // Normal<br>        { duration: \'30s\', target: 1000 },    // SPIKE!<br>        { duration: \'30s\', target: 1000 },   // Hold<br>        { duration: \'10s\', target: 100 },    // Recovery<br>        { duration: \'10s\', target: 0 },      // Cooldown<br>      ],<br>    },<br>  },<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;1000&#039;],<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/health\');<br>  check(res, { \'status OK\': (r) =&gt; r.status === 200 });<br>}<br></code></pre></p>\n\n<h3>3. Gatling</h3>\n\n<p><strong>Melhor para:</strong> Scala/Java, relatórios detalhados, CI/CD</p>\n\n<h4>Instalação</h4>\n\n<pre><code># Download\nwget https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/3.10.5/gatling-charts-highcharts-bundle-3.10.5.zip\nunzip gatling-charts-highcharts-bundle-3.10.5.zip\n</code></pre>\n\n<h4>Script Gatling (Scala)</h4>\n\n<pre><code>// src/test/scala/LoadSimulation.scala\npackage simulations\n\n<p>import io.gatling.core.Predef._<br>import io.gatling.http.Predef._</p>\n\n<p>class LoadSimulation extends Simulation {</p>\n\n<p>val baseUrl = \"https://api.exemplo.com\"</p>\n\n<p>val httpConfig = http<br>    .baseUrl(baseUrl)<br>    .acceptHeader(\"application/json\")<br>    .contentTypeHeader(\"application/json\")</p>\n\n<p>val userFeeder = csv(\"users.csv\").random</p>\n\n<p>val scn = scenario(\"API Load Test\")<br>    .feed(userFeeder)<br>    .exec(<br>      http(\"Login\")<br>        .post(\"/auth/login\")<br>        .body(StringBody(\"\"\"{\"email\":\"${email}\",\"password\":\"${password}\"}\"\"\"))<br>        .check(jsonPath(\"$.token\").saveAs(\"authToken\"))<br>    )<br>    .pause(1)<br>    .exec(<br>      http(\"Get Products\")<br>        .get(\"/api/produtos\")<br>        .header(\"Authorization\", \"Bearer ${authToken}\")<br>        .check(status.is(200))<br>    )<br>    .pause(1)<br>    .exec(<br>      http(\"Get Product Details\")<br>        .get(\"/api/produtos/1\")<br>        .header(\"Authorization\", \"Bearer ${authToken}\")<br>        .check(status.is(200))<br>    )</p>\n\n<p>setUp(<br>    scn.inject(<br>      rampUsers(100).during(30.seconds),<br>      constantUsersPerSec(50).during(60.seconds)<br>    )<br>  )<br>  .protocols(httpConfig)<br>  .thresholds(<br>    http_req_duration.p95.lt(500),<br>    http_req_duration.p99.lt(1000)<br>  )<br>}<br></code></pre></p>\n\n<h3>4. Locust (Python)</h3>\n\n<p><strong>Melhor para:</strong> Equipes Python, testes distribuídos</p>\n\n<h4>Instalação</h4>\n\n<pre><code>pip install locust\n</code></pre>\n\n<h4>Script Locust</h4>\n\n<pre><code># locustfile.py\nfrom locust import HttpUser, task, between, events\nimport random\n\n<p>class APIClient(HttpUser):<br>    wait_time = between(1, 3)</p>\n\n<p>def on_start(self):<br>        \"\"\"Login antes de executar tarefas\"\"\"<br>        response = self.client.post(\"/auth/login\", json={<br>            \"email\": \"usuario@teste.com\",<br>            \"password\": \"senha123\"<br>        })<br>        if response.status_code == 200:<br>            self.token = response.json()[\"token\"]<br>        else:<br>            self.token = None</p>\n\n<p>@task(3)<br>    def list_products(self):<br>        \"\"\"Listar produtos (mais frequente)\"\"\"<br>        if self.token:<br>            self.client.get(<br>                \"/api/produtos\",<br>                headers={\"Authorization\": f\"Bearer {self.token}\"}<br>            )</p>\n\n<p>@task(2)<br>    def get_product(self):<br>        \"\"\"Detalhes de produto\"\"\"<br>        product_id = random.randint(1, 100)<br>        if self.token:<br>            self.client.get(<br>                f\"/api/produtos/{product_id}\",<br>                headers={\"Authorization\": f\"Bearer {self.token}\"}<br>            )</p>\n\n<p>@task(1)<br>    def create_order(self):<br>        \"\"\"Criar pedido (menos frequente)\"\"\"<br>        if self.token:<br>            self.client.post(<br>                \"/api/pedidos\",<br>                headers={\"Authorization\": f\"Bearer {self.token}\"},<br>                json={<br>                    \"produto_id\": random.randint(1, 100),<br>                    \"quantidade\": random.randint(1, 5)<br>                }<br>            )</p>\n\n<p># Executar<br># locust -f locustfile.py --host=https://api.exemplo.com<br></code></pre></p>\n\n<hr>\n<h2>Cenários de Teste Common</h2>\n\n<h3>1. E-commerce</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Cenário</th><th>Usuários</th><th>Duração</th><th>Objetivo</th></tr>\n<tr><td>Navegação</td><td>500</td><td>10 min</td><td>P95 &lt; 2s</td></tr>\n<tr><td>Busca</td><td>200</td><td>5 min</td><td>Throughput &gt; 50/s</td></tr>\n<tr><td>Checkout</td><td>100</td><td>15 min</td><td>P95 &lt; 5s</td></tr>\n<tr><td>Pico Black Friday</td><td>2000</td><td>1 min</td><td>Sistema estável</td></tr>\n</table></figure>\n\n<h3>2. API REST</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Endpoint</th><th>Load</th><th>Stress</th><th>Spike</th></tr>\n<tr><td>GET /users</td><td>1000 rps</td><td>2000 rps</td><td>5000 rps</td></tr>\n<tr><td>POST /orders</td><td>500 rps</td><td>1000 rps</td><td>2000 rps</td></tr>\n<tr><td>GET /products</td><td>2000 rps</td><td>4000 rps</td><td>8000 rps</td></tr>\n</table></figure>\n\n<h3>3. Aplicação Web</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Página</th><th>Target Load</th><th>P95 Target</th></tr>\n<tr><td>Home</td><td>1000 concurrent</td><td>&lt;3s</td></tr>\n<tr><td>Search</td><td>500 concurrent</td><td>&lt;2s</td></tr>\n<tr><td>Product Page</td><td>800 concurrent</td><td>&lt;2.5s</td></tr>\n<tr><td>Checkout</td><td>200 concurrent</td><td>&lt;5s</td></tr>\n</table></figure>\n\n<hr>\n<h2>Interpretando Resultados</h2>\n\n<h3>Identificando Bottlenecks</h3>\n\n<h4>CPU Bound</h4>\n\n<pre><code>Sintomas:<ol><li>CPU &gt; 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</li>\n<li>Throughput não aumenta com mais usuários</li>\n<li>Response time aumenta linearmente</li>\n</ol>\nSoluções:<ol><li>Otimizar algoritmos</li>\n<li>Cachear resultados</li>\n<li>Adicionar índices ao banco</li>\n<li>Load balancing</li>\n</ol></code></pre>\n\n<h4>Memory Bound</h4>\n\n<pre><code>Sintomas:<ol><li>Memory leak crescente</li>\n<li>Garbage collection frequente</li>\n<li>OOM errors</li>\n</ol>\nSoluções:<ol><li>Code review para memory leaks</li>\n<li>Aumentar memória</li>\n<li>Pool de objetos</li>\n<li>Compactação de dados</li>\n</ol></code></pre>\n\n<h4>I/O Bound</h4>\n\n<pre><code>Sintomas:<ol><li>Disk I/O 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</li>\n<li>Network saturation</li>\n<li>Queries lentas</li>\n</ol>\nSoluções:<ol><li>Cache de queries</li>\n<li>Compressão de dados</li>\n<li>CDN para estáticos</li>\n<li>Read replicas</li>\n</ol></code></pre>\n\n<h3>Dashboard de Resultados</h3>\n\n<pre><code>// Exemplo de parse de resultados JMeter para dashboard\nconst results = parseJMeterResults(\'results.jtl\');\n\n<p>const summary = {<br>  totalRequests: results.length,<br>  avgResponseTime: results.avg(r =&gt; r.elapsed),<br>  p95ResponseTime: results.percentile(95, r =&gt; r.elapsed),<br>  p99ResponseTime: results.percentile(99, r =&gt; r.elapsed),<br>  errorRate: results.filter(r =&gt; r.success === false).length / results.length,<br>  throughput: results.length / (results.max(r =&gt; r.timestamp) - results.min(r =&gt; r.timestamp)) * 1000,<br>};</p>\n\n<p>console.log(`<br>=== Load Test Summary ===<br>Total Requests: ${summary.totalRequests}<br>Avg Response: ${summary.avgResponseTime}ms<br>P95 Response: ${summary.p95ResponseTime}ms<br>P99 Response: ${summary.p99ResponseTime}ms<br>Error Rate: ${(summary.errorRate * 100).toFixed(2)}{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>Throughput: ${summary.throughput.toFixed(2)} req/s<br>`);<br></code></pre></p>\n\n<hr>\n<h2>Melhores Práticas</h2>\n\n<h3>Antes do Teste</h3>\n<ol><li><strong>Definir objetivos claros</strong> - SLAs, thresholds</li>\n<li><strong>Ambiente isolado</strong> - Não testar em produção</li>\n<li><strong>Dados准备了</strong> - Massa de dados realista</li>\n<li><strong>Baseline estabelecido</strong> - Métricas de referência</li>\n<li><strong>Monitoramento configurado</strong> - APM tools</li>\n</ol>\n<h3>Durante o Teste</h3>\n<ol><li><strong>Iniciar gradualmente</strong> - Ramp-up suave</li>\n<li><strong>Monitorar em tempo real</strong> - Dashboards ativos</li>\n<li><strong>Documentar incidentes</strong> - Timestamps e evidências</li>\n<li><strong>Não tocar no ambiente</strong> - Interferência mínima</li>\n<li><strong>Capturar métricas</strong> - Logs, monitoring, profiling</li>\n</ol>\n<h3>Após o Teste</h3>\n<ol><li><strong>Analisar resultados</strong> - Correlacionar métricas</li>\n<li><strong>Identificar bottlenecks</strong> - Root cause analysis</li>\n<li><strong>Documentar achados</strong> - Relatório técnico</li>\n<li><strong>Recomendar ações</strong> - Priorizadas por impacto</li>\n<li><strong>Repetir testes</strong> - Validar otimizações</li>\n</ol>\n<hr>\n<h2>Checklist de Teste de Performance</h2>\n\n<h3>Preparação</h3>\n<ol><li>[ ] Objetivos de teste definidos</li>\n<li>[ ] SLAs documentados</li>\n<li>[ ] Ambiente configurado</li>\n<li>[ ] Dados de teste criados</li>\n<li>[ ] Baselinecapturado</li>\n<li>[ ] Monitoramento configurado</li>\n</ol>\n<h3>Execução</h3>\n<ol><li>[ ] Teste piloto executado</li>\n<li>[ ] Carga gradual aplicada</li>\n<li>[ ] Métricas capturadas</li>\n<li>[ ] Incidentes documentados</li>\n<li>[ ] Logs coletados</li>\n</ol>\n<h3>Análise</h3>\n<ol><li>[ ] Resultados analisados</li>\n<li>[ ] Bottlenecks identificados</li>\n<li>[ ] Recomendações formuladas</li>\n<li>[ ] Relatório preparado</li>\n<li>[ ] Ações priorizadas</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de performance são essenciais para garantir que suas aplicações atendam às expectativas dos usuários em termos de velocidade, escalabilidade e estabilidade. A escolha da ferramenta certa depende do contexto do projeto, mas o mais importante é:<br><ol><li><strong>Testar regularmente</strong> - Não apenas antes de releases</li><br><li><strong>Definir SLAs claros</strong> - Métricas objetivas</li><br><li><strong>Analisar resultados</strong> - Não apenas coletar</li><br><li><strong>Otimizar continuamente</strong> - Melhoria progressiva</li><br><li><strong>Automatizar</strong> - CI/CD integrado</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Quantos usuários devo simular no load test?</strong>  <br>R: Baseie-se em seus picos de uso real + margem de 20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}.</p>\n\n<p><strong>P: Qual é o P95 ideal?</strong>  <br>R: Depende do tipo de aplicação. API: &lt;500ms, Web: &lt;3s, Mobile: &lt;2s.</p>\n\n<p><strong>P: Como often devo executar load tests?</strong>  <br>R: Mínimo: antes de cada release. Ideal: diária com subset, semanal completa.</p>\n\n<p><strong>P: Load test em produção é uma boa ideia?</strong>  <br>R: Somente com feature flags, canary deployments e monitoramento rigoroso.</p>', 'Testes de Performance: Guia Completo de Load Testing e Stress Testing', '', 'inherit', 'closed', 'closed', '', '185-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '185', 'http://localhost:8082/ideiasti/?p=415', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('416', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a implementar testes de segurança eficazes: OWASP Top 10, penetration testing, SAST, DAST, SCA e análise de vulnerabilidades. Guia completo para proteção de aplicações.</p>\n\n<hr>\n<h2>Introdução à Segurança de Software</h2>\n\n<p>A segurança de software é um aspecto crítico do desenvolvimento moderno. Com o aumento de ataques cibernéticos e regulamentações como LGPD e GDPR, garantir que suas aplicações sejam seguras não é mais opcional - é uma necessidade de negócios.</p>\n\n<h3>Estatísticas Alarmantes</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Dado</th><th>Porcentagem</th></tr>\n<tr><td>Ataques direcionados a apps web</td><td>40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de todos os ataques</td></tr>\n<tr><td>Cust médio de violação de dados</td><td>R$ 6.4 milhões</td></tr>\n<tr><td>Tempo médio para detectar breach</td><td>207 dias</td></tr>\n<tr><td>apps com vulnerabilidades críticas</td><td>47{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>OWASP Top 10 presente em</td><td>94{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das apps</td></tr>\n</table></figure>\n\n<hr>\n<h2>OWASP Top 10: As Maiores Vulnerabilidades</h2>\n\n<p>O OWASP Top 10 é o guia definitivo das vulnerabilidades mais críticas em aplicações web. Vamos explorar cada uma.</p>\n\n<h3>A01 - Broken Access Control (Controle de Acesso Quebrado)</h3>\n\n<p><strong>Descrição:</strong> Usuários podem executar ações além de suas permissões permitidas.</p>\n\n<p><strong>Exemplos:</strong><br><pre><code># VULNERÁVEL - IDOR (Insecure Direct Object Reference)<br>@app.route(\'/pedidos/\')<br>def get_pedido(id):<br>    # Não verifica se o pedido pertence ao usuário logado<br>    return Pedido.query.get(id)</p>\n\n<p># SEGURO<br>@app.route(\'/pedidos/\')<br>@login_required<br>def get_pedido(id):<br>    pedido = Pedido.query.filter_by(<br>        id=id, <br>        usuario_id=current_user.id<br>    ).first_or_404()<br>    return pedido<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><br><ul><li>Implementar autorização em cada camada</li><ol><li>Negar por padrão</li><br><li>Usar IDs aleatórios (UUID)</li><br><li>Log de acessos</li><br></ol><br><h3>A02 - Cryptographic Failures (Falhas Criptográficas)</h3></p>\n\n<p><strong>Descrição:</strong> Exposição de dados sensíveis devido a criptografia inadequada.</p>\n\n<p><strong>Exemplos:</strong><br><pre><code># VULNERÁVEL<br>senha = \"senha123\"  # Sem hash<br>dados = dados.encode(\"utf-8\")  # Sem criptografia</p>\n\n<p># SEGURO<br>from cryptography.fernet import Fernet</p>\n\n<p># Gerar chave (armazenar em segurança!)<br>key = Fernet.generate_key()<br>cipher = Fernet(key)</p>\n\n<p>senha_hash = bcrypt.hashpw(\"senha123\".encode(), bcrypt.gensalt())<br>dados_criptografados = cipher.encrypt(dados)<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>Usar criptografia forte (AES-256, bcrypt, Argon2)</li><br><li>Gerenciar chaves com Key Vault</li><br><li>TLS para dados em trânsito</li><br><li>Nunca hardcodar secrets</li><br></ol><br><h3>A03 - Injection (Injeção)</h3></p>\n\n<p><strong>Descrição:</strong> Injeção de código malicioso através de inputs não sanitizados.</p>\n\n<p><strong>Exemplos:</strong></p>\n\n<pre><code>-- SQL Injection Vulnerável\ncursor.execute(f\"SELECT * FROM users WHERE email = \'{email}\'\")\n\n<p>-- SQL Injection Seguro<br>cursor.execute(\"SELECT * FROM users WHERE email = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s\", (email,))<br></code></pre></p>\n\n<pre><code># Command Injection Vulnerável\nos.system(f\"ping {host}\")\n\n<p># Command Injection Seguro<br>import subprocess<br>subprocess.run([\"ping\", host])  # Lista, não string!<br></code></pre></p>\n\n<pre><code>// XSS Vulnerável\ndocument.getElementById(\'comment\').innerHTML = userInput;\n\n<p>// XSS Seguro<br>document.getElementById(\'comment\').textContent = userInput;<br>// ou<br>element.textContent = sanitizeHTML(userInput);<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>Sanitizar e validar inputs</li><br><li>Usar ORM ou queries parametrizadas</li><br><li>Escapar outputs</li><br><li>Content Security Policy (CSP)</li><br></ol><br><h3>A04 - Insecure Design (Design Inseguro)</h3></p>\n\n<p><strong>Descrição:</strong> Arquitetura e modelagem de sistema com falhas de segurança inerentes.</p>\n\n<p><strong>Mitigação:</strong><ol><li>Threat modeling na fase de design</li><br><li>Segregar recursos por criticidade</li><br><li>Limitar tentativas de login (rate limiting)</li><br><li>Princípio de menor privilégio</li><br></ol><br><h3>A05 - Security Misconfiguration (Configuração de Segurança)</h3></p>\n\n<p><strong>Exemplos:</strong><br><pre><code># Docker vulnerável<br>docker run -p 80:80 -v /:/root image:latest</p>\n\n<p># Docker seguro<br>docker run <br>  --read-only <br>  --no-new-privileges <br>  -p 8080:8080 <br>  --cap-drop ALL <br>  image:latest<br></code></pre></p>\n\n<pre><code># Flask vulnerável\napp = Flask(__name__)\napp.debug = True  # Reveals code in errors!\n\n<p># Flask seguro<br>app = Flask(__name__)<br>app.config[\'DEBUG\'] = False<br>app.config[\'PROPAGATE_EXCEPTIONS\'] = False<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>Hardening de servidores</li><br><li>Revisão de configurações</li><br><li>Automação de patching</li><br><li>Arquitetura minimalista</li><br></ol><br><h3>A06 - Vulnerable and Outdated Components (Componentes Vulneráveis)</h3></p>\n\n<p><strong>Mitigação:</strong><br><pre><code># Verificar dependências vulneráveis<br>pip install safety<br>safety check</p>\n\n<p># npm audit<br>npm audit</p>\n\n<p># OWASP Dependency-Check<br>dependency-check --project App --scan ./lib<br></code></pre></p>\n\n<pre><code># GitHub Actions - Verificar vulnerabilidades em PR<ol><li>name: Run Snyk Security Test</li>\n</ol>  uses: snyk/actions/python@master\n  with:\n    args: --severity-threshold=high\n  env:\n    SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}\n</code></pre>\n\n<h3>A07 - Identification and Authentication Failures</h3>\n\n<pre><code># Vulnerável - Sem rate limiting\n@app.route(\'/login\', methods=[\'POST\'])\ndef login():\n    user = User.query.filter_by(email=email).first()\n    if bcrypt.checkpw(password, user.password_hash):\n        login_user(user)\n        return redirect(\'/dashboard\')\n\n<p># Seguro - Com rate limiting<br>from flask_limiter import Limiter<br>limiter = Limiter(app)</p>\n\n<p>@app.route(\'/login\', methods=[\'POST\'])<br>@limiter.limit(\"5 per minute\")<br>def login():<br>    # ... resto do código<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>MFA (Autenticação Multifator)</li><br><li>Rate limiting em autenticação</li><br><li>Senhas complexas (passphrase &gt; senha)</li><br><li>Sessões com timeout</li><br></ol><br><h3>A08 - Software and Data Integrity Failures</h3></p>\n\n<pre><code># GitHub Actions - Verificar integridade de dependências<ol><li>name: Verify checksums</li>\n</ol>  run: |\n    echo \"$CHECKSUM\" &gt; expected_checksum.txt\n    sha256sum -c expected_checksum.txt\n  env:\n    CHECKSUM: ${{ secrets.CHECKSUM }}\n</code></pre>\n\n<p><strong>Mitigação:</strong><ol><li>Verificar integridade de dependências</li><br><li>Assinar artefatos</li><br><li>CI/CD com aprovações</li><br><li>Não confiar em dados não verificados</li><br></ol><br><h3>A09 - Security Logging and Monitoring Failures</h3></p>\n\n<pre><code>import logging\nfrom flask import request\n\n<p>logger = logging.getLogger(__name__)</p>\n\n<p>@app.before_request<br>def log_request():<br>    logger.info({<br>        \'ip\': request.remote_addr,<br>        \'method\': request.method,<br>        \'path\': request.path,<br>        \'user_agent\': request.headers.get(\'User-Agent\')<br>    })</p>\n\n<p>@app.route(\'/login\', methods=[\'POST\'])<br>def login():<br>    if failed_login(user):<br>        logger.warning({<br>            \'event\': \'failed_login\',<br>            \'email\': request.form.get(\'email\'),<br>            \'ip\': request.remote_addr,<br>            \'attempts\': get_attempts(request.remote_addr)<br>        })<br>        # Alertar se muitas tentativas<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>Logging de todos os eventos de segurança</li><br><li>Monitoramento 24/7</li><br><li>Alertas para anomalias</li><br><li>Retenção de logs adequada</li><br></ol><br><h3>A10 - Server-Side Request Forgery (SSRF)</h3></p>\n\n<pre><code># Vulnerável\n@app.route(\'/fetch_url\')\ndef fetch_url():\n    url = request.args.get(\'url\')\n    response = requests.get(url)  # Pode acessar internamente!\n    return response.text\n\n<p># Seguro<br>from urllib.parse import urlparse</p>\n\n<p>ALLOWED_HOSTS = [\'api.exemplo.com\', \'cdn.exemplo.com\']</p>\n\n<p>@app.route(\'/fetch_url\')<br>def fetch_url():<br>    url = request.args.get(\'url\')<br>    parsed = urlparse(url)</p>\n\n<p>if parsed.hostname not in ALLOWED_HOSTS:<br>        abort(403)</p>\n\n<p># Block private IPs<br>    if parsed.hostname in [\'localhost\', \'127.0.0.1\', \'0.0.0.0\']:<br>        abort(403)</p>\n\n<p>return requests.get(url).text<br></code></pre></p>\n\n<hr>\n<h2>Ferramentas de Teste de Segurança</h2>\n\n<h3>SAST - Static Application Security Testing</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Linguagem</th><th>Tipo</th><th>Custo</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Multi</td><td>Self-hosted</td><td>Grátis/Enterprise</td></tr>\n<tr><td><strong>Snyk Code</strong></td><td>Multi</td><td>Cloud</td><td>Grátis/Pro</td></tr>\n<tr><td><strong>Semgrep</strong></td><td>Multi</td><td>CLI</td><td>Grátis</td></tr>\n<tr><td><strong>Checkmarx</strong></td><td>Multi</td><td>Enterprise</td><td>Comercial</td></tr>\n<tr><td><strong>Fortify</strong></td><td>Multi</td><td>Enterprise</td><td>Comercial</td></tr>\n</table></figure>\n\n<h3>DAST - Dynamic Application Security Testing</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Custo</th></tr>\n<tr><td><strong>OWASP ZAP</strong></td><td>Open Source</td><td>Grátis</td></tr>\n<tr><td><strong>Burp Suite</strong></td><td>Freemium</td><td>$399+/ano</td></tr>\n<tr><td><strong>Acunetix</strong></td><td>Commercial</td><td>Sob consulta</td></tr>\n<tr><td><strong>Netsparker</strong></td><td>Commercial</td><td>Sob consulta</td></tr>\n</table></figure>\n\n<h3>SCA - Software Composition Analysis</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Custo</th></tr>\n<tr><td><strong>Snyk</strong></td><td>Dependencies</td><td>Grátis/Pro</td></tr>\n<tr><td><strong>OWASP Dep-Check</strong></td><td>Dependencies</td><td>Grátis</td></tr>\n<tr><td><strong>WhiteSource</strong></td><td>Enterprise</td><td>Comercial</td></tr>\n<tr><td><strong>FOSSA</strong></td><td>License compliance</td><td>Grátis/Pro</td></tr>\n</table></figure>\n\n<h3>IAST - Interactive Application Security Testing</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th></tr>\n<tr><td><strong>Contrast Security</strong></td><td>Commercial</td></tr>\n<tr><td><strong>Hdiv</strong></td><td>Commercial</td></tr>\n<tr><td><strong>Seeker</strong> (Synopsys)</td><td>Commercial</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando Testes de Segurança no CI/CD</h2>\n\n<h3>GitHub Actions - Pipeline de Segurança</h3>\n\n<pre><code>name: Security Pipeline\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  sast:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Semgrep<br>        uses: returntocorp/semgrep-action@v1<br>        with:<br>          config: &gt;<br>            p/owasp-top-ten<br>            p/nodejs-scan</p>\n\n<p>- name: SonarCloud Scan<br>        uses: SonarSource/sonarcloud-github-action@master<br>        env:<br>          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}</p>\n\n<p>sca:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Snyk<br>        uses: snyk/actions/python@master<br>        with:<br>          args: --severity-threshold=high</p>\n\n<p>dast:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Start application<br>        run: docker-compose up -d</p>\n\n<p>- name: OWASP ZAP Scan<br>        uses: zaproxy/action-baseline@v0.9.0<br>        with:<br>          target: \'https://localhost:8443\'<br>          rules_rules_name: \'api-scan\'<br></code></pre></p>\n\n<hr>\n<h2>Penetration Testing</h2>\n\n<h3>Metodologia OWASP</h3>\n\n<pre><code>1. Information Gathering\n   - Footprinting\n   - Enumeration\n   <ol><li>Threat Modeling</li>\n</ol>   - Identify assets\n   - Analyze threats\n   <ol><li>Vulnerability Analysis</li>\n</ol>   - Automated scanning\n   - Manual testing\n   <ol><li>Exploitation</li>\n</ol>   - Proof of concept\n   - Impact assessment\n   <ol><li>Reporting</li>\n</ol>   - Findings\n   - Recommendations\n   - Remediation\n</code></pre>\n\n<h3>Tipos de Pentest</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo</th><th>Conhecimento</th><th>Escopo</th><th>Custo</th></tr>\n<tr><td><strong>Black Box</strong></td><td>Zero</td><td>Sem informação</td><td>$$$</td></tr>\n<tr><td><strong>Gray Box</strong></td><td>Parcial</td><td>Credenciais limitadas</td><td>$$$$</td></tr>\n<tr><td><strong>White Box</strong></td><td>Total</td><td>Código e documentação</td><td>$$$$$</td></tr>\n</table></figure>\n\n<h3>Ferramentas de Pentest</h3>\n\n<pre><code># Reconhecimento\nnmap -sV -sC target.com\nsubfinder -d target.com\namass enum -passive -d target.com\n\n<p># Scanning<br>nikto -h https://target.com<br>sqlmap -u \"https://target.com/api?id=1\"<br>XSStrike -u \"https://target.com/search?q=test\"</p>\n\n<p># Exploitation<br>metasploit framework<br>burp suite professional<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Segurança de software é responsabilidade de todos. Implementar testes de segurança de forma integrada ao ciclo de desenvolvimento é essencial para reduzir riscos e proteger dados sensíveis.</p>\n\n<p><strong>Resumo:</strong><ol><li>OWASP Top 10 deve ser training obrigatório</li><br><li>SAST/DAST/SCA integrados ao CI/CD</li><br><li>Pentests periódicos são essenciais</li><br><li>Nunca confie em inputs de usuários</li><br><li>Criptografia forte é não negociável</li></ol></ul></p>\n\n<hr>\n<h3>FAQ</h3>\n\n<p><strong>P: Com que frequência devo fazer pentests?</strong>  <br>R: Mínimo annually, idealmente a cada 6 meses ou após grandes mudanças.</p>\n\n<p><strong>P: SAST substitui DAST?</strong>  <br>R: Não. SAST analisa código, DAST testa aplicação em execução. São complementares.</p>\n\n<p><strong>P: Como começar com segurança em devs?</strong>  <br>R: Treinamento OWASP Top 10, implementar SAST no CI/CD, secure code review.</p>\n\n<p><strong>P: Bug bounty substitui pentest?</strong>  <br>R: Não. São complementares. Bug bounty encontra issues em produção, pentest é controlado.</p>', 'Testes de Segurança: OWASP, Penetration Testing e Análise de Vulnerabilidades', '', 'inherit', 'closed', 'closed', '', '186-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '186', 'http://localhost:8082/ideiasti/?p=416', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('417', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Descubra como integrar QA no DevOps: CI/CD pipelines, quality gates, automação de testes em pipeline e métricas de qualidade para equipes DevOps modernas.</p>\n\n<hr>\n<h2>A Evolução de QA para DevOps</h2>\n\n<p>DevOps representa a fusão de desenvolvimento e operações, com QA como ponte essencial entre os dois mundos. A qualidade não é mais uma fase separada, mas um valor integrado em cada etapa do pipeline.</p>\n\n<h3>Transformação Cultural</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tradicional</th><th>DevOps</th></tr>\n<tr><td>QA como gatekeeper</td><td>QA como habilitador</td></tr>\n<tr><td>Testes no final</td><td>Testes contínuos</td></tr>\n<tr><td>Releases trimestrais</td><td>Deploys diários</td></tr>\n<tr><td>Siloed teams</td><td>Squads multifuncionais</td></tr>\n<tr><td>Reativo</td><td>Proativo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Pipeline de CI/CD com Qualidade Integrada</h2>\n\n<h3>Visão Geral do Pipeline</h3>\n\n<pre><code>Code → Build → Test → Security → Deploy → Monitor → Feedback\n  ↓      ↓       ↓       ↓          ↓         ↓         ↓\nCommit  Unit   Integration  SAST/DAST  Staging  APM     Retrospectiva\nReview  Tests   + E2E       SCA        Deploy   Alerts\n</code></pre>\n\n<h3>Estrutura do Pipeline</h3>\n\n<h4>1. Stage: Code (Commit)</h4>\n\n<pre><code># .github/workflows/code-quality.yml\nname: Code Quality\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  lint:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Set up Python<br>        uses: actions/setup-python@v5<br>        with:<br>          python-version: \'3.11\'</p>\n\n<p>- name: Install linters<br>        run: pip install ruff black flake8</p>\n\n<p>- name: Run Ruff (Linter)<br>        run: ruff check .</p>\n\n<p>- name: Run Black (Formatter)<br>        run: black --check .</p>\n\n<p>- name: Run type checker<br>        run: pip install mypy &amp;&amp; mypy src/<br></code></pre></p>\n\n<h4>2. Stage: Build</h4>\n\n<pre><code>  build:\n    needs: lint\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n<p>- name: Build Docker image<br>        run: |<br>          docker build <br>            --tag app:${{ github.sha }} <br>            --tag app:latest <br>            .</p>\n\n<p>- name: Run Trivy (Container scan)<br>        uses: aquasecurity/trivy-action@master<br>        with:<br>          image-ref: \'app:${{ github.sha }}\'<br>          format: \'sarif\'<br>          output: \'trivy-results.sarif\'<br></code></pre></p>\n\n<h4>3. Stage: Unit Tests</h4>\n\n<pre><code>  unit-tests:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n<p>- name: Run Unit Tests<br>        run: |<br>          docker-compose run --rm test pytest <br>            --cov=src <br>            --cov-report=xml <br>            --cov-fail-under=80</p>\n\n<p>- name: Upload coverage<br>        uses: codecov/codecov-action@v3<br></code></pre></p>\n\n<h4>4. Stage: Integration Tests</h4>\n\n<pre><code>  integration-tests:\n    runs-on: ubuntu-latest\n    services:\n      postgres:\n        image: postgres:15\n        env:\n          POSTGRES_DB: test\n          POSTGRES_USER: test\n          POSTGRES_PASSWORD: test\n        options: &gt;-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 5432:5432\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Integration Tests<br>        env:<br>          DATABASE_URL: postgresql://test:test@localhost:5432/test<br>        run: |<br>          docker-compose run --rm test pytest <br>            tests/integration/ <br>            -v <br>            --tb=short<br></code></pre></p>\n\n<h4>5. Stage: E2E Tests</h4>\n\n<pre><code>  e2e-tests:\n    runs-on: ubuntu-latest\n    if: github.event_name == \'push\'\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run E2E Tests<br>        run: |<br>          npm ci<br>          npx playwright install --with-deps<br>          npm run test:e2e</p>\n\n<p>- name: Upload test results<br>        uses: actions/upload-artifact@v4<br>        if: always()<br>        with:<br>          name: playwright-report<br>          path: playwright-report/<br></code></pre></p>\n\n<h4>6. Stage: Security Scan</h4>\n\n<pre><code>  security:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n<p>- name: SAST with Semgrep<br>        uses: returntocorp/semgrep-action@v1</p>\n\n<p>- name: SCA with Snyk<br>        uses: snyk/actions/python@master<br>        with:<br>          args: --severity-threshold=high</p>\n\n<p>- name: DAST with OWASP ZAP<br>        run: |<br>          docker run -t owasp/zap2docker-stable <br>            zap-baseline.py <br>            -t https://staging.exemplo.com <br>            -J zap-results.json<br></code></pre></p>\n\n<h4>7. Stage: Deploy (Quality Gates)</h4>\n\n<pre><code>  deploy-staging:\n    needs: [security, e2e-tests]\n    runs-on: ubuntu-latest\n    environment: staging\n\n<p>steps:<br>      - name: Deploy to Staging<br>        run: |<br>          kubectl apply -f k8s/staging/</p>\n\n<p>- name: Smoke Tests<br>        run: |<br>          curl -f https://staging.exemplo.com/health || exit 1</p>\n\n<p>- name: Notify<br>        run: |<br>          echo \"Deploy concluído para staging\"<br></code></pre></p>\n\n<hr>\n<h2>Quality Gates</h2>\n\n<p>Quality Gates são pontos de verificação que determinam se o código pode avançar no pipeline.</p>\n\n<h3>Critérios de Quality Gate</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Gate</th><th>Critério</th><th>Ação se Falhar</th></tr>\n<tr><td><strong>Code Coverage</strong></td><td>&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>Blocker</td></tr>\n<tr><td><strong>Code Quality</strong></td><td>No critical issues</td><td>Blocker</td></tr>\n<tr><td><strong>Security Scan</strong></td><td>No high/critical CVEs</td><td>Blocker</td></tr>\n<tr><td><strong>Unit Tests</strong></td><td>100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} passing</td><td>Blocker</td></tr>\n<tr><td><strong>E2E Tests</strong></td><td>&gt;95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} passing</td><td>Blocker</td></tr>\n<tr><td><strong>Performance</strong></td><td>P95 &lt; 500ms</td><td>Warning</td></tr>\n</table></figure>\n\n<h3>Implementação de Quality Gates</h3>\n\n<pre><code># Quality Gate no GitHub Actions\n<ul><li>name: Check Quality Gates</li></ul>\n  run: |\n    # Verificar cobertura\n    COVERAGE=$(cat coverage/coverage.xml | grep -oP \'(?&lt;=line-covered=&quot;)d+&#039;)\n    TOTAL=$(cat coverage/coverage.xml | grep -oP &#039;(?&lt;=line-count=&quot;)d+&#039;)\n    PERCENTAGE=$((COVERAGE * 100 / TOTAL))\n\n<p>echo \"Coverage: ${PERCENTAGE}{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</p>\n\n<p>if [ $PERCENTAGE -lt 80 ]; then<br>      echo \"❌ Coverage below 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br>      exit 1<br>    fi</p>\n\n<p># Verificar security<br>    if [ -f \"snyk/snyk.sarif\" ]; then<br>      VULNS=$(cat snyk/snyk.sarif | grep -c \"high|critical\")<br>      if [ $VULNS -gt 0 ]; then<br>        echo \"❌ Security vulnerabilities found\"<br>        exit 1<br>      fi<br>    fi</p>\n\n<p>echo \"✅ All quality gates passed\"<br></code></pre></p>\n\n<hr>\n<h2>TestContainers para Testes de Integração</h2>\n\n<pre><code># testcontainers_example.py\nimport pytest\nfrom selenium import webdriver\nfrom selenium.webdriver.common.by import By\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\n\n<p>@pytest.fixture(scope=\"class\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as postgres:<br>        url = postgres.get_connection_url()<br>        yield url</p>\n\n<p>@pytest.fixture(scope=\"class\")<br>def redis():<br>    with RedisContainer(\"redis:7\") as redis:<br>        yield redis.get_connection_url()</p>\n\n<p>@pytest.fixture(scope=\"class\")<br>def app(postgres, redis):<br>    \"\"\"SUT com dependências reais\"\"\"<br>    import os<br>    os.environ[\'DATABASE_URL\'] = postgres<br>    os.environ[\'REDIS_URL\'] = redis</p>\n\n<p>from app import create_app<br>    app = create_app()<br>    app.config[\'TESTING\'] = True</p>\n\n<p>with app.app_context():<br>        from models import db<br>        db.create_all()</p>\n\n<p>yield app</p>\n\n<p>@pytest.fixture<br>def client(app):<br>    return app.test_client()<br></code></pre></p>\n\n<hr>\n<h2>Métricas DevOps de Qualidade</h2>\n\n<h3>Four Keys (DORA Metrics)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Descrição</th><th>Target Elite</th></tr>\n<tr><td><strong>Deployment Frequency</strong></td><td>Frequência de deploys</td><td>On-demand (várias vezes/dia)</td></tr>\n<tr><td><strong>Lead Time for Changes</strong></td><td>Tempo do commit ao prod</td><td>&lt;1 hora</td></tr>\n<tr><td><strong>Time to Restore</strong></td><td>Tempo para recovery</td><td>&lt;1 hora</td></tr>\n<tr><td><strong>Change Failure Rate</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de deploys com falha</td><td>&lt;15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n</table></figure>\n\n<h3>Dashboard de Qualidade</h3>\n\n<pre><code># Métricas para Grafana\npanels:\n  - title: \"Test Coverage\"\n    query: \"coverage_percentage{job=\'unit-tests\'}\"\n    thresholds:\n      - value: 80\n        color: green\n      - value: 60\n        color: yellow\n      - value: 0\n        color: red\n\n<p>- title: \"Test Pass Rate\"<br>    query: \"rate(test_passed_total[5m]) / rate(test_total[5m])\"<br>    thresholds:<br>      - value: 0.95<br>        color: green</p>\n\n<p>- title: \"Pipeline Duration\"<br>    query: \"histogram_quantile(0.95, pipeline_duration_bucket)\"<br>    unit: \"s\"</p>\n\n<p>- title: \"Failed Deployments\"<br>    query: \"rate(deployment_failed_total[1h])\"<br></code></pre></p>\n\n<hr>\n<h2>Estratégia de Deploy</h2>\n\n<h3>Canary Deployment</h3>\n\n<pre><code># Argo Rollouts Canary\napiVersion: argoproj.io/v1alpha1\nkind: Rollout\nmetadata:\n  name: my-app\nspec:\n  strategy:\n    canary:\n      steps:\n        - setWeight: 5\n        - pause: {duration: 10m}\n        - setWeight: 20\n        - pause: {duration: 10m}\n        - setWeight: 50\n        - pause: {duration: 30m}\n      analysis:\n        templates:\n          - templateName: success-rate\n        args:\n          - name: service-name\n            value: my-app-canary\n</code></pre>\n\n<h3>Feature Flags</h3>\n\n<pre><code># Feature Flags com LaunchDarkly\nimport launchdarkly_server_sdk\n\n<p>client = launchdarkly_server_sdk.Client(\"sdk-key\")</p>\n\n<p>user = {<br>    \"key\": user_id,<br>    \"email\": email,<br>    \"custom\": {<br>        \"team\": team<br>    }<br>}</p>\n\n<p># Check feature flag<br>if client.variation(\"new_checkout\", user, False):<br>    return new_checkout_flow()<br>else:<br>    return legacy_checkout_flow()<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Integrar QA no DevOps não é apenas sobre ferramentas - é uma mudança cultural. As chaves para o sucesso são:<br><ol><li><strong>Automação em primeiro lugar</strong> - Tudo que pode ser automatizado deve</li><br><li><strong>Quality Gates efetivos</strong> - Critérios claros para avanzar</li><br><li><strong>Feedback rápido</strong> - Detectar problemas cedo</li><br><li><strong>Métricas de qualidade</strong> - Medir é melhorar</li><br><li><strong>Melhoria contínua</strong> - Retrospectivas e ajustes</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Como começar a integrar QA em DevOps?</strong>  <br>R: Comece com unit tests no CI, depois expanda para integração e E2E gradualmente.</p>\n\n<p><strong>P: Quantos testes devo ter no pipeline?</strong>  <br>R: Priorize por impacto e risco. Cobertura &gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} é bom target.</p>\n\n<p><strong>P: Quality Gates devem ser obrigatórios?</strong>  <br>R: Para código em main, sim. Para feature branches, podem ser warnings.</p>\n\n<p><strong>P: Como medir ROI de DevOps QA?</strong>  <br>R: DORA metrics + redução de bugs em produção + tempo economizado.</p>', 'DevOps e QA: Integrando Qualidade no Pipeline de Entrega Contínua', '', 'inherit', 'closed', 'closed', '', '187-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '187', 'http://localhost:8082/ideiasti/?p=417', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('418', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a testar aplicativos mobile: Appium, Espresso, XCTest, testes emulators vs dispositivos reais, e automação mobile para iOS e Android.</p>\n\n<hr>\n<h2>Introdução aos Testes Mobile</h2>\n\n<p>Testar aplicativos mobile apresenta desafios únicos: múltiplas versões de OS, diferentes tamanhos de tela, conectividade variável e interação touch. Uma estratégia de teste mobile eficaz deve cobrir dispositivos, plataformas e condições de uso diversas.</p>\n\n<h3>Panorama Mobile</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Dado</th><th>Valor</th></tr>\n<tr><td>Apps disponíveis</td><td>6.5+ milhões</td></tr>\n<tr><td>Tempo médio em apps</td><td>4.8 horas/dia</td></tr>\n<tr><td>Usuários mobile</td><td>7.33 bilhões</td></tr>\n<tr><td>Fragmentação Android</td><td>24.000+ dispositivos</td></tr>\n<tr><td>iOS versions ativas</td><td>4-5 simultâneas</td></tr>\n</table></figure>\n\n<hr>\n<h2>Estratégia de Testes Mobile</h2>\n\n<h3>Pirâmide de Testes Mobile</h3>\n\n<pre><code>              /\n             /           E2E Tests\n            /____        (10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\n           /             Funcionalidade completa\n          /              em dispositivos reais\n         /__________\n        /               Integration Tests\n       /______________  (20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\n      /                 Componentes e módulos\n     /__________________\n    /                     Unit Tests\n   /______________________ (70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\n   Componentes e lógica\n</code></pre>\n\n<h3>Dispositivos: Emuladores vs. Reais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Aspecto</th><th>Emuladores</th><th>Dispositivos Reais</th></tr>\n<tr><td><strong>Custo</strong></td><td>Grátis</td><td>Dispositivos físicos</td></tr>\n<tr><td><strong>Velocidade</strong></td><td>Mais lentos</td><td>Mais rápidos</td></tr>\n<tr><td><strong>Acurácia</strong></td><td>Limitada</td><td>Real</td></tr>\n<tr><td><strong>Hardware</strong></td><td>CPU/RAM limitados</td><td>Real performance</td></tr>\n<tr><td><strong>Sensores</strong></td><td>Simulados</td><td>Reais (GPS, câmera)</td></tr>\n<tr><td><strong>Rede</strong></td><td>Controlável</td><td>Real, variável</td></tr>\n</table></figure>\n\n<p><strong>Recomendação:</strong> Usar ambos - emuladores para CI/rapidez, dispositivos reais para QA final.</p>\n\n<hr>\n<h2>Ferramentas de Teste Mobile</h2>\n\n<h3>1. Appium - Cross-Platform</h3>\n\n<p><strong>Melhor para:</strong> Testes cross-platform (iOS + Android) com uma codebase.</p>\n\n<h4>Instalação</h4>\n\n<pre><code># macOS com Homebrew\nbrew install node\nnpm install -g appium\nnpm install -g appium-doctor\nappium &amp;\n</code></pre>\n\n<h4>Configuração Android</h4>\n\n<pre><code># SDK Android\nexport ANDROID_HOME=~/Android/Sdk\nexport PATH=$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools\n\n<p># Start emulador<br>$ANDROID_HOME/emulator/emulator -avd Pixel_6_API_33<br></code></pre></p>\n\n<h4>Script Appium (Python)</h4>\n\n<pre><code>from appium import webdriver\nfrom appium.webdriver.common.appiumby import AppiumBy\nfrom appium.webdriver.common.touch_action import TouchAction\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n<p>class TestApp:<br>    @pytest.fixture<br>    def driver(self):<br>        capabilities = {<br>            \"platformName\": \"Android\",<br>            \"deviceName\": \"Pixel_6_API_33\",<br>            \"app\": \"/path/to/app.apk\",<br>            \"automationName\": \"UiAutomator2\",<br>            \"autoGrantPermissions\": True<br>        }</p>\n\n<p>driver = webdriver.Remote(<br>            \"http://localhost:4723/wd/hub\",<br>            capabilities<br>        )<br>        yield driver<br>        driver.quit()</p>\n\n<p>def test_login_flow(self, driver):<br>        # Aguardar elementos<br>        wait = WebDriverWait(driver, 10)</p>\n\n<p># Clicar no campo email<br>        email_field = wait.until(<br>            EC.presence_of_element_located(<br>                (AppiumBy.ANDROID_UIAUTOMATOR, \'resourceId(\"com.app:id/email\")\')<br>            )<br>        )<br>        email_field.send_keys(\"usuario@test.com\")</p>\n\n<p># Clicar no campo senha<br>        driver.find_element(<br>            AppiumBy.ANDROID_UIAUTOMATOR,<br>            \'resourceId(\"com.app:id/password\")\'<br>        ).send_keys(\"senha123\")</p>\n\n<p># Clicar em Login<br>        driver.find_element(<br>            AppiumBy.ANDROID_UIAUTOMATOR,<br>            \'text(\"Entrar\")\'<br>        ).click()</p>\n\n<p># Verificar redirecionamento para dashboard<br>        wait.until(<br>            EC.presence_of_element_located(<br>                (AppiumBy.ANDROID_UIAUTOMATOR, \'text(\"Dashboard\")\')<br>            )<br>        )</p>\n\n<p>def test_swipe_gesture(self, driver):<br>        # Obter tamanho da tela<br>        size = driver.get_window_size()<br>        start_x = size[\'width\'] * 0.5<br>        start_y = size[\'height\'] * 0.8<br>        end_y = size[\'height\'] * 0.2</p>\n\n<p># Swipe up<br>        TouchAction(driver).press(start_x, start_y).move_to(0, -500).release().perform()</p>\n\n<p>def test_scroll_to_element(self, driver):<br>        # Scroll até encontrar elemento<br>        driver.find_element(<br>            AppiumBy.ANDROID_UIAUTOMATOR,<br>            \'new UiScrollable(new UiSelector()).scrollIntoView(text(\"Settings\"))\'<br>        )<br></code></pre></p>\n\n<h3>2. Espresso - Android Nativo</h3>\n\n<p><strong>Melhor para:</strong> Projetos Android com Kotlin/Java.</p>\n\n<h4>Dependências (build.gradle)</h4>\n\n<pre><code>androidTestImplementation \'androidx.test.espresso:espresso-core:3.5.1\'\nandroidTestImplementation \'androidx.test:runner:1.5.2\'\nandroidTestImplementation \'androidx.test:rules:1.5.0\'\n</code></pre>\n\n<h4>Script Espresso (Kotlin)</h4>\n\n<pre><code>package com.example.app\n\n<p>import androidx.test.ext.junit.rules.ActivityScenarioRule<br>import androidx.test.ext.junit.runners.AndroidJUnit4<br>import androidx.test.filters.LargeTest<br>import org.junit.Rule<br>import org.junit.Test<br>import org.junit.runner.RunWith<br>import static androidx.test.espresso.Espresso.*<br>import static androidx.test.espresso.action.ViewActions.*<br>import static androidx.test.espresso.assertion.ViewAssertions.*<br>import static androidx.test.espresso.matcher.ViewMatchers.*</p>\n\n<p>@RunWith(AndroidJUnit4::class)<br>@LargeTest<br>class LoginTest {</p>\n\n<p>@get:Rule<br>    val activityRule = ActivityScenarioRule(LoginActivity::class.java)</p>\n\n<p>@Test<br>    fun testLoginWithValidCredentials() {<br>        // Preencher email<br>        onView(withId(R.id.email_input))<br>            .perform(typeText(\"usuario@test.com\"), closeSoftKeyboard())</p>\n\n<p>// Preencher senha<br>        onView(withId(R.id.password_input))<br>            .perform(typeText(\"senha123\"), closeSoftKeyboard())</p>\n\n<p>// Clicar em Login<br>        onView(withId(R.id.login_button))<br>            .perform(click())</p>\n\n<p>// Verificar navegação para Dashboard<br>        onView(withId(R.id.dashboard_title))<br>            .check(matches(isDisplayed()))<br>    }</p>\n\n<p>@Test<br>    fun testLoginWithInvalidCredentials() {<br>        onView(withId(R.id.email_input))<br>            .perform(typeText(\"invalido@test.com\"))<br>            .perform(typeText(\"senhaerrada\"), closeSoftKeyboard())</p>\n\n<p>onView(withId(R.id.login_button)).perform(click())</p>\n\n<p>// Verificar mensagem de erro<br>        onView(withId(R.id.error_message))<br>            .check(matches(withText(\"Credenciais inválidas\")))<br>    }</p>\n\n<p>@Test<br>    fun testScrollThroughList() {<br>        // Scroll down<br>        onView(withId(R.id.product_list))<br>            .perform(<br>                RecyclerViewActions.scrollTo(<br>                    hasDescendant(withText(\"Product 50\"))<br>                )<br>            )</p>\n\n<p>// Clicar no item<br>        onView(withText(\"Product 50\"))<br>            .perform(click())<br>    }<br>}<br></code></pre></p>\n\n<h3>3. XCTest - iOS Nativo</h3>\n\n<p><strong>Melhor para:</strong> Projetos iOS com Swift/Objective-C.</p>\n\n<h4>Script XCTest (Swift)</h4>\n\n<pre><code>import XCTest\n\n<p>class LoginTests: XCTestCase {</p>\n\n<p>var app: XCUIApplication!</p>\n\n<p>override func setUp() {<br>        super.setUp()<br>        continueAfterFailure = false<br>        app = XCUIApplication()<br>        app.launchArguments = [\"--uitesting\"]<br>        app.launch()<br>    }</p>\n\n<p>func testLoginWithValidCredentials() {<br>        // Acessar campos<br>        let emailField = app.textFields[\"email_input\"]<br>        let passwordField = app.secureTextFields[\"password_input\"]<br>        let loginButton = app.buttons[\"login_button\"]</p>\n\n<p>// Preencher credenciais<br>        emailField.tap()<br>        emailField.typeText(\"usuario@test.com\")</p>\n\n<p>passwordField.tap()<br>        passwordField.typeText(\"senha123\")</p>\n\n<p>// Clicar em Login<br>        loginButton.tap()</p>\n\n<p>// Verificar Dashboard<br>        XCTAssertTrue(<br>            app.staticTexts[\"dashboard_title\"].waitForExistence(timeout: 5)<br>        )<br>    }</p>\n\n<p>func testPullToRefresh() {<br>        // Encontrar UITableView<br>        let tableView = app.tables[\"product_list\"]</p>\n\n<p>// Pull to refresh<br>        let firstCell = tableView.cells.element(boundBy: 0)<br>        let cellCenter = firstCell.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0))<br>        let pullPoint = cellCenter.withOffset(CGVector(dx: 0, dy: -100))</p>\n\n<p>cellCenter.press(forDuration: 0, thenDragTo: pullPoint)</p>\n\n<p>// Verificar refresh indicator<br>        XCTAssertTrue(app.activityIndicators[\"refresh_indicator\"].exists)<br>    }</p>\n\n<p>func testSwipeToDelete() {<br>        let tableView = app.tables[\"product_list\"]<br>        let cell = tableView.cells.element(boundBy: 0)</p>\n\n<p>// Swipe left<br>        cell.swipeLeft()</p>\n\n<p>// Clicar em Delete<br>        app.buttons[\"delete_button\"].tap()</p>\n\n<p>// Verificar confirmação<br>        app.alerts[\"Confirma exclusão?\"].buttons[\"Excluir\"].tap()<br>    }<br>}<br></code></pre></p>\n\n<hr>\n<h2>Testes em Dispositivos Reais</h2>\n\n<h3>Serviços de Cloud Testing</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Serviço</th><th>Dispositivos</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>BrowserStack</strong></td><td>3000+</td><td>$29+/mês</td><td>Cobertura completa</td></tr>\n<tr><td><strong>Sauce Labs</strong></td><td>1000+</td><td>$39+/mês</td><td>Enterprise</td></tr>\n<tr><td><strong>AWS Device Farm</strong></td><td>数百</td><td>Sob demanda</td><td>AWS integration</td></tr>\n<tr><td><strong>Firebase Test Lab</strong></td><td>数百</td><td>Pay-per-use</td><td>Android focused</td></tr>\n</table></figure>\n\n<h3>Setup BrowserStack</h3>\n\n<pre><code># pytest + BrowserStack\nfrom appium import webdriver\n\n<p>def get_browserstack_driver():<br>    desired_caps = {<br>        \"platformName\": \"android\",<br>        \"deviceName\": \"Samsung Galaxy S23\",<br>        \"os_version\": \"13.0\",<br>        \"app\": \"bs://APP_ID\",<br>        \"browserstack.user\": \"USER\",<br>        \"browserstack.key\": \"ACCESS_KEY\",<br>        \"browserstack.debug\": True,<br>        \"browserstack.networkLogs\": True<br>    }</p>\n\n<p>return webdriver.Remote(<br>        \"http://hub-cloud.browserstack.com/wd/hub\",<br>        desired_caps<br>    )<br></code></pre></p>\n\n<hr>\n<h2>Cenários de Teste Mobile</h2>\n\n<h3>1. Testes de Interface</h3>\n\n<pre><code>def test_responsividade_telas():\n    \"\"\"Testa layouts em diferentes tamanhos de tela\"\"\"\n    sizes = [\n        (360, 640),  # Small phone\n        (390, 844),  # iPhone 12/13\n        (412, 915),  # Large phone\n        (600, 1024), # Tablet portrait\n    ]\n\n<p>for width, height in sizes:<br>        driver.execute_script(f\"setWindowSize({width}, {height})\")</p>\n\n<p># Verificar elementos não se sobrepõem<br>        assert not elements_overlap(header, footer)<br>        assert text_is_readable(header)<br></code></pre></p>\n\n<h3>2. Testes de Conectividade</h3>\n\n<pre><code>def test_offline_mode():\n    \"\"\"Testa comportamento sem internet\"\"\"\n    # Desligar rede\n    driver.set_network_connection(0)  # Airplane mode\n\n<p># Tentar acessar conteúdo offline<br>    assert app.has_cached_content()<br>    assert app.can_show_cached_products()</p>\n\n<p># Tentar ação que requer internet<br>    with pytest.raises(NetworkError):<br>        app.submit_order()</p>\n\n<p># Reconectar<br>    driver.set_network_connection(6)  # WiFi</p>\n\n<p># Sincronizar<br>    app.sync_pending_orders()<br>    assert order.was_synced()<br></code></pre></p>\n\n<h3>3. Testes de Performance</h3>\n\n<pre><code>@Test\nfun testListScrollPerformance() {\n    val recyclerView = espresso.onView(\n        withId(R.id.product_list)\n    )\n\n<p>// Medir FPS durante scroll<br>    val monitor = FrameMetricsMonitor()</p>\n\n<p>recyclerView.perform(<br>        scrollToPosition(100),<br>        scrollToPosition(50),<br>        scrollToPosition(0)<br>    )</p>\n\n<p>val metrics = monitor.getMetrics()</p>\n\n<p>// Verificar 60 FPS (16.67ms por frame)<br>    assertThat(metrics.averageFrameTime).isLessThan(20.0)<br>    assertThat(metrics.droppedFrames).isLessThan(5)<br>}<br></code></pre></p>\n\n<hr>\n<h2>Appium + CI/CD</h2>\n\n<h3>GitHub Actions</h3>\n\n<pre><code>name: Mobile Tests\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  android-tests:<br>    runs-on: macos-latest</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Java<br>        uses: actions/setup-java@v4<br>        with:<br>          java-version: \'17\'</p>\n\n<p>- name: Setup Android SDK<br>        uses: android-actions/setup-android@v2</p>\n\n<p>- name: Cache Appium<br>        uses: actions/cache@v3<br>        with:<br>          path: node_modules<br>          key: ${{ runner.os }}-appium</p>\n\n<p>- name: Install Dependencies<br>        run: |<br>          npm ci<br>          pip install pytest pytest-appium</p>\n\n<p>- name: Run Tests on BrowserStack<br>        env:<br>          BROWSERSTACK_USER: ${{ secrets.BS_USER }}<br>          BROWSERSTACK_KEY: ${{ secrets.BS_KEY }}<br>        run: |<br>          pytest tests/mobile/ <br>            --device=\"Samsung Galaxy S23\" <br>            --platform=\"Android 13\" <br>            --hub=\"http://hub.browserstack.com/wd/hub\"<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes mobile requerem estratégia bem definida cobrindo múltiplas plataformas, dispositivos e condições. As chaves para sucesso são:<br><ol><li><strong>Automação estratégica</strong> - Appium para cross-platform, nativo para performance</li><br><li><strong>Device matrix</strong> - Priorizar por uso real</li><br><li><strong>CI/CD integrado</strong> - Testes em cloud para escalabilidade</li><br><li><strong>Performance monitorada</strong> - FPS, memória, bateria</li><br><li><strong>Testes de condições reais</strong> - Offline, network switching</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Appium é mais lento que Espresso/XCTest?</strong>  <br>R: Sim, mas permite código único para iOS e Android.</p>\n\n<p><strong>P: Quantos dispositivos testar?</strong>  <br>R: Foque nos top 10-20 dispositivos por mercado (iOS, Android).</p>\n\n<p><strong>P: Como testar notificações push?</strong>  <br>R: Use emuladores para automação, dispositivos reais para validação final.</p>\n\n<p><strong>P: Testes mobile podem ser 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} automatizados?</strong>  <br>R: Não. Alguns testes (usabilidade, exploratory) requerem testers humanos.</p>', 'Testes Mobile: Guia Completo para Apps iOS e Android', '', 'inherit', 'closed', 'closed', '', '188-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '188', 'http://localhost:8082/ideiasti/?p=418', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('419', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda TDD do zero: ciclo Red-Green-Refactor, baby steps, mocks e práticas essenciais para escrever código testável e robusto.</p>\n\n<hr>\n<h2>O Que é TDD?</h2>\n\n<p>Test-Driven Development (TDD) é uma metodologia de desenvolvimento onde você escreve os testes antes do código de produção. O ciclo é simples: Red (falha), Green (passa), Refactor (melhora).</p>\n\n<h3>Ciclo Red-Green-Refactor</h3>\n\n<pre><code>    RED              GREEN            REFACTOR\n     ↓                ↓                 ↓\n┌─────────┐     ┌─────────┐      ┌─────────────┐\n│Escreva  │     │Faça o   │      │Melhore o    │\n│o teste  │ →   │código   │ →    │código sem   │\n│que      │     │mínimo   │      │mudar o      │\n│falha    │     │passar   │      │comportamento│\n└─────────┘     └─────────┘      └─────────────┘\n     ↑                                   │\n     └───────────────────────────────────┘\n                 (Repetir)\n</code></pre>\n\n<hr>\n<h2>Por Que TDD?</h2>\n\n<h3>Benefícios Quantificados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Com TDD</th><th>Sem TDD</th></tr>\n<tr><td>Defeitos em produção</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos</td><td>Baseline</td></tr>\n<tr><td>Cobertura de testes</td><td>90-100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>20-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Confiança em refactoring</td><td>Alta</td><td>Baixa</td></tr>\n<tr><td>Tempo de debugging</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos</td><td>Baseline</td></tr>\n<tr><td>Custo de manutenção</td><td>40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menor</td><td>Baseline</td></tr>\n</table></figure>\n\n<h3>Quando Usar TDD</h3>\n\n<p><strong>TDD BRILHA quando:</strong><br><ul><li>Algoritmos complexos</li><ol><li>APIs e bibliotecas</li><br><li>Refactoring de código legado</li><br><li>Código compartilhado</li><br><li>Requisitos claros</li><br></ol><br><strong>TDD é mais difícil quando:</strong><ol><li>UI layouts complexos</li><br><li>Exploratory features</li><br><li>Requisitos muito instáveis</li><br><li>Prototipagem rápida</li><br></ol><br><hr><br><h2>TDD em Diferentes Linguagens</h2></p>\n\n<h3>Python com pytest</h3>\n\n<pre><code># 1. RED - Escrever teste que falha\nimport pytest\n\n<p>def test_somar_dois_numeros_positivos():<br>    # Dado<br>    a = 2<br>    b = 3</p>\n\n<p># Quando<br>    resultado = somar(a, b)</p>\n\n<p># Então<br>    assert resultado == 5</p>\n\n<p># 2. GREEN - Implementar código mínimo<br>def somar(a, b):<br>    return 5  # Hardcoded para fazer passar</p>\n\n<p># 3. REFACTOR - Implementar corretamente<br>def somar(a, b):<br>    return a + b<br></code></pre></p>\n\n<h3>Exemplo Completo: Calculadora de Desconto</h3>\n\n<h4>RED - Testes Iniciais</h4>\n\n<pre><code># tests/test_desconto.py\nimport pytest\nfrom desconto import CalculadoraDesconto\n\n<p>class TestCalculadoraDesconto:<br>    def setup_method(self):<br>        self.calc = CalculadoraDesconto()</p>\n\n<p>def test_desconto_de_10_porcento(self):<br>        \"\"\"Cliente com 10 compras recebe 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de desconto\"\"\"<br>        resultado = self.calc.calcular(valor=100, quantidade_compras=10)<br>        assert resultado == 90</p>\n\n<p>def test_desconto_de_20_porcento(self):<br>        \"\"\"Cliente com 20 compras recebe 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de desconto\"\"\"<br>        resultado = self.calc.calcular(valor=100, quantidade_compras=20)<br>        assert resultado == 80</p>\n\n<p>def test_sem_desconto(self):<br>        \"\"\"Cliente novo (0 compras) não recebe desconto\"\"\"<br>        resultado = self.calc.calcular(valor=100, quantidade_compras=0)<br>        assert resultado == 100</p>\n\n<p>def test_desconto_maximo_de_30_porcento(self):<br>        \"\"\"Cliente VIP (50+ compras) recebe no máximo 30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\"\"<br>        resultado = self.calc.calcular(valor=100, quantidade_compras=100)<br>        assert resultado == 70</p>\n\n<p>def test_valor_negativo_deve_falhar(self):<br>        \"\"\"Valor negativo deve lançar exceção\"\"\"<br>        with pytest.raises(ValueError):<br>            self.calc.calcular(valor=-100, quantidade_compras=10)</p>\n\n<p>@pytest.mark.parametrize(\"valor,compras,esperado\", [<br>        (100, 5, 100),   # Sem desconto<br>        (100, 10, 90),   # 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>        (100, 20, 80),   # 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>        (100, 50, 70),   # 30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>        (200, 10, 180),  # 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em valor maior<br>    ])<br>    def test_parametrizado(self, valor, compras, esperado):<br>        resultado = self.calc.calcular(valor=valor, quantidade_compras=compras)<br>        assert resultado == esperado<br></code></pre></p>\n\n<h4>GREEN - Implementação Mínima</h4>\n\n<pre><code># desconto.py\nclass CalculadoraDesconto:\n    def calcular(self, valor, quantidade_compras):\n        if valor &lt; 0:\n            raise ValueError(&quot;Valor não pode ser negativo&quot;)\n\n<p>if quantidade_compras &gt;= 50:<br>            desconto = 0.30<br>        elif quantidade_compras &gt;= 20:<br>            desconto = 0.20<br>        elif quantidade_compras &gt;= 10:<br>            desconto = 0.10<br>        else:<br>            desconto = 0</p>\n\n<p>return valor * (1 - desconto)<br></code></pre></p>\n\n<h4>REFACTOR - Melhorias</h4>\n\n<pre><code># desconto.py (refatorado)\nfrom dataclasses import dataclass\n\n<p>@dataclass<br>class RegraDesconto:<br>    min_compras: int<br>    max_compras: int | None<br>    percentual: float</p>\n\n<p>REGRAS = [<br>    RegraDesconto(min_compras=50, max_compras=None, percentual=30),<br>    RegraDesconto(min_compras=20, max_compras=49, percentual=20),<br>    RegraDesconto(min_compras=10, max_compras=19, percentual=10),<br>]</p>\n\n<p>class CalculadoraDesconto:<br>    def calcular(self, valor: float, quantidade_compras: int) -&gt; float:<br>        if valor &lt; 0:<br>            raise ValueError(\"Valor não pode ser negativo\")</p>\n\n<p>for regra in REGRAS:<br>            if quantidade_compras &gt;= regra.min_compras:<br>                if regra.max_compras is None or quantidade_compras &lt;= regra.max_compras:<br>                    return valor * (1 - regra.percentual / 100)</p>\n\n<p>return valor<br></code></pre></p>\n\n<h3>JavaScript com Jest</h3>\n\n<pre><code>// 1. RED - Testes\ndescribe(\'CalculadoraFrete\', () =&gt; {\n  const calculadora = new CalculadoraFrete();\n\n<p>test(\'frete para SP capital\', () =&gt; {<br>    expect(calculadora.calcular(\'SP\', \'São Paulo\')).toBe(15.90);<br>  });</p>\n\n<p>test(\'frete para RJ\', () =&gt; {<br>    expect(calculadora.calcular(\'RJ\', \'Rio de Janeiro\')).toBe(20.00);<br>  });</p>\n\n<p>test(\'frete para outros estados\', () =&gt; {<br>    expect(calculadora.calcular(\'MG\', \'Belo Horizonte\')).toBe(30.00);<br>  });</p>\n\n<p>test(\'frete grátis para SP com compra &gt; 200\', () =&gt; {<br>    expect(calculadora.calcular(\'SP\', \'São Paulo\', 250)).toBe(0);<br>  });<br>});</p>\n\n<p>// 2. GREEN - Implementação<br>class CalculadoraFrete {<br>  calcular(estado, cidade, valorCompra = 0) {<br>    if (estado === \'SP\' &amp;&amp; valorCompra &gt; 200) return 0;<br>    if (estado === \'SP\') return 15.90;<br>    if (estado === \'RJ\') return 20.00;<br>    return 30.00;<br>  }<br>}<br></code></pre></p>\n\n<h3>Java com JUnit 5</h3>\n\n<pre><code>// Teste\nclass CarrinhoTest {\n\n<p>@Test<br>    void deveCalcularTotalComDesconto() {<br>        // Given<br>        Carrinho carrinho = new Carrinho();<br>        carrinho.adicionar(new Produto(\"Camiseta\", 50.00, 2));<br>        carrinho.adicionar(new Produto(\"Calça\", 100.00, 1));</p>\n\n<p>// When<br>        double total = carrinho.calcularTotal();</p>\n\n<p>// Then<br>        assertEquals(200.00, total, 0.01);<br>    }</p>\n\n<p>@Test<br>    void deveAplicarCupomDesconto() {<br>        // Given<br>        Carrinho carrinho = new Carrinho();<br>        carrinho.adicionar(new Produto(\"Camiseta\", 100.00, 1));</p>\n\n<p>// When<br>        carrinho.aplicarCupom(new Cupom(\"DESCONTO10\", 10));<br>        double total = carrinho.calcularTotal();</p>\n\n<p>// Then<br>        assertEquals(90.00, total, 0.01);<br>    }</p>\n\n<p>@ParameterizedTest<br>    @CsvSource({<br>        \"100, 10, 90\",<br>        \"200, 10, 180\",<br>        \"100, 20, 80\"<br>    })<br>    void deveCalcularComDescontoParametrizado(<br>        double valor, double desconto, double esperado<br>    ) {<br>        Carrinho carrinho = new Carrinho();<br>        carrinho.adicionar(new Produto(\"Item\", valor, 1));<br>        carrinho.aplicarCupom(new Cupom(\"TESTE\", desconto));</p>\n\n<p>assertEquals(esperado, carrinho.calcularTotal(), 0.01);<br>    }<br>}<br></code></pre></p>\n\n<hr>\n<h2>Baby Steps: Implementação Incremental</h2>\n\n<h3>Exemplo: Fibonacci</h3>\n\n<pre><code># Passo 1: O menor teste possível\ndef test_fibonacci_0():\n    assert fibonacci(0) == 0\n\n<p># Implementação mínima<br>def fibonacci(n):<br>    return 0</p>\n\n<p># Passo 2: Segundo valor<br>def test_fibonacci_1():<br>    assert fibonacci(1) == 1</p>\n\n<p>def fibonacci(n):<br>    if n == 0:<br>        return 0<br>    return 1  # Ainda não está correto!</p>\n\n<p># Passo 3: Terceiro valor<br>def test_fibonacci_2():<br>    assert fibonacci(2) == 1</p>\n\n<p># GREEN: Implementação correta (forma recursiva)<br>def fibonacci(n):<br>    if n &lt;= 0:<br>        return 0<br>    if n == 1:<br>        return 1<br>    return fibonacci(n - 1) + fibonacci(n - 2)</p>\n\n<p># GREEN: Implementação melhor (forma iterativa)<br>def fibonacci(n):<br>    if n &lt;= 0:<br>        return 0<br>    if n == 1:<br>        return 1</p>\n\n<p>a, b = 0, 1<br>    for _ in range(2, n + 1):<br>        a, b = b, a + b<br>    return b<br></code></pre></p>\n\n<hr>\n<h2>Mocks e Stubs</h2>\n\n<h3>Por Que Usar Mocks?</h3>\n\n<p>Mocks são essenciais para:<ol><li>Isolar unidade sob teste</li><br><li>Simular dependências externas</li><br><li>Controlar cenários de teste</li><br><li>Aumentar velocidade dos testes</li></ol></ul></p>\n\n<h3>Exemplo: Service com Dependência</h3>\n\n<pre><code># 1. Teste com mock\nfrom unittest.mock import Mock, patch\n\n<p>def test_pedido_service_cria_pedido_com_sucesso():<br>    # Given<br>    email_service = Mock()<br>    email_service.enviar = Mock(return_value=True)</p>\n\n<p>payment_gateway = Mock()<br>    payment_gateway.cobrar = Mock(return_value={<br>        \"status\": \"approved\",<br>        \"transaction_id\": \"tx_123\"<br>    })</p>\n\n<p>repository = Mock()<br>    repository.salvar = Mock(return_value=1)</p>\n\n<p>service = PedidoService(<br>        email_service=email_service,<br>        payment_gateway=payment_gateway,<br>        repository=repository<br>    )</p>\n\n<p># When<br>    resultado = service.criar_pedido(<br>        cliente_id=1,<br>        itens=[{\"produto_id\": 1, \"quantidade\": 2}],<br>        forma_pagamento=\"credit_card\"<br>    )</p>\n\n<p># Then<br>    assert resultado[\"status\"] == \"confirmed\"<br>    assert resultado[\"pedido_id\"] == 1</p>\n\n<p># Verificar chamadas<br>    payment_gateway.cobrar.assert_called_once()<br>    repository.salvar.assert_called_once()<br>    email_service.enviar.assert_called_once()<br></code></pre></p>\n\n<h3>Spy vs Mock vs Stub</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo</th><th>Comportamento</th><th>Uso</th></tr>\n<tr><td><strong>Stub</strong></td><td>Respostas pré-programadas</td><td>Fornecer dados</td></tr>\n<tr><td><strong>Mock</strong></td><td>Comportamento verificado</td><td>Verificar interações</td></tr>\n<tr><td><strong>Spy</strong></td><td>Wrapper do real + verificação</td><td>Comportamento real + verificação</td></tr>\n</table></figure>\n\n<pre><code># Stub\nrepository = Mock()\nrepository.buscar_por_id = Mock(return_value={\"id\": 1, \"nome\": \"Produto\"})\n\n<p># Spy (usando wraps)<br>with patch(\'app.repository\') as mock_repo:<br>    mock_repo.buscar_por_id.return_value = {\"id\": 1}</p>\n\n<p>service = MyService(mock_repo)<br>    service.algum_metodo()</p>\n\n<p># Verificar que foi chamado<br>    mock_repo.buscar_por_id.assert_called_once_with(1)<br></code></pre></p>\n\n<hr>\n<h2>TDD em Prática: Kata de String Calculator</h2>\n\n<h3>Requisitos</h3>\n<ol><li>Criar calculadora que recebe string vazia retorna 0</li>\n<li>Recebe \"1\" retorna 1</li>\n<li>Recebe \"1,2\" retorna 3</li>\n<li>Recebe \"1n2,3\" retorna 6</li>\n<li>Suporta delimitador customizado \"//;n1;2\" retorna 3</li>\n</ol>\n<h3>Solução TDD</h3>\n\n<pre><code># Step 1: String vazia\ndef test_string_vazia_retorna_zero():\n    assert string_calculator(\"\") == 0\n\n<p>def string_calculator(numbers):<br>    return 0</p>\n\n<p># Step 2: Um número<br>def test_um_numero():<br>    assert string_calculator(\"1\") == 1</p>\n\n<p>def string_calculator(numbers):<br>    if not numbers:<br>        return 0<br>    return int(numbers)</p>\n\n<p># Step 3: Dois números separados por vírgula<br>def test_dois_numeros():<br>    assert string_calculator(\"1,2\") == 3</p>\n\n<p>def string_calculator(numbers):<br>    if not numbers:<br>        return 0<br>    return sum(int(n) for n in numbers.split(\',\'))</p>\n\n<p># Step 4: Múltiplos números<br>def test_multiplos_numeros():<br>    assert string_calculator(\"1,2,3,4,5\") == 15</p>\n\n<p>def string_calculator(numbers):<br>    if not numbers:<br>        return 0<br>    delimiters = [\',\', \'n\']<br>    parts = numbers.replace(\'n\', \',\')<br>    return sum(int(n) for n in parts.split(\',\'))</p>\n\n<p># Step 5: Delimitador customizado<br>def test_delimitador_customizado():<br>    assert string_calculator(\"//;n1;2;3\") == 6</p>\n\n<p>def string_calculator(numbers):<br>    if not numbers:<br>        return 0</p>\n\n<p># Detectar delimitador customizado<br>    if numbers.startswith(\'//\'):<br>        end_header = numbers.index(\'n\')<br>        delimiter = numbers[2:end_header]<br>        numbers = numbers[end_header + 1:]<br>        numbers = numbers.replace(delimiter, \',\')</p>\n\n<p>return sum(int(n) for n in numbers.replace(\'n\', \',\').split(\',\'))<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>TDD é mais que escrever testes primeiro - é uma filosofia de design que resulta em código mais limpo, testável e manutenível. As chaves para dominar TDD são:<br><ol><li><strong>Prática constante</strong> - Katas diárias</li><br><li><strong>Baby steps</strong> - Pequenas iterações</li><br><li><strong>Feedback rápido</strong> - Execução de testes rápida</li><br><li><strong>Disciplina</strong> - Não pule etapas</li><br><li><strong>Paciência</strong> - Curva de aprendizado é íngreme no início</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: TDD funciona para todos os projetos?</strong>  <br>R: Não. É excelente para lógica de negócio, APIs. Menos para UI exploratória ou protótipos.</p>\n\n<p><strong>P: Como começar com TDD?</strong>  <br>R: Pratique com katas (String Calculator, Bowling Game, Tennis Refactoring) diariamente.</p>\n\n<p><strong>P: TDD não ralent development?</strong>  <br>R: No curto prazo parece mais lento, mas reduz significativamente bugs e tempo de debugging.</p>\n\n<p><strong>P: Posso usar TDD com legacy code?</strong>  <br>R: Sim! Comece com characterization tests, depois refatore一点点 com testes.</p>', 'Test-Driven Development (TDD): Guia Prático para Implementação', '', 'inherit', 'closed', 'closed', '', '189-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '189', 'http://localhost:8082/ideiasti/?p=419', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('420', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda BDD: Gherkin, Cucumber, Behave, e como implementar desenvolvimento guiado por comportamento para equipes ágeis.</p>\n\n<hr>\n<h2>O Que é BDD?</h2>\n\n<p>Behavior-Driven Development (BDD) é uma evolução do TDD que foca na colaboração entre desenvolvedores, QA e negócios. BDD usa linguagem natural (Gherkin) para descrever comportamentos de software, tornando requisitos mais acessíveis a todos.</p>\n\n<h3>A História do BDD</h3>\n\n<pre><code>2003: Dan North cria \"JBehave\" (Java)\n2006: Ruby implementation \"Cucumber\" (Aslak Hellesøy)\n2008: GoBehave para Python\n2012: Cucumber-JVM\nHoje: Gherkin é padrão indústria\n</code></pre>\n\n<hr>\n<h2>Gherkin: A Linguagem de BDD</h2>\n\n<h3>Estrutura Básica</h3>\n\n<pre><code># language: pt\nFuncionalidade: Título da funcionalidade\n  Como um [ator]\n  Quero [ação]\n  Para [benefício]\n\n<p>Contexto: [precondições]<br>    Dado [estado inicial]<br>    E [mais estados]</p>\n\n<p>Cenário: [nome do cenário]<br>    Quando [ação]<br>    E [mais ações]<br>    Então [resultado esperado]<br>    E [mais resultados]</p>\n\n<p>Cenário: [outro cenário]<br>    ...<br></code></pre></p>\n\n<h3>Palavras-Chave Gherkin</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Keyword</th><th>Uso</th></tr>\n<tr><td><code>Funcionalidade</code> (Feature)</td><td>Agrupa cenários relacionados</td></tr>\n<tr><td><code>Contexto</code> (Background)</td><td>Precondições comuns</td></tr>\n<tr><td><code>Cenário</code> (Scenario)</td><td>Caso de uso específico</td></tr>\n<tr><td><code>Dado</code> (Given)</td><td>Pré-condições</td></tr>\n<tr><td><code>Quando</code> (When)</td><td>Ação/evento</td></tr>\n<tr><td><code>Então</code> (Then)</td><td>Resultado esperado</td></tr>\n<tr><td><code>E</code> (And)</td><td>Conjunção</td></tr>\n<tr><td><code>Mas</code> (But)</td><td>Conjunção negativa</td></tr>\n<tr><td><code>Esquema do Cenário</code></td><td>Cenário parametrizado</td></tr>\n<tr><td><code> Exemplos</code> (Examples)</td><td>Dados de teste</td></tr>\n</table></figure>\n\n<h3>Exemplo Completo</h3>\n\n<pre><code># language: pt\nFuncionalidade: Login de Usuário\n  Como um usuário registrado no sistema\n  Quero fazer login com minhas credenciais\n  Para acessar minha conta e visualizar meus dados\n\n<p>Contexto:<br>    Dado que o sistema está operacional<br>    E o usuário \"joao@exemplo.com\" está cadastrado com senha \"Senha@123\"</p>\n\n<p>Cenário: Login com credenciais válidas<br>    Quando eu acesso a página de login<br>    E preencho o campo email com \"joao@exemplo.com\"<br>    E preencho o campo senha com \"Senha@123\"<br>    E clico no botão \"Entrar\"<br>    Então sou redirecionado para o dashboard<br>    E uma mensagem de boas-vindas é exibida<br>    E meu nome \"João Silva\" aparece no cabeçalho</p>\n\n<p>Cenário: Login com senha incorreta<br>    Quando eu acesso a página de login<br>    E preencho o campo email com \"joao@exemplo.com\"<br>    E preencho o campo senha com \"senhaerrada\"<br>    E clico no botão \"Entrar\"<br>    Então permaneço na página de login<br>    E uma mensagem de erro \"Credenciais inválidas\" é exibida<br>    E o campo senha está vazio para nova tentativa</p>\n\n<p>Cenário: Login com email não cadastrado<br>    Quando eu acesso a página de login<br>    E preencho o campo email com \"naoexiste@exemplo.com\"<br>    E preencho o campo senha com \"senha123\"<br>    E clico no botão \"Entrar\"<br>    Então uma mensagem de erro \"Usuário não encontrado\" é exibida</p>\n\n<p>Esquema do Cenário: Bloqueio após múltiplas tentativas<br>    Quando tento fazer login com email \"\" e senha \"\"<br>    E repito este login falho por  vezes<br>    Então minha conta fica bloqueada por  minutos<br>    E uma mensagem \"Conta temporariamente bloqueada\" é exibida</p>\n\n<p>Exemplos:<br>      | email             | senha      | tentativas | minutos |<br>      | joao@exemplo.com  | errada1    | 3          | 30      |<br>      | maria@exemplo.com  | errada2    | 5          | 60      |<br></code></pre></p>\n\n<hr>\n<h2>Cucumber: Implementando BDD</h2>\n\n<h3>Cucumber Architecture</h3>\n\n<pre><code>.feature files (Gherkin)\n        ↓\n   Cucumber Parser\n        ↓\n   Step Definitions (Glue Code)\n        ↓\n   Step Definitions (Java/JS/Python/Ruby)\n        ↓\n   Application Under Test\n</code></pre>\n\n<h3>Cucumber com Java (Spring Boot)</h3>\n\n<h4>Dependências</h4>\n\n<pre><code>\n    io.cucumber\n    cucumber-java\n    7.14.0\n    test\n\n\n    io.cucumber\n    cucumber-spring\n    7.14.0\n    test\n\n\n    io.cucumber\n    cucumber-junit-platform-engine\n    7.14.0\n    test\n\n</code></pre>\n\n<h4>Feature File</h4>\n\n<pre><code># src/test/resources/features/carrinho.feature\nFuncionalidade: Carrinho de Compras\n  Como um cliente do e-commerce\n  Quero adicionar e remover produtos do carrinho\n  Para finalizar minha compra\n\n<p>Contexto:<br>    Dado que estou logado como \"cliente@teste.com\"<br>    E o produto \"Camiseta Azul\" custa R$ 49,90<br>    E o produto \"Calça Jeans\" custa R$ 129,90<br>    E o produto \"Tênis\" custa R$ 199,90</p>\n\n<p>Cenário: Adicionar produto ao carrinho<br>    Quando adiciono \"Camiseta Azul\" ao carrinho<br>    Então o carrinho deve conter 1 item<br>    E o total deve ser R$ 49,90</p>\n\n<p>Cenário: Adicionar múltiplos produtos<br>    Quando adiciono \"Camiseta Azul\" ao carrinho<br>    E adiciono \"Calça Jeans\" ao carrinho<br>    E adiciono \"Tênis\" ao carrinho<br>    Então o carrinho deve conter 3 itens<br>    E o total deve ser R$ 379,70</p>\n\n<p>Cenário: Remover produto do carrinho<br>    Dado que tenho \"Camiseta Azul\" e \"Calça Jeans\" no carrinho<br>    Quando removo \"Camiseta Azul\" do carrinho<br>    Então o carrinho deve conter 1 item<br>    E o total deve ser R$ 129,90<br></code></pre></p>\n\n<h4>Step Definitions</h4>\n\n<pre><code>package steps;\n\n<p>import io.cucumber.java.pt.*;<br>import org.springframework.beans.factory.annotation.Autowired;<br>import static org.junit.jupiter.api.Assertions.*;</p>\n\n<p>class CarrinhoSteps {</p>\n\n<p>@Autowired<br>    private CarrinhoService carrinhoService;</p>\n\n<p>@Autowired<br>    private TestContext testContext;</p>\n\n<p>private Carrinho carrinho;</p>\n\n<p>@Dado(\"que estou logado como {string}\")<br>    public void que_estou_logado_como(String email) {<br>        testContext.setUsuario(email);<br>        carrinho = new Carrinho();<br>    }</p>\n\n<p>@Dado(\"o produto {string} custa R$ {double}\")<br>    public void produto_custa(String nome, double preco) {<br>        // Setup de produto no banco de dados de teste<br>    }</p>\n\n<p>@Quando(\"adiciono {string} ao carrinho\")<br>    public void adiciono_produto_ao_carrinho(String produto) {<br>        carrinho.adicionar(new Item(produto, obterPreco(produto)));<br>    }</p>\n\n<p>@Então(\"o carrinho deve conter {int} item\")<br>    public void carrinho_deve_conter_itens(int quantidade) {<br>        assertEquals(quantidade, carrinho.getItens().size());<br>    }</p>\n\n<p>@Então(\"o total deve ser R$ {double}\")<br>    public void total_deve_ser(double total) {<br>        assertEquals(total, carrinho.getTotal(), 0.01);<br>    }<br>}<br></code></pre></p>\n\n<h3>Cucumber com Python (Behave)</h3>\n\n<h4>Instalação</h4>\n\n<pre><code>pip install behave\n</code></pre>\n\n<h4>Feature File</h4>\n\n<pre><code># features/carrinho.feature\nFuncionalidade: Carrinho de Compras\n  Como um cliente do e-commerce\n  Quero adicionar produtos ao carrinho\n  Para visualizar o total da compra\n\n<p>Cenário: Adicionar produto ao carrinho<br>    Dado que o produto \"Camiseta\" custa 50.00<br>    Quando adiciono o produto ao carrinho<br>    Então o total deve ser 50.00<br></code></pre></p>\n\n<h4>Step Definitions</h4>\n\n<pre><code># features/steps/carrinho_steps.py\nfrom behave import given, when, then\nfrom carrinho import Carrinho\n\n<p>@given(\'o produto \"{nome}\" custa {preco}\')<br>def step_impl(context, nome, preco):<br>    if not hasattr(context, \'produtos\'):<br>        context.produtos = {}<br>    context.produtos[nome] = float(preco.replace(\'.\', \'\').replace(\',\', \'.\'))</p>\n\n<p>@when(\'adiciono o produto ao carrinho\')<br>def step_impl(context):<br>    if not hasattr(context, \'carrinho\'):<br>        context.carrinho = Carrinho()</p>\n\n<p>for nome, preco in context.produtos.items():<br>        context.carrinho.adicionar(nome, preco)</p>\n\n<p>@then(\'o total deve ser {total}\')<br>def step_impl(context, total):<br>    esperado = float(total.replace(\'.\', \'\').replace(\',\', \'.\'))<br>    assert context.carrinho.total == esperado, <br>        f\"Esperado {esperado}, got {context.carrinho.total}\"<br></code></pre></p>\n\n<h4>Runner</h4>\n\n<pre><code># features/environment.py\ndef before_all(context):\n    context.produtos = {}\n    context.carrinho = None\n\n<p>def after_scenario(context, scenario):<br>    # Cleanup<br>    context.produtos = {}<br>    context.carrinho = None<br></code></pre></p>\n\n<hr>\n<h2>BDD em Equipes Ágeis</h2>\n\n<h3>O Ciclo BDD Completo</h3>\n\n<pre><code>   ┌──────────────────────────────────────────────┐\n   │                                              │\n   ▼                                              │\n┌───────┐    ┌─────────┐    ┌──────────┐    ┌─────┴───┐\n│DISCUSS│───▶│EXAMPLES │───▶│AUTOMATE │───▶│IMPLEMENT│\n│   ()  │    │   (O)   │    │   (o)   │    │   (.)   │\n└───────┘    └─────────┘    └──────────┘    └─────────┘\n    ▲                                              │\n    │                                              │\n    └──────────────────────────────────────────────┘\n                    (Feedback)\n</code></pre>\n\n<h3>Reunião de Three Amigos</h3>\n\n<p>A reunião de Three Amigos junta desenvolvedores, QA e product owner para discutir requisitos.</p>\n\n<pre><code># Agenda da Reunião Three Amigos\n\n<h2>Preparação (1 dia antes)</h2>\n<ul><li>PO compartilha user stories</li><ol><li>QA prepara perguntas</li>\n<li>Devs revisam história</li>\n</ol>\n<h2>Reunião (60 minutos)</h2><ol><li>PO apresenta user story (10 min)</li>\n<li>Discussão de requisitos (20 min)</li>\n<li>QA identifica cenários de teste (15 min)</li>\n<li>Devs identificam complexidades (10 min)</li>\n<li>Acordo sobre exemplos concretos (5 min)</li>\n</ol>\n<h2>Output</h2><ol><li>User story com critérios de aceitação claros</li>\n<li>Cenários BDD definidos</li>\n<li>Incertezas documentadas</li>\n</ol></code></pre>\n\n<h3>Exemplo: User Story com BDD</h3>\n\n<pre><code><h2>User Story: RS-123 - Carrinho Abandonado</h2>\n\n<h3>Como</h3>\n  Vendedor do e-commerce\n\n<h3>Eu quero</h3>\n  Receber notificação quando cliente abandonar carrinho\n\n<h3>Para que</h3>\n  Possa entrar em contato e recuperar a venda\n\n<h3>Critérios de Aceitação:</h3><ol><li>[ ] Notificação enviada 30 min após abandono</li>\n<li>[ ] Email inclui produtos abandonados</li>\n<li>[ ] Email inclui link para recuperação</li>\n<li>[ ] Não enviar se cliente já Comprou</li>\n<li>[ ] Rate limit de 1 email por cliente por dia</li></ol></ul>\n\n<h3>Cenários BDD:</h3>\n</code></pre>\n\n<pre><code>Funcionalidade: Carrinho Abandonado\n\n<p>Cenário: Notificação enviada após 30 minutos<br>    Dado que o cliente adicionou produtos ao carrinho<br>    E saiu do site sem Comprar<br>    Quando passam 30 minutos<br>    Então um email de recuperação é enviado</p>\n\n<p>Cenário: Email inclui produtos abandonados<br>    Dado que o cliente abandonou o carrinho com:<br>      | Produto       | Quantidade |<br>      | Camiseta     | 2         |<br>      | Calça Jeans  | 1         |<br>    Quando o email de recuperação é enviado<br>    Então o email lista todos os produtos abandonados</p>\n\n<p>Cenário: Não enviar se cliente Comprou<br>    Dado que o cliente abandonou o carrinho<br>    Mas depois finalizou a compra<br>    Quando passam 30 minutos<br>    Então nenhum email é enviado<br></code></pre></p>\n\n<hr>\n<h2>Boas Práticas em BDD</h2>\n\n<h3>1. Feature Files Bem Estruturados</h3>\n\n<pre><code># BOM: Cenários focados e descritivos\nFuncionalidade: Cálculo de Frete\n  Cenário: Frete para SP capital\n    Dado que o produto custa R$ 100\n    Quando o cliente é de \"SP\" e \"São Paulo\"\n    Então o frete é R$ 15,90\n\n<p># RUIM: Cenário muito genérico<br>Funcionalidade: Frete<br>  Cenário: Teste de frete<br>    Dado que tenho um produto<br>    Quando calculo o frete<br>    Então deve funcionar<br></code></pre></p>\n\n<h3>2. Step Definitions Reutilizáveis</h3>\n\n<pre><code># Defina steps genéricos\n@given(\'que o produto \"{nome}\" custa R$ {preco}\')\ndef step_produto(context, nome, preco):\n    context.produtos[nome] = float(preco)\n\n<p>@when(\'eu adiciono \"{nome}\" ao carrinho\')<br>def step_adicionar(context, nome):<br>    context.carrinho.adicionar(nome, context.produtos[nome])<br></code></pre></p>\n\n<h3>3. Page Objects para Web</h3>\n\n<pre><code># pages/login_page.py\nclass LoginPage:\n    def __init__(self, driver):\n        self.driver = driver\n\n<p>@property<br>    def email_field(self):<br>        return self.driver.find_element(By.ID, \'email\')</p>\n\n<p>@property<br>    def password_field(self):<br>        return self.driver.find_element(By.ID, \'password\')</p>\n\n<p>@property<br>    def login_button(self):<br>        return self.driver.find_element(By.ID, \'login-button\')</p>\n\n<p>def login(self, email, password):<br>        self.email_field.send_keys(email)<br>        self.password_field.send_keys(password)<br>        self.login_button.click()<br></code></pre></p>\n\n<hr>\n<h2>Integração com CI/CD</h2>\n\n<pre><code># GitHub Actions - BDD Tests\nname: BDD Tests\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  bdd-tests:<br>    runs-on: ubuntu-latest</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Python<br>        uses: actions/setup-python@v5<br>        with:<br>          python-version: \'3.11\'</p>\n\n<p>- name: Install dependencies<br>        run: |<br>          pip install behave selenium webdriver-manager</p>\n\n<p>- name: Run BDD tests<br>        run: behave --format=json --outfile=reports/behave.json</p>\n\n<p>- name: Upload reports<br>        uses: actions/upload-artifact@v4<br>        with:<br>          name: cucumber-reports<br>          path: reports/<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>BDD é uma metodologia poderosa que une equipes através de linguagem comum. As chaves para sucesso são:<br><ol><li><strong>Colaboração</strong> - Three Amigos regularmente</li><br><li><strong>Exemplos concretos</strong> - Ao invés de requisitos vagos</li><br><li><strong>Automação</strong> - Transforma cenários em testes executáveis</li><br><li><strong>Documentação viva</strong> - Features são especificação + teste</li><br><li><strong>Feedback rápido</strong> - Ciclos curtos de desenvolvimento</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: BDD substitui TDD?</strong>  <br>R: Não. BDD usa TDD internamente. BDD foca em colaboração, TDD em técnica.</p>\n\n<p><strong>P: Como começar com BDD?</strong>  <br>R: Comece com Three Amigos para definir cenários, depois implemente com Cucumber/Behave.</p>\n\n<p><strong>P: Quantos cenários por feature?</strong>  <br>R: O suficiente para cobrir comportamento. Evite redundância, use Examples para variações.</p>\n\n<p><strong>P: BDD funciona para qualquer projeto?</strong>  <br>R: Melhor para projetos com requisitos claros e colaboração entre negocio e TI.</p>', 'BDD (Behavior-Driven Development): Guia Completo para Equipes Ágeis', '', 'inherit', 'closed', 'closed', '', '190-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '190', 'http://localhost:8082/ideiasti/?p=420', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('421', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Domine testes de API: REST, GraphQL, microservices. Aprenda a usar Postman, RestAssured, pytest e automação de testes de API para garantir qualidade de integrações.</p>\n\n<hr>\n<h2>Introdução aos Testes de API</h2>\n\n<p>APIs (Application Programming Interfaces) são a espinha dorsal da arquitetura moderna de software. Testar APIs de forma eficaz garante que os serviços se comuniquem corretamente, retornem dados esperados e tratem erros apropriadamente.</p>\n\n<h3>Por Que Testar APIs?</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Benefício</th><th>Impacto</th></tr>\n<tr><td><strong>Detecção precoce de bugs</strong></td><td>APIs são gateway para frontend</td></tr>\n<tr><td><strong>Integração confiável</strong></td><td>Microserviços se comunicam via API</td></tr>\n<tr><td><strong>Performance</strong></td><td>API performance afeta toda a aplicação</td></tr>\n<tr><td><strong>Documentação viva</strong></td><td>Contratos de API testados</td></tr>\n<tr><td><strong>Regression testing</strong></td><td>Mudanças não quebram integrações</td></tr>\n</table></figure>\n\n<hr>\n<h2>Tipos de Testes de API</h2>\n\n<h3>1. Testes de Funcionalidade</h3>\n\n<p>Verificam se a API funciona conforme especificado.</p>\n\n<pre><code>import requests\nimport pytest\n\n<p>BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>class TestUsuarioAPI:</p>\n\n<p>def test_criar_usuario(self):<br>        \"\"\"Deve criar usuário com sucesso\"\"\"<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"Senha@123\"<br>        }</p>\n\n<p>response = requests.post(<br>            f\"{BASE_URL}/usuarios\",<br>            json=payload,<br>            headers={\"Content-Type\": \"application/json\"}<br>        )</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data<br>        assert \"senha\" not in data  # Não retorna senha!</p>\n\n<p>def test_criar_usuario_email_duplicado(self):<br>        \"\"\"Deve falhar quando email já existe\"\"\"<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",  # Já existe<br>            \"senha\": \"Senha@123\"<br>        }</p>\n\n<p>response = requests.post(<br>            f\"{BASE_URL}/usuarios\",<br>            json=payload<br>        )</p>\n\n<p>assert response.status_code == 409  # Conflict<br>        assert \"email\" in response.json()[\"erro\"].lower()</p>\n\n<p>def test_buscar_usuario_por_id(self):<br>        \"\"\"Deve retornar usuário existente\"\"\"<br>        response = requests.get(f\"{BASE_URL}/usuarios/1\")</p>\n\n<p>assert response.status_code == 200<br>        data = response.json()<br>        assert data[\"id\"] == 1<br>        assert \"email\" in data</p>\n\n<p>def test_buscar_usuario_inexistente(self):<br>        \"\"\"Deve retornar 404 para usuário inexistente\"\"\"<br>        response = requests.get(f\"{BASE_URL}/usuarios/99999\")</p>\n\n<p>assert response.status_code == 404<br></code></pre></p>\n\n<h3>2. Testes de Contrato</h3>\n\n<p>Verificam se a API está em conformidade com seu contrato (OpenAPI/Swagger).</p>\n\n<pre><code>import pytest\nfrom jsonschema import validate\n\n<p>schema = {<br>    \"type\": \"object\",<br>    \"required\": [\"id\", \"nome\", \"email\"],<br>    \"properties\": {<br>        \"id\": {\"type\": \"integer\"},<br>        \"nome\": {\"type\": \"string\", \"minLength\": 1},<br>        \"email\": {\"type\": \"string\", \"format\": \"email\"}<br>    }<br>}</p>\n\n<p>def test_usuario_response_match_schema():<br>    response = requests.get(f\"{BASE_URL}/usuarios/1\")<br>    data = response.json()</p>\n\n<p>validate(instance=data, schema=schema)<br></code></pre></p>\n\n<h3>3. Testes de Performance</h3>\n\n<pre><code>import time\nimport concurrent.futures\n\n<p>def test_api_response_time():<br>    \"\"\"Tempo de resposta deve ser &lt; 500ms&quot;&quot;&quot;<br>    start = time.time()<br>    response = requests.get(f\"{BASE_URL}/usuarios/1\")<br>    elapsed = (time.time() - start) * 1000</p>\n\n<p>assert response.status_code == 200<br>    assert elapsed &lt; 500, f&quot;Response took {elapsed}ms&quot;</p>\n\n<p>def test_concurrent_requests():<br>    \"\"\"API deve suportar 100 requisições simultâneas\"\"\"<br>    def make_request():<br>        response = requests.get(f\"{BASE_URL}/health\")<br>        return response.status_code == 200</p>\n\n<p>with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:<br>        futures = [executor.submit(make_request) for _ in range(100)]<br>        results = [f.result() for f in concurrent.futures.as_completed(futures)]</p>\n\n<p>success_rate = sum(results) / len(results)<br>    assert success_rate &gt; 0.95, f\"Only {success_rate*100}{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} succeeded\"<br></code></pre></p>\n\n<h3>4. Testes de Segurança</h3>\n\n<pre><code>def test_sql_injection_prevention():\n    \"\"\"API deve prevenir SQL injection\"\"\"\n    payload = {\"email\": \"admin\' OR \'1\'=\'1\"}\n    response = requests.post(f\"{BASE_URL}/usuarios\", json=payload)\n\n<p># Não deve retornar dados sensíveis<br>    assert response.status_code in [400, 422]</p>\n\n<p>def test_xss_in_input(self):<br>    \"\"\"API deve sanitizar inputs\"\"\"<br>    payload = {\"nome\": \"alert(\'xss\')\"}<br>    response = requests.post(f\"{BASE_URL}/usuarios\", json=payload)</p>\n\n<p>if response.status_code == 201:<br>        data = response.json()<br>        assert \"\" not in data[\"nome\"]</p>\n\n<p>def test_rate_limiting(self):<br>    \"\"\"API deve limitar requisições excessivas\"\"\"<br>    responses = []<br>    for _ in range(105):  # Limite é 100<br>        response = requests.get(f\"{BASE_URL}/usuarios/1\")<br>        responses.append(response.status_code)</p>\n\n<p># Últimas 5 devem retornar 429 (Too Many Requests)<br>    assert 429 in responses[-5:]<br></code></pre></p>\n\n<hr>\n<h2>GraphQL: Testando APIs Modernas</h2>\n\n<h3>Queries</h3>\n\n<pre><code>import requests\n\n<p>GRAPHQL_URL = \"https://api.exemplo.com/graphql\"</p>\n\n<p>class TestGraphQL:</p>\n\n<p>def test_query_basica(self):<br>        \"\"\"Deve buscar dados com query GraphQL\"\"\"<br>        query = \"\"\"<br>        query {<br>            usuario(id: 1) {<br>                id<br>                nome<br>                email<br>            }<br>        }<br>        \"\"\"</p>\n\n<p>response = requests.post(<br>            GRAPHQL_URL,<br>            json={\"query\": query}<br>        )</p>\n\n<p>assert response.status_code == 200<br>        data = response.json()<br>        assert \"data\" in data<br>        assert \"usuario\" in data[\"data\"]<br>        assert data[\"data\"][\"usuario\"][\"nome\"]</p>\n\n<p>def test_query_com_parametros(self):<br>        \"\"\"Deve filtrar com argumentos\"\"\"<br>        query = \"\"\"<br>        query($limite: Int) {<br>            produtos(limit: $limite) {<br>                id<br>                nome<br>                preco<br>            }<br>        }<br>        \"\"\"</p>\n\n<p>response = requests.post(<br>            GRAPHQL_URL,<br>            json={<br>                \"query\": query,<br>                \"variables\": {\"limite\": 5}<br>            }<br>        )</p>\n\n<p>data = response.json()<br>        assert len(data[\"data\"][\"produtos\"]) &lt;= 5</p>\n\n<p>def test_mutation_inserir(self):<br>        \"\"\"Deve criar dado com mutation\"\"\"<br>        mutation = \"\"\"<br>        mutation {<br>            criarUsuario(input: {<br>                nome: \"Maria Silva\"<br>                email: \"maria@exemplo.com\"<br>                senha: \"Senha@123\"<br>            }) {<br>                id<br>                nome<br>                email<br>            }<br>        }<br>        \"\"\"</p>\n\n<p>response = requests.post(GRAPHQL_URL, json={\"query\": mutation})</p>\n\n<p>assert response.status_code == 200<br>        data = response.json()<br>        assert \"errors\" not in data<br>        assert data[\"data\"][\"criarUsuario\"][\"nome\"] == \"Maria Silva\"<br></code></pre></p>\n\n<h3>Introspection para Validação</h3>\n\n<pre><code>def test_graphql_introspection():\n    \"\"\"Deve permitir introspection do schema\"\"\"\n    query = \"\"\"\n    {\n        __schema {\n            types {\n                name\n                kind\n            }\n        }\n    }\n    \"\"\"\n\n<p>response = requests.post(GRAPHQL_URL, json={\"query\": query})<br>    data = response.json()</p>\n\n<p>assert \"data\" in data<br>    type_names = [t[\"name\"] for t in data[\"data\"][\"__schema\"][\"types\"]]<br>    assert \"Query\" in type_names<br></code></pre></p>\n\n<hr>\n<h2>Microserviços: Testando em Ambientes Distribuídos</h2>\n\n<h3>Service Mesh Testing</h3>\n\n<pre><code>┌─────────────┐     ┌─────────────┐     ┌─────────────┐\n│   API GW    │────▶│   Auth Svc  │────▶│  User Svc   │\n│   :8080     │     │   :8081     │     │   :8082     │\n└─────────────┘     └─────────────┘     └─────────────┘\n       │                                      │\n       │                                      │\n       ▼                                      ▼\n┌─────────────┐                        ┌─────────────┐\n│   Product   │                        │  Database   │\n│   Svc :8083 │                        │   :5432     │\n└─────────────┘                        └─────────────┘\n</code></pre>\n\n<h3>Testes de Contrato com Pact</h3>\n\n<pre><code># Provider (microserviço de usuários)\nfrom pact import Consumer, Provider\n\n<p>pact = Consumer(\'API-Gateway\').has_pact_with(Provider(\'User-Service\'))<br>pact.start_service()</p>\n\n<p>try:<br>    # Definir expectativas<br>    (pact<br>     .given(\'user with id 1 exists\')<br>     .upon_receiving(\'a request for user 1\')<br>     .with_request(\'GET\', \'/users/1\')<br>     .will_respond_with(200, body={<br>         \'id\': 1,<br>         \'name\': \'Test User\',<br>         \'email\': \'test@example.com\'<br>     })<br>     .verify())</p>\n\n<p># Verificar provider<br>    from pact.matchers import like, Term</p>\n\n<p>(pact<br>     .given(\'user exists\')<br>     .upon_receiving(\'a request for users\')<br>     .with_request(\'GET\', \'/users\')<br>     .will_respond_with(200, body=[<br>         like({<br>             \'id\': 1,<br>             \'name\': Term(\'w+\', \'Test User\'),<br>             \'email\': Term(r\'[w.]+@[w.]+\', \'test@example.com\')<br>         })<br>     ])<br>     .verify())<br>finally:<br>    pact.stop_service()<br></code></pre></p>\n\n<h3>Contrato Consumer-Driven</h3>\n\n<pre><code>// contract.json (gerado pelo consumer)\n{\n  \"consumer\": {\n    \"name\": \"Order-Service\"\n  },\n  \"provider\": {\n    \"name\": \"User-Service\"\n  },\n  \"interactions\": [\n    {\n      \"description\": \"Get user details\",\n      \"request\": {\n        \"method\": \"GET\",\n        \"path\": \"/users/1\"\n      },\n      \"response\": {\n        \"status\": 200,\n        \"body\": {\n          \"id\": 1,\n          \"name\": \"John\",\n          \"email\": \"john@example.com\"\n        }\n      }\n    }\n  ]\n}\n</code></pre>\n\n<h3>TestContainers para Microserviços</h3>\n\n<pre><code>import pytest\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\n\n<p>@pytest.fixture(scope=\"module\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as pg:<br>        yield pg</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def redis():<br>    with RedisContainer(\"redis:7\") as rd:<br>        yield rd</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def user_service(postgres, redis):<br>    with DockerCompose(\".\") as compose:<br>        # Start user-service<br>        compose.exec(\"user-service\", \"python\", \"manage.py\", \"migrate\")<br>        port = compose.expose(\"user-service\", 8080)<br>        yield f\"http://localhost:{port}\"<br></code></pre></p>\n\n<hr>\n<h2>Postman: Collection Runner</h2>\n\n<h3>Collection Structure</h3>\n\n<pre><code>{\n  \"info\": {\n    \"name\": \"E-commerce API\",\n    \"schema\": \"https://schema.getpostman.com/json/collection/v2.1.0/collection.json\"\n  },\n  \"item\": [\n    {\n      \"name\": \"Auth\",\n      \"item\": [\n        {\n          \"name\": \"Login\",\n          \"event\": [\n            {\n              \"listen\": \"test\",\n              \"script\": {\n                \"exec\": [\n                  \"pm.test(\'Status 200\', () =&gt; {\",\n                  \"  pm.response.to.have.status(200);\",\n                  \"});\",\n                  \"pm.test(\'Token received\', () =&gt; {\",\n                  \"  const jsonData = pm.response.json();\",\n                  \"  pm.collectionVariables.set(\'token\', jsonData.token);\",\n                  \"});\"\n                ]\n              }\n            }\n          ],\n          \"request\": {\n            \"method\": \"POST\",\n            \"url\": \"{{baseUrl}}/auth/login\",\n            \"body\": {\n              \"mode\": \"raw\",\n              \"raw\": \"{\"email\":\"test@test.com\",\"password\":\"test123\"}\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"Users\",\n      \"item\": [\n        {\n          \"name\": \"Get All Users\",\n          \"request\": {\n            \"auth\": {\n              \"type\": \"bearer\",\n              \"bearer\": [{\"key\": \"token\", \"value\": \"{{token}}\"}]\n            },\n            \"method\": \"GET\",\n            \"url\": \"{{baseUrl}}/users\"\n          }\n        }\n      ]\n    }\n  ]\n}\n</code></pre>\n\n<h3>Newman CLI</h3>\n\n<pre><code># Executar collection\nnewman run ecommerce-api.postman_collection.json \n  --environment dev.postman_environment.json \n  --reporters html,json \n  --reporter-json-export results.json \n  --reporter-html-export report.html\n\n<p># Com CI/CD<br>newman run collection.json <br>  --environment ${{ secrets.POSTMAN_ENV }} <br>  --iteration-count 1 <br>  --bail<br></code></pre></p>\n\n<hr>\n<h2>Frameworks de Teste de API</h2>\n\n<h3>RestAssured (Java)</h3>\n\n<pre><code>import static io.restassured.RestAssured.*;\nimport static io.restassured.matcher.RestAssuredMatchers.*;\nimport static org.hamcrest.Matchers.*;\n\n<p>class UserApiTest {</p>\n\n<p>@BeforeAll<br>    static void setup() {<br>        RestAssured.baseURI = \"https://api.exemplo.com/v1\";<br>    }</p>\n\n<p>@Test<br>    void criarUsuario() {<br>        given()<br>            .contentType(\"application/json\")<br>            .body(\"\"\"<br>                {<br>                    \"nome\": \"João Silva\",<br>                    \"email\": \"joao@exemplo.com\",<br>                    \"senha\": \"Senha@123\"<br>                }<br>                \"\"\")<br>        .when()<br>            .post(\"/usuarios\")<br>        .then()<br>            .statusCode(201)<br>            .body(\"nome\", equalTo(\"João Silva\"))<br>            .body(\"email\", equalTo(\"joao@exemplo.com\"))<br>            .body(\"id\", notNullValue())<br>            .body(\"senha\", nullValue());<br>    }</p>\n\n<p>@Test<br>    void validarSchema() {<br>        given()<br>            .get(\"/usuarios/1\")<br>        .then()<br>            .statusCode(200)<br>            .body(matchesJsonSchemaInClasspath(\"schemas/usuario.json\"));<br>    }<br>}<br></code></pre></p>\n\n<h3>Pytest + requests</h3>\n\n<pre><code># pytest.ini\n[pytest]\naddopts = -v --tb=short --strict-markers\nmarkers =\n    smoke: Smoke tests\n    integration: Integration tests\n    slow: Slow running tests\n\n<p># conftest.py<br>import pytest<br>import requests</p>\n\n<p>@pytest.fixture<br>def api_client():<br>    class APIClient:<br>        base_url = \"https://api.exemplo.com/v1\"</p>\n\n<p>def __init__(self):<br>            self.session = requests.Session()</p>\n\n<p>def create_user(self, data):<br>            return self.session.post(f\"{self.base_url}/usuarios\", json=data)</p>\n\n<p>def get_user(self, user_id):<br>            return self.session.get(f\"{self.base_url}/usuarios/{user_id}\")</p>\n\n<p>def delete_user(self, user_id):<br>            return self.session.delete(f\"{self.base_url}/usuarios/{user_id}\")</p>\n\n<p>return APIClient()</p>\n\n<p>@pytest.fixture<br>def clean_user(api_client):<br>    \"\"\"Cria usuário para teste e limpa depois\"\"\"<br>    user_data = {<br>        \"nome\": \"Test User\",<br>        \"email\": f\"test_{uuid4()}@exemplo.com\",<br>        \"senha\": \"Senha@123\"<br>    }<br>    response = api_client.create_user(user_data)<br>    user_id = response.json()[\"id\"]</p>\n\n<p>yield user_id</p>\n\n<p># Cleanup<br>    api_client.delete_user(user_id)</p>\n\n<p># test_api.py<br>@pytest.mark.integration<br>def test_criar_e_buscar_usuario(api_client):<br>    # Create<br>    user_data = {\"nome\": \"Test\", \"email\": \"test@ex.com\", \"senha\": \"123\"}<br>    response = api_client.create_user(user_data)<br>    assert response.status_code == 201<br>    user_id = response.json()[\"id\"]</p>\n\n<p># Read<br>    response = api_client.get_user(user_id)<br>    assert response.status_code == 200<br>    assert response.json()[\"nome\"] == \"Test\"<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testar APIs é fundamental para garantir qualidade em arquiteturas modernas. As chaves são:<br><ol><li><strong>Cobertura completa</strong> - Funcional, contrato, performance, segurança</li><br><li><strong>Automação</strong> - CI/CD com collections automatizadas</li><br><li><strong>Contratos</strong> - Consumer-driven contracts para microservices</li><br><li><strong>Isolamento</strong> - TestContainers para dependências</li><br><li><strong>Monitoramento</strong> - API health checks em produção</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Postman substitui testes de código?</strong>  <br>R: Não. Postman é excelente para exploratory e collections, mas testes em código são mais versionáveis e reutilizáveis.</p>\n\n<p><strong>P: Como testar APIs GraphQL?</strong>  <br>R: Use GraphQL client libraries (gql, strawberry) e valide queries, mutations e subscriptions.</p>\n\n<p><strong>P: Contract testing é necessário?</strong>  <br>R: Essencial em microservices. Consumer-driven contracts (Pact) garantem que mudanças não quebram consumidores.</p>\n\n<p><strong>P: Quanto coverage é suficiente?</strong>  <br>R: 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos endpoints críticos, pelo menos 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos endpoints públicos.</p>', 'Testes de API: REST, GraphQL e Microserviços', '', 'inherit', 'closed', 'closed', '', '191-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '191', 'http://localhost:8082/ideiasti/?p=421', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('422', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a testar usabilidade: heurísticas de Nielsen, testes com usuários, análise heurística, e como garantir que seus produtos sejam intuitivos e fáceis de usar.</p>\n\n<hr>\n<h2>Introdução aos Testes de Usabilidade</h2>\n\n<p>Testes de usabilidade avaliam quão fácil e intuitivo é usar um produto. São essenciais para garantir que usuários consigam completar suas tarefas eficientemente, sem frustração.</p>\n\n<h3>Por Que Usabilidade Importa?</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Impacto</th><th>Dado</th></tr>\n<tr><td><strong>Receita</strong></td><td>88{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} desiste após experiência ruim</td></tr>\n<tr><td><strong>Suporte</strong></td><td>Custos de suporte dobram com UX ruim</td></tr>\n<tr><td><strong>Conversão</strong></td><td>UX otimizada = +200{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} conversões</td></tr>\n<tr><td><strong>Retenção</strong></td><td>UX excelente = +90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} retenção</td></tr>\n<tr><td><strong>Brand</strong></td><td>73{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} culpa site pelo abandono</td></tr>\n</table></figure>\n\n<hr>\n<h2>As 10 Heurísticas de Nielsen</h2>\n\n<p>Jakob Nielsen definiu 10 princípios para avaliar usabilidade:</p>\n\n<h3>H1: Visibilidade do Status do Sistema</h3>\n\n<p><strong>Descrição:</strong> O sistema deve manter os usuários informados sobre o que está acontecendo.</p>\n\n<pre><code># BOM - Status visível\n✓ Barra de progresso durante upload\n✓ Indicador de \"Salvando...\"\n✓ Toast notification após ação\n\n<p># RUIM - Sem feedback<br>✗ Tela congelada sem indicator<br>✗ Upload sem progresso<br>✗ Confirmação unclear<br></code></pre></p>\n\n<h3>H2: Correspondência entre Sistema e Mundo Real</h3>\n\n<p><strong>Descrição:</strong> Use linguagem e conceitos familiares ao usuário.</p>\n\n<pre><code># BOM\n✓ Ícones de carrinho, lixeira, envelope\n✓ Labels em português correto\n✓ Jargão do domínio, não técnico\n\n<p># RUIM<br>✗ Códigos internos visíveis ao usuário<br>✗ Mensagens de erro técnicas<br>✗ Nomenclatura inconsistente<br></code></pre></p>\n\n<h3>H3: Controle e Liberdade do Usuário</h3>\n\n<p><strong>Descrição:</strong> Ofereça \"saídas de emergência\" e capacidade de desfazer ações.</p>\n\n<pre><code># BOM\n✓ Botão \"Cancelar\" claro\n✓ Undo/Redo disponíveis\n✓ Navegação consistente (back button)\n✓ Discard/Excluir com confirmação\n\n<p># RUIM<br>✗ Ações sem confirmação<br>✗ Sem como cancelar operação<br>✗ Dead ends na navegação<br></code></pre></p>\n\n<h3>H4: Consistência e Padrões</h3>\n\n<p><strong>Descrição:</strong> Mantenha consistência dentro do produto e com convenções da plataforma.</p>\n\n<pre><code># BOM\n✓ Mesmo estilo de botões\n✓ Terminologia consistente\n✓ Padrões de plataforma (iOS/Android)\n\n<p># RUIM<br>✗ Labels diferentes para mesma ação<br>✗ Cores diferentes para mesmo tipo<br>✗ Posições diferentes de elementos<br></code></pre></p>\n\n<h3>H5: Prevenção de Erros</h3>\n\n<p><strong>Descrição:</strong> Melhor do que mensagens de erro é prevenir que erros aconteçam.</p>\n\n<pre><code># BOM\n✓ Máscara de input (telefone, CPF)\n✓ Autocomplete com sugestões\n✓ Desabilitar botão enquanto processa\n✓ Validação em tempo real\n\n<p># RUIM<br>✗ Form提交 sem validação<br>✗ Botão ativo durante loading<br>✗ Senha sem requisitos visíveis<br></code></pre></p>\n\n<h3>H6: Reconhecimento ao Invés de Memorização</h3>\n\n<p><strong>Descrição:</strong> Torne opções e ações visíveis, sem forçar memorização.</p>\n\n<pre><code># BOM\n✓ Breadcrumbs sempre visíveis\n✓ Menus com ícones + texto\n✓ Histórico de navegação\n✓ Labels descritivos\n\n<p># RUIM<br>✗ Navegação só por atalhos<br>✗ Menu com ícones misteriosos<br>✗ Sem orientação contextual<br></code></pre></p>\n\n<h3>H7: Flexibilidade e Eficiência de Uso</h3>\n\n<p><strong>Descrição:</strong> Acomode usuários iniciantes e avançados.</p>\n\n<pre><code># BOM\n✓ Shortcuts para power users\n✓ Configurações avançadas (ocultas)\n✓ Onboarding para novos\n✓ Customização de interface\n\n<p># RUIM<br>✗ Tudo ou nada<br>✗ Sem atalhos possíveis<br>✗ Interface única para todos<br></code></pre></p>\n\n<h3>H8: Design Estético e Minimalista</h3>\n\n<p><strong>Descrição:</strong> Remova informações irrelevantes.</p>\n\n<pre><code># BOM\n✓ Foco no essencial\n✓ Hierarquia visual clara\n✓ White space adequado\n✓ Progressive disclosure\n\n<p># RUIM<br>✗ Informações demais<br>✗ Banners e popups constantes<br>✗ Tudo na mesma tela<br></code></pre></p>\n\n<h3>H9: Ajuda para Reconhecer Erros</h3>\n\n<p><strong>Descrição:</strong> Mensagens de erro devem ajudar o usuário a resolver.</p>\n\n<pre><code># BOM\n✓ \"Email inválido. Formato: usuario@dominio.com\"\n✓ \"Senha deve ter 8+ caracteres, incluindo número\"\n✓ Highlight do campo com erro\n\n<p># RUIM<br>✗ \"Erro 500\"<br>✗ \"Algo deu errado\"<br>✗ Erro sem указание do que fazer<br></code></pre></p>\n\n<h3>H10: Ajuda e Documentação</h3>\n\n<p><strong>Descrição:</strong> Forneça ajuda quando necessário.</p>\n\n<pre><code># BOM\n✓ Tooltips informativos\n✓ FAQ ou central de ajuda\n✓ Onboarding guiado\n✓ Chat de suporte\n\n<p># RUIM<br>✗ Sem documentação<br>✗ Documentação desatualizada<br>✗ Ajuda difícil de encontrar<br></code></pre></p>\n\n<hr>\n<h2>Tipos de Testes de Usabilidade</h2>\n\n<h3>1. Testes com Usuários</h3>\n\n<h4>Setup</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Aspecto</th><th>Recomendação</th></tr>\n<tr><td><strong>Participantes</strong></td><td>5-8 para finding inicial</td></tr>\n<tr><td><strong>Perfil</strong></td><td>Similar ao público real</td></tr>\n<tr><td><strong>Ambiente</strong></td><td>Silencioso, sem distrações</td></tr>\n<tr><td><strong>Duração</strong></td><td>30-90 minutos por sessão</td></tr>\n<tr><td><strong>Gravação</strong></td><td>Tela + rosto + áudio</td></tr>\n</table></figure>\n\n<h4>Tarefas para Usuário</h4>\n\n<pre><code># Tarefas para Teste de E-commerce\n<ol><li>\"Encontre uma camisa azul tamanho M e adicione ao carrinho\"</li>\n</ol>   - Tempo: ___\n   - Sucesso: ✓/✗\n   - Dificuldades: ___\n<ol><li>\"Use um cupom de desconto de 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</li>\n</ol>   - Tempo: ___\n   - Sucesso: ✓/✗\n   - Dificuldades: ___\n<ol><li>\"Finalize a compra como visitante\"</li>\n</ol>   - Tempo: ___\n   - Sucesso: ✓/✗\n   - Dificuldades: ___\n</code></pre>\n\n<h4>Métricas</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Target</th></tr>\n<tr><td><strong>Tempo na tarefa</strong></td><td>Cronômetro</td><td>&lt; 60s para simples</td></tr>\n<tr><td><strong>Taxa de sucesso</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} completou</td><td>&gt; 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Erros</strong></td><td>Contagem</td><td>&lt; 2 por tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Questionnaire (SUS)</td><td>&gt; 70</td></tr>\n<tr><td><strong>Confusão</strong></td><td>Observação</td><td>Minimo</td></tr>\n</table></figure>\n\n<h3>2. Análise Heurística</h3>\n\n<pre><code># Avaliação Heurística\n\n<p>Avaliador: [Nome]<br>Data: [Data]<br>Produto: [Nome]</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Heurística</th><th>Conformidade</th><th>Severidade</th><th>Comentários</th></tr>\n<tr><td>H1: Status</td><td>⚠️ 2/5</td><td>Média</td><td>Carrinho sem count badge</td></tr>\n<tr><td>H2: Mundo Real</td><td>✓ 5/5</td><td>-</td><td>Excelente</td></tr>\n<tr><td>H3: Controle</td><td>✗ 1/5</td><td>Alta</td><td>Sem undo</td></tr>\n<tr><td>H4: Consistência</td><td>✓ 5/5</td><td>-</td><td>Excelente</td></tr>\n<tr><td>H5: Prevenção</td><td>⚠️ 3/5</td><td>Baixa</td><td>Validação tardia</td></tr>\n<tr><td>...</td><td>...</td><td>...</td><td>...</td></tr>\n</table></figure>\n\n<p>Legenda Severidade:<br><ul><li>Crítica: Deve corrigir imediatamente</li><ol><li>Alta: Corrigir na próxima release</li><br><li>Média: Corrigir se tempo</li><br><li>Baixa: Nice to have</li><br></ol></code></pre></p>\n\n<h3>3. Questionário SUS (System Usability Scale)</h3>\n\n<pre><code># SUS Score\n\n<p>Responda de 1 (Discordo totalmente) a 5 (Concordo totalmente):<br><ol><li>Eu acho que gostaria de usar este sistema frequentemente</li><br><li>Eu achei o sistema inutilmente complexo</li><br><li>Eu achei o sistema fácil de usar</li><br><li>Eu precisaria de suporte técnico para usar este sistema</li><br><li>Eu encontrei várias funções bem integradas neste sistema</li><br><li>Eu achei que havia muita inconsistência neste sistema</li><br><li>A maioria das pessoas aprenderia a usar este sistema rapidamente</li><br><li>Eu achei o sistema muito trabalhoso de usar</li><br><li>Eu me senti confiante usando o sistema</li><br><li>Eu precisei aprender muitas coisas antes de conseguir usar o sistema</li><br></ol><br>Cálculo:<ol><li>Para itens ímpares (1,3,5,7,9): score = resposta - 1</li><br><li>Para itens pares (2,4,6,8,10): score = 5 - resposta</li><br><li>SUS = (soma dos scores) × 2.5</li><br></ol><br>Interpretação:<ol><li>90+ = A+ (Best imaginable)</li><br><li>80-90 = A (Excellent)</li><br><li>70-80 = B (Good)</li><br><li>60-70 = C (Okay)</li><br><li>50-60 = D (Poor)</li><br><li>&lt;50 = F (Fail)</li><br></ol></code></pre></p>\n\n<hr>\n<h2>Ferramentas de Teste de Usabilidade</h2>\n\n<h3>1. Observação Remota</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Características</th><th>Custo</th></tr>\n<tr><td><strong>UserTesting</strong></td><td>Painel de participantes</td><td>$39/sessão</td></tr>\n<tr><td><strong>Optimal Workshop</strong></td><td>Card sorting, tree testing</td><td>$100+/mês</td></tr>\n<tr><td><strong>Hotjar</strong></td><td>Heatmaps, recordings</td><td>Grátis/Pro</td></tr>\n<tr><td><strong>Lookback</strong></td><td>Gravação + entrevistas</td><td>Sob consulta</td></tr>\n<tr><td><strong>Maze</strong></td><td>Testing rápido</td><td>Grátis/Pro</td></tr>\n</table></figure>\n\n<h3>2. Heatmaps e Clickmaps</h3>\n\n<pre><code>// Hotjar Heatmap\n// Tracking automático de:\n// - Movimentos do mouse\n// - Cliques\n// - Scroll depth\n// - Tempo de visão\n\n<p>// Configuração<br>hj(\'heatmap\', {<br>    scrollmap: true,<br>    clickmap: true,<br>    recording: true<br>});<br></code></pre></p>\n\n<h3>3. A/B Testing para UX</h3>\n\n<pre><code>// Google Optimize / VWO\n// Testar variações de UI\n\n<p>// Exemplo de implementação<br>function showABTest() {<br>    const variation = Math.random() &gt; 0.5 ? \'A\' : \'B\';</p>\n\n<p>if (variation === \'A\') {<br>        // Versão atual<br>        document.getElementById(\'cta\').textContent = \'Compre Agora\';<br>    } else {<br>        // Nova versão<br>        document.getElementById(\'cta\').textContent = \'Comece Seu Teste Grátis\';<br>    }</p>\n\n<p>// Rastrear resultado<br>    analytics.track(\'cta_variation\', { variation });<br>}<br></code></pre></p>\n\n<hr>\n<h2>WCAG 2.1 - Acessibilidade</h2>\n\n<h3>4 Princípios (POUR)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Princípio</th><th>Descrição</th></tr>\n<tr><td><strong>Perceivable</strong></td><td>Informations deve ser perceptível</td></tr>\n<tr><td><strong>Operable</strong></td><td>Interface deve ser operável</td></tr>\n<tr><td><strong>Understandable</strong></td><td>Informações e operação compreensíveis</td></tr>\n<tr><td><strong>Robust</strong></td><td>Conteúdo deve ser robusto</td></tr>\n</table></figure>\n\n<h3>Critérios de Conformidade (Resumo)</h3>\n\n<pre><code><h2>Nível A (Básico)</h2>\n\n<p>✓ Alternativas textuais para imagens<br>✓ Captions para vídeos<br>✓ Cor não é único meio de informação<br>✓ Navegação por teclado<br>✓ Sem flash mais que 3x/segundo</p>\n\n<h2>Nível AA (Recomendado)</h2>\n\n<p>✓ Contraste mínimo 4.5:1 (texto), 3:1 (grande)<br>✓ Redimensionamento de texto<br>✓ Multiple ways de encontrar conteúdo<br>✓ Cabeçalhos e labels descritivos<br>✓ Sem timing ajustável</p>\n\n<h2>Nível AAA (Avançado)</h2>\n\n<p>✓ Contraste 7:1<br>✓ Audio description<br>✓ Sign language interpretation<br>✓ Enhanced contrast<br></code></pre></p>\n\n<hr>\n<h2>Checklist de Usabilidade</h2>\n\n<h3>Formulários</h3>\n<ol><li>[ ] Labels visíveis (não só placeholders)</li>\n<li>[ ] Campos com autocomplete</li>\n<li>[ ] Validação inline e helpful</li>\n<li>[ ] Tab order logical</li>\n<li>[ ] Required fields indication</li>\n<li>[ ] Error messages específicos</li>\n<li>[ ] Success confirmation</li>\n</ol>\n<h3>Navegação</h3>\n<ol><li>[ ] Logo retorna para home</li>\n<li>[ ] Menu sempre visível</li>\n<li>[ ] Breadcrumbs quando aplicável</li>\n<li>[ ] Search funcional</li>\n<li>[ ] 404 page útil</li>\n<li>[ ] Consistent header/footer</li>\n</ol>\n<h3>Mobile</h3>\n<ol><li>[ ] Touch targets &gt; 48px</li>\n<li>[ ] No horizontal scroll</li>\n<li>[ ] Viewport configured</li>\n<li>[ ] Font size legível (16px min)</li>\n<li>[ ] Space between links</li>\n<li>[ ] Thumb zone respeitada</li>\n</ol>\n<h3>Performance</h3>\n<ol><li>[ ] First paint &lt; 1.5s</li>\n<li>[ ] Interactive &lt; 3s</li>\n<li>[ ] No layout shift</li>\n<li>[ ] Skeleton loading</li>\n<li>[ ] Progressive enhancement</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de usabilidade são essenciais para criar produtos que usuários amam. As chaves para o sucesso são:<br><ol><li><strong>Testar com usuários reais</strong> - Não presuma, observe</li><br><li><strong>Usar heurísticas</strong> - Checklist estruturado</li><br><li><strong>Medir objetivamente</strong> - Métricas + qualititativo</li><br><li><strong>Priorizar</strong> - Nem tudo pode ser corrigido agora</li><br><li><strong>Iterar</strong> - UX é melhoria contínua</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Quantos usuários preciso testar?</strong>  <br>R: 5-8 para encontrar a maioria dos problemas (Lei dos retornos decrescentes).</p>\n\n<p><strong>P: Quando fazer testes de usabilidade?</strong>  <br>R: Idealmente antes do design (pesquisa) e depois do MVP (validação).</p>\n\n<p><strong>P: Posso fazer testes de usabilidade remotamente?</strong>  <br>R: Sim! Ferramentas como UserTesting e Hotjar permitem testes remotos eficientes.</p>\n\n<p><strong>P: Como medir ROI de UX?</strong>  <br>R: Compare métricas antes/depois: tempo de tarefa, taxa de conclusão, satisfação (SUS).</p>', 'Testes de Usabilidade: Garantindo Excelência na Experiência do Usuário', '', 'inherit', 'closed', 'closed', '', '193-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '193', 'http://localhost:8082/ideiasti/?p=422', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('423', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a implementar testes de regressão eficazes: estratégias de seleção, automação, manutenção e como construir uma suite de regressão sustentável.</p>\n\n<hr>\n<h2>O Que São Testes de Regressão?</h2>\n\n<p>Testes de regressão são executados para garantir que mudanças recentes no código (novas funcionalidades, bug fixes, refactoring) não introduziram novos defeitos ou quebraram funcionalidades existentes.</p>\n\n<h3>Quando Executar Regressão</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Situação</th><th>Recomendação</th></tr>\n<tr><td>Antes de cada release</td><td>Suite completa</td></tr>\n<tr><td>Após hotfix</td><td>Smoke + área afetada</td></tr>\n<tr><td>Antes de deploy</td><td>Critical path</td></tr>\n<tr><td>Semanalmente (CI)</td><td>Suite rápida</td></tr>\n<tr><td>Sob demanda</td><td>Após mudanças críticas</td></tr>\n</table></figure>\n\n<hr>\n<h2>Estratégias de Seleção de Testes</h2>\n\n<h3>1. Regressão Completa</h3>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Quando usar:</strong><br><ul><li>Releases major</li><ol><li>Mudanças arquiteturais</li><br><li>After database migration</li><br><li>Final gate para produção</li><br></ol><br><h3>2. Regressão Parcial (Seletiva)</h3></p>\n\n<p>Seleciona subconjunto baseado em mudanças.</p>\n\n<pre><code># Exemplo: Selecionar testes por área afetada\ndef get_affected_tests(changed_files):\n    \"\"\"Retorna testes que devem ser executados\"\"\"\n\n<p>module_to_tests = {<br>        \'src/auth/\': [\'tests/auth/*.py\', \'tests/conftest.py\'],<br>        \'src/payment/\': [\'tests/payment/*.py\'],<br>        \'src/cart/\': [\'tests/cart/<em>.py\', \'tests/checkout/</em>.py\'],<br>    }</p>\n\n<p>tests = set()<br>    for changed_file in changed_files:<br>        module = extract_module(changed_file)<br>        if module in module_to_tests:<br>            tests.update(module_to_tests[module])</p>\n\n<p>return tests</p>\n\n<p># Executar apenas testes afetados<br>affected_tests = get_affected_tests(get_changed_files())<br>pytest.main(affected_tests)<br></code></pre></p>\n\n<h3>3. Regressão Baseada em Risco</h3>\n\n<p>Prioriza por risco de impacto.</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Prioridade</th><th>Critério</th><th>Execução</th></tr>\n<tr><td><strong>Crítica</strong></td><td>Fluxos de pagamento, auth</td><td>Sempre</td></tr>\n<tr><td><strong>Alta</strong></td><td>Features principais</td><td>Antes de cada release</td></tr>\n<tr><td><strong>Média</strong></td><td>Features secundárias</td><td>Semanalmente</td></tr>\n<tr><td><strong>Baixa</strong></td><td>Edge cases</td><td>Mensalmente</td></tr>\n</table></figure>\n\n<h3>4. Regressão Híbrida</h3>\n\n<p>Combina múltiplas estratégias.</p>\n\n<pre><code># strategy: Hybrid Regression\n\n<p># Nivel 1: Critical (sempre)<ol><li>tests/auth/login*.py</li><br><li>tests/auth/logout*.py</li><br><li>tests/payment/checkout*.py</li><br><li>tests/smoke/*.py</li><br></ol><br># Nivel 2: Based on changes<ol><li>get_affected_tests()</li><br></ol><br># Nivel 3: Risk-based<ol><li>tests/high_risk_features*.py</li><br></ol><br># Nivel 4: Full (releases only)<ol><li>tests/full_suite/*.py</li></ol></ul><br></code></pre></p>\n\n<hr>\n<h2>Automação de Regressão</h2>\n\n<h3>Framework Ideal</h3>\n\n<pre><code>regression_suite/\n├── conftest.py              # Setup global\n├── pytest.ini               # Configuração\n├── requirements.txt         # Dependências\n│\n├── core/\n│   ├── __init__.py\n│   ├── base_page.py         # Page Object base\n│   ├── api_client.py        # Cliente API\n│   └── database.py          # Helpers de DB\n│\n├── pages/                   # Page Objects\n│   ├── login_page.py\n│   ├── dashboard_page.py\n│   └── checkout_page.py\n│\n├── api/                     # API Tests\n│   ├── test_auth.py\n│   ├── test_products.py\n│   └── test_orders.py\n│\n├── ui/                      # UI Tests\n│   ├── test_login.py\n│   ├── test_checkout.py\n│   └── test_profile.py\n│\n├── smoke/                   # Smoke Tests\n│   └── test_critical_path.py\n│\n├── data/                    # Data files\n│   └── users.json\n│\n└── reports/                 # Relatórios\n    └── .gitkeep\n</code></pre>\n\n<h3>Page Object Pattern</h3>\n\n<pre><code># pages/base_page.py\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n<p>class BasePage:<br>    def __init__(self, driver):<br>        self.driver = driver<br>        self.wait = WebDriverWait(driver, 10)</p>\n\n<p>def click(self, locator):<br>        self.wait.until(EC.element_to_be_clickable(locator)).click()</p>\n\n<p>def send_keys(self, locator, text):<br>        element = self.wait.until(EC.presence_of_element_located(locator))<br>        element.clear()<br>        element.send_keys(text)</p>\n\n<p>def get_text(self, locator):<br>        return self.wait.until(EC.presence_of_element_located(locator)).text</p>\n\n<p>def is_visible(self, locator):<br>        try:<br>            return self.wait.until(<br>                EC.visibility_of_element_located(locator)<br>            ).is_displayed()<br>        except:<br>            return False</p>\n\n<p># pages/login_page.py<br>from selenium.webdriver.common.by import By</p>\n\n<p>class LoginPage(BasePage):<br>    URL = \"https://exemplo.com/login\"</p>\n\n<p>EMAIL = (By.ID, \"email\")<br>    PASSWORD = (By.ID, \"password\")<br>    LOGIN_BUTTON = (By.ID, \"login-button\")<br>    ERROR_MESSAGE = (By.CLASS_NAME, \"error-message\")</p>\n\n<p>def load(self):<br>        self.driver.get(self.URL)<br>        return self</p>\n\n<p>def login(self, email, password):<br>        self.send_keys(self.EMAIL, email)<br>        self.send_keys(self.PASSWORD, password)<br>        self.click(self.LOGIN_BUTTON)<br>        return self</p>\n\n<p>def get_error(self):<br>        return self.get_text(self.ERROR_MESSAGE)<br></code></pre></p>\n\n<h3>Execução Paralela</h3>\n\n<pre><code># pytest.ini\n[pytest]\naddopts = -n auto --dist loadscope\n# -n auto: usa todas CPUs disponíveis\n# --dist loadscope: agrupa testes por scope\n</code></pre>\n\n<pre><code># GitHub Actions\nname: Regression Tests\n\n<p>on:<br>  schedule:<br>    - cron: \'0 6 <em> </em> 1\'  # Toda segunda 6h</p>\n\n<p>jobs:<br>  regression:<br>    runs-on: ubuntu-latest<br>    strategy:<br>      matrix:<br>        shard: [1, 2, 3, 4]</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run test shard ${{ matrix.shard }}<br>        run: |<br>          pytest tests/ <br>            --dist loadscope <br>            --maxprocesses 4 <br>            --split=${{ matrix.shard }}/4<br></code></pre></p>\n\n<hr>\n<h2>Manutenção da Suite</h2>\n\n<h3>Identificando Testes Obsoletos</h3>\n\n<pre><code># script: identify_obsolete_tests.py\nimport subprocess\nfrom datetime import datetime\n\n<p>def analyze_test_usage():<br>    \"\"\"Analisa quais testes não foram executados ou falham sempre\"\"\"</p>\n\n<p>results = []</p>\n\n<p># 1. Testes sem execution recent<br>    git_log = subprocess.run(<br>        [\'git\', \'log\', \'--oneline\', \'--all\', \'--\', \'tests/\'],<br>        capture_output=True,<br>        text=True<br>    ).stdout</p>\n\n<p># 2. Testes que sempre falham<br>    # 3. Testes duplicados<br>    # 4. Cobertura redundante</p>\n\n<p>return results</p>\n\n<p># Gerar relatório<br>report = analyze_test_usage()<br>print(\"Testes para revisão:\")<br>for test in report:<br>    print(f\"  - {test[\'name\']}: {test[\'reason\']}\")<br></code></pre></p>\n\n<h3>Indicadores de \"Code Smell\" em Testes</h3>\n\n<pre><code># PROBLEMA: Teste faz muito\ndef test_criar_pedido_completo():\n    # Setup (50 linhas)\n    # Login (10 linhas)\n    # Add produto (15 linhas)\n    # Add outro produto (15 linhas)\n    # Apply cupom (10 linhas)\n    # Calculate shipping (10 linhas)\n    # Checkout (20 linhas)\n    # Payment (30 linhas)\n    # Verify (40 linhas)\n    # Cleanup (20 linhas)\n    # Total: 220 linhas - MUITO PARA UM TESTE!\n\n<p># SOLUÇÃO: Dividir em múltiplos testes focados<br>def test_adicionar_produto_ao_carrinho():<br>    \"\"\"Focado: adiciona produto\"\"\"<br>    pass</p>\n\n<p>def test_aplicar_cupom_desconto():<br>    \"\"\"Focado: aplica cupom\"\"\"<br>    pass</p>\n\n<p>def test_calcular_frete():<br>    \"\"\"Focado: calcula frete\"\"\"<br>    pass</p>\n\n<p>def test_checkout_com_sucesso():<br>    \"\"\"Integração: fluxo completo\"\"\"<br>    pass<br></code></pre></p>\n\n<hr>\n<h2>Métricas de Regressão</h2>\n\n<h3>Dashboard</h3>\n\n<pre><code># Grafana Dashboard - Regression Suite\n\n<p>panels:<br>  - title: \"Test Execution Time\"<br>    type: graph<br>    queries:<br>      - query: \"sum(rate(test_duration_seconds_sum[5m])) / sum(rate(test_duration_seconds_count[5m]))\"</p>\n\n<p>- title: \"Pass/Fail Rate\"<br>    type: piechart<br>    queries:<br>      - query: \"sum by (status) (test_results_total)\"</p>\n\n<p>- title: \"Flaky Tests\"<br>    type: stat<br>    queries:<br>      - query: \"count(test_flaky == 1)\"</p>\n\n<p>- title: \"Coverage Trend\"<br>    type: timeseries<br>    queries:<br>      - query: \"test_coverage_percentage\"<br></code></pre></p>\n\n<h3>KPIs</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Target</th><th>Current</th><th>Trend</th></tr>\n<tr><td>Pass Rate</td><td>&gt; 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>93{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>↑</td></tr>\n<tr><td>Execution Time</td><td>&lt; 30 min</td><td>35 min</td><td>↓</td></tr>\n<tr><td>Flaky Rate</td><td>&lt; 2{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>3{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>→</td></tr>\n<tr><td>Coverage</td><td>&gt; 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>78{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>↑</td></tr>\n<tr><td>Maintenance Effort</td><td>&lt; 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>↓</td></tr>\n</table></figure>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de regressão são a rede de segurança do seu software. Para uma suite eficaz:<br><ol><li><strong>Selecione estrategicamente</strong> - Nem tudo precisa de regressão completa</li><br><li><strong>Automatize</strong> - Regressão manual não escala</li><br><li><strong>Mantenha</strong> - Limpe testes obsoletos regularmente</li><br><li><strong>Monitore</strong> - Métricas guiam melhoria</li><br><li><strong>Priorize</strong> - Risco e impacto guiam execução</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Quantos testes deve ter na suite de regressão?</strong>  <br>R: Depende do projeto. Uma suite saudável cobre funcionalidades críticas com alta cobertura.</p>\n\n<p><strong>P: Como reduzir flaky tests?</strong>  <br>R: Use waits explícitos, isole testes, evite dependências, investigue root cause.</p>\n\n<p><strong>P: Testes de regressão devem ser no CI ou separate job?</strong>  <br>R: Smokes no CI (bloqueante), regressão completa em job separado (não bloqueante).</p>\n\n<p><strong>P: Como saber se a suite precisa de mais testes?</strong>  <br>R: Analise: bugs que passaram, áreas sem cobertura, novos riscos.</p>', 'Testes de Regressão: Garantindo Qualidade Contínua', '', 'inherit', 'closed', 'closed', '', '194-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '194', 'http://localhost:8082/ideiasti/?p=423', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('424', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Entenda como QA se integra às metodologias ágeis: Scrum, Kanban e XP. Aprenda a aplicar práticas de qualidade em equipes ágeis.</p>\n\n<hr>\n<h2>QA em Scrum</h2>\n\n<h3>Cerimônias e QA</h3>\n\n<h4>Sprint Planning</h4>\n<pre><code># Sprint Planning - Input de QA\n\n<h2>Antes da Planning</h2>\n<ul><li>[ ] Backlog priorizado pelo PO</li><ol><li>[ ] User stories com critérios de aceitação</li>\n<li>[ ] Histórias técnicas identificadas</li>\n</ol>\n<h2>Durante Planning</h2>\n<h3>Para cada história</h3><ol><li>PO apresenta requirements</li>\n<li>Devs estimam esforço</li>\n<li>QA identifica:</li>\n</ol>  - Riscos de teste\n  - Dados necessários\n  - Dependências\n  - Complexidade de automação<ol><li>timebox: ~1 hora por sprint</li>\n</ol>\n<h2>Output</h2><ol><li>[ ] Sprint backlog definido</li>\n<li>[ ] Definition of Done clara</li>\n<li>[ ] Dívidas técnicas identificadas</li>\n</ol></code></pre>\n\n<h4>Daily Standup</h4>\n<pre><code># Daily Standup - QA Updates\n\n<h2>Formato: 3 perguntas</h2>\n\n<h3>O que fiz ontem para ajudar o time?</h3><ol><li>\"Finalizei testes da história #123\"</li>\n<li>\"Revisei PR do João\"</li>\n</ol>\n<h3>O que farei hoje?</h3><ol><li>\"Vou testar história #124\"</li>\n<li>\"Vou automatizar teste de login\"</li>\n</ol>\n<h3>Há algum impedimento?</h3><ol><li>\"Aguardando ambiente de staging\"</li>\n<li>\"Preciso de acesso ao banco de produção\"</li>\n</ol>\n<h2>Tips para QA</h2><ol><li>Mantenha updates curtos (~30 segundos)</li>\n<li>Identifique bloqueios rápido</li>\n<li>Ajude devs com code review</li>\n<li>Coordene com outros QAers</li>\n</ol></code></pre>\n\n<h4>Sprint Review</h4>\n<pre><code># Sprint Review - Testing Handoff\n\n<h2>Demo Checklist</h2><ol><li>[ ] Funcionalidades demonstradas</li>\n<li>[ ] Critérios de aceitação cumpridos</li>\n<li>[ ] Testes executados</li>\n<li>[ ] Bugs documentados</li>\n</ol>\n<h2>Demo Format</h2><ol><li>\"O que foi feito?\"</li>\n<li>\"Como funciona?\"</li>\n<li>\"O que não foi feito?\" (e por quê)</li>\n<li>\"Próximos passos\"</li>\n</ol>\n<h2>Feedback de QA</h2><ol><li>Qualidade geral</li>\n<li>Issues encontrados</li>\n<li>Recomendações</li>\n</ol></code></pre>\n\n<h4>Sprint Retrospective</h4>\n<pre><code># Sprint Retrospective - QA Focus\n\n<h2>Start (O que começar a fazer?)</h2><ol><li>\"Começar a fazer BDD com time\"</li>\n<li>\"Começar a documentar testes\"</li>\n</ol>\n<h2>Stop (O que parar de fazer?)</h2><ol><li>\"Parar de fazer testes manuais em features pequenas\"</li>\n<li>\"Parar de aceitar histórias sem critérios de aceitação\"</li>\n</ol>\n<h2>Continue (O que continuar fazendo?)</h2><ol><li>\"Continuar pair testing\"</li>\n<li>\"Continuar code reviews\"</li>\n</ol>\n<h2>Ações para Próximo Sprint</h2><ol><li>[ ] Ação 1 - Responsável: João</li>\n<li>[ ] Ação 2 - Responsável: Maria</li>\n</ol></code></pre>\n\n<h3>Definition of Done (DoD)</h3>\n\n<pre><code># Definition of Done - Checklist\n\n<p>Para uma história ser considerada \"Done\":</p>\n\n<h2>Código</h2><ol><li>[ ] Código implementado</li>\n<li>[ ] Code review aprovado</li>\n<li>[ ] Branch merged to main</li>\n<li>[ ] Sem warnings de linter</li>\n</ol>\n<h2>Testes</h2><ol><li>[ ] Unit tests escritos (&gt; 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} coverage)</li>\n<li>[ ] Testes de integração passando</li>\n<li>[ ] Testes funcionais passando</li>\n<li>[ ] Testes de performance (se aplicável)</li>\n<li>[ ] Accessibility testes (se aplicável)</li>\n</ol>\n<h2>Qualidade</h2><ol><li>[ ] Segurança revisada</li>\n<li>[ ] Performance considerada</li>\n<li>[ ] Responsivo (se web/mobile)</li>\n<li>[ ] Logs implementados</li>\n</ol>\n<h2>Documentação</h2><ol><li>[ ] README atualizado</li>\n<li>[ ] API docs (se aplicável)</li>\n<li>[ ] Swagger/OpenAPI atualizado</li>\n</ol>\n<h2>Deploy</h2><ol><li>[ ] Deploy em staging</li>\n<li>[ ] Smoke tests passando</li>\n<li>[ ] Ready for production</li>\n</ol></code></pre>\n\n<hr>\n<h2>QA em Kanban</h2>\n\n<h3>Quadro Kanban</h3>\n\n<pre><code>┌──────────┬──────────┬──────────┬──────────┬──────────┐\n│  BACKLOG │  READY   │ IN DEV   │  TEST    │   DONE   │\n├──────────┼──────────┼──────────┼──────────┼──────────┤\n│  Story 5 │ Story 1  │ Story 2  │ Story 3  │ Story 4  │\n│  Story 6 │          │          │          │ Story 7  │\n│  Story 8 │          │          │          │          │\n└──────────┴──────────┴──────────┴──────────┴──────────┘\n    ∞            5           3          3           ∞\n</code></pre>\n\n<h3>WIP Limits</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Column</th><th>WIP Limit</th><th>Reason</th></tr>\n<tr><td>Ready</td><td>5</td><td>Capacidade do time</td></tr>\n<tr><td>In Dev</td><td>3</td><td>Focus por developer</td></tr>\n<tr><td>Test</td><td>3</td><td>Capacidade QA</td></tr>\n<tr><td>Review</td><td>2</td><td>Bottlenecks visíveis</td></tr>\n</table></figure>\n\n<h3>Métricas Kanban</h3>\n\n<pre><code># Lead Time e Cycle Time\nimport datetime\n\n<p>def calculate_metrics():<br>    tickets = [<br>        {<br>            \"id\": \"PROD-123\",<br>            \"created\": \"2024-01-01\",<br>            \"ready\": \"2024-01-03\",<br>            \"dev_start\": \"2024-01-05\",<br>            \"dev_done\": \"2024-01-08\",<br>            \"test_start\": \"2024-01-09\",<br>            \"test_done\": \"2024-01-10\",<br>            \"done\": \"2024-01-10\",<br>        }<br>    ]</p>\n\n<p>for ticket in tickets:<br>        created = datetime.datetime.strptime(ticket[\"created\"], \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}Y-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}m-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}d\")<br>        done = datetime.datetime.strptime(ticket[\"done\"], \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}Y-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}m-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}d\")</p>\n\n<p>lead_time = (done - created).days<br>        cycle_time = (done - datetime.datetime.strptime(<br>            ticket[\"dev_start\"], \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}Y-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}m-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}d\"<br>        )).days</p>\n\n<p>print(f\"{ticket[\'id\']}: Lead={lead_time}d, Cycle={cycle_time}d\")</p>\n\n<p># Throughput<br>def throughput(team_tickets):<br>    completed_last_30d = sum(<br>        1 for t in team_tickets <br>        if is_done_recently(t, 30)<br>    )<br>    return completed_last_30d<br></code></pre></p>\n\n<h3>Classes of Service</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Class</th><th>Priority</th><th>WIP</th><th>Lead Time Target</th></tr>\n<tr><td>Expedite</td><td>Crítica</td><td>1</td><td>&lt; 1 dia</td></tr>\n<tr><td>Fixed Date</td><td>Alta</td><td>2</td><td>Na data</td></tr>\n<tr><td>Standard</td><td>Normal</td><td>∞</td><td>&lt; 5 dias</td></tr>\n<tr><td>Intangible</td><td>Baixa</td><td>∞</td><td>Quando possível</td></tr>\n</table></figure>\n\n<hr>\n<h2>XP (Extreme Programming) e QA</h2>\n\n<h3>Práticas XP</h3>\n\n<h4>Pair Programming</h4>\n\n<pre><code># Pair Programming Roles\n\n<h2>Driver</h2><ol><li>Escreve o código</li>\n<li>Focado na implementação</li>\n<li>Compartilha tela</li>\n</ol>\n<h2>Navigator</h2><ol><li>Revisa código em tempo real</li>\n<li>Pensa estrategicamente</li>\n<li>Busca melhorias</li>\n<li>Agenda refatoração</li>\n</ol>\n<h2>Dicas</h2><ol><li>Troque papéis a cada 30-60 minutos</li>\n<li>Mantenha comunicação aberta</li>\n<li>Ambos são responsáveis pela qualidade</li>\n</ol>\n<h2>Benefícios</h2><ol><li>15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} mais lento, mas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos bugs</li>\n<li>Transferência de conhecimento</li>\n<li>Catches bugs em tempo real</li>\n</ol></code></pre>\n\n<h4>TDD em XP</h4>\n\n<pre><code># Ciclo TDD em XP\n# Red -&gt; Green -&gt; Refactor (em pares!)\n\n<p># 1. RED: Escrever teste que falha<br>def test_calcular_imposto():<br>    resultado = calcular_imposto(100, 0.1)<br>    assert resultado == 10</p>\n\n<p># 2. GREEN: Fazer passar (mínimo)<br>def calcular_imposto(valor, taxa):<br>    return 10  # Hardcoded</p>\n\n<p># 3. REFACTOR: Melhorar (em par)<br>def calcular_imposto(valor, taxa):<br>    return valor * taxa<br></code></pre></p>\n\n<h4>Continuous Integration</h4>\n\n<pre><code># CI Pipeline XP Style\nname: XP CI\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  test:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p># 1. Commit pequeno<br>      # 2. Build e test<br>      - run: pip install pytest pytest-cov</p>\n\n<p># 3. Todos testes passando<br>      - run: pytest -v --cov=src --cov-fail-under=80</p>\n\n<p># 4. Integrar frequentemente<br>      - name: Merge if green<br>        if: github.ref == \'main\'<br>        run: echo \"Ready to merge\"<br></code></pre></p>\n\n<hr>\n<h2>Métricas Ágeis de QA</h2>\n\n<h3>Defect Metrics</h3>\n\n<pre><code># Defect Metrics\nclass DefectMetrics:\n    def __init__(self, sprints):\n        self.sprints = sprints\n\n<p>def defect_leakage(self, sprint):<br>        \"\"\"Defeitos encontrados em produção vs. antes\"\"\"<br>        prod_bugs = sprint.bugs_found_in_prod<br>        total_bugs = sprint.total_bugs</p>\n\n<p>return (prod_bugs / total_bugs) * 100 if total_bugs else 0</p>\n\n<p>def defect_densities(self, sprints):<br>        \"\"\"Densidade de defeitos por feature\"\"\"<br>        return {<br>            sprint.name: len(sprint.defects) / sprint.stories_completed<br>            for sprint in sprints<br>        }</p>\n\n<p>def escape_rate(self, sprint):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos que escaparam para prod\"\"\"<br>        escaped = sprint.defects_found_after_release<br>        total = sprint.total_defects</p>\n\n<p>return (escaped / total * 100) if total else 0</p>\n\n<p># Targets<br># Defect Leakage: &lt; 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br># Defect Density: &lt; 0.5 per story<br># Escape Rate: &lt; 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br></code></pre></p>\n\n<h3>Test Velocity</h3>\n\n<pre><code># Test Velocity Metrics\n\n<p>metrics:<br>  - name: \"Tests Written per Sprint\"<br>    target: 50<br>    current: 47</p>\n\n<p>- name: \"Automation Coverage\"<br>    target: \"80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br>    current: \"72{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</p>\n\n<p>- name: \"Test Execution Time\"<br>    target: \"&lt; 30 min&quot;<br>    current: \"35 min\"</p>\n\n<p>- name: \"Test Maintenance Effort\"<br>    target: \"&lt; 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}&quot;<br>    current: \"25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br></code></pre></p>\n\n<hr>\n<h2>Checklist de Práticas Ágeis para QA</h2>\n\n<h3>Sprint</h3><ol><li>[ ] Participar de planning</li>\n<li>[ ] Identificar riscos de teste</li>\n<li>[ ] Atualizar testes para histórias</li>\n<li>[ ] Executar testes</li>\n<li>[ ] Reportar bugs</li>\n<li>[ ] Participar de review</li>\n<li>[ ] Retrospectiva de QA</li>\n</ol>\n<h3>Continuous</h3><ol><li>[ ] Manter testes atualizados</li>\n<li>[ ] Pair testing quando possível</li>\n<li>[ ] Code reviews</li>\n<li>[ ] CI/CD passing</li>\n<li>[ ] Métricas atualizadas</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>QA em agile requer adaptação constante e colaboração. As chaves são:<br><ol><li><strong>Integração</strong> - QA não é fase separada</li><br><li><strong>Comunicação</strong> - Time completo é responsável</li><br><li><strong>Automação</strong> - Habilita velocidade</li><br><li><strong>Métricas</strong> - Medir para melhorar</li><br><li><strong>Melhoria</strong> - Retrospectivas e adaptação</li></ol></p>', 'Metodologias Ágeis e QA: Scrum, Kanban e XP na Prática', '', 'inherit', 'closed', 'closed', '', '195-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '195', 'http://localhost:8082/ideiasti/?p=424', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('425', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a testar bancos de dados: consultas SQL, integridade de dados, migrations, performance e testes de integração com banco de dados.</p>\n\n<hr>\n<h2>Introdução aos Testes de Banco de Dados</h2>\n\n<p>Testar banco de dados é essencial para garantir que dados são armazenados, recuperados e manipulados corretamente. Inclui testes de schema, queries, migrations e performance.</p>\n\n<h3>Por Que Testar Banco de Dados?</h3>\n\n<ul><li>Garantir integridade de dados</li><ol><li>Validar constraints e triggers</li>\n<li>Verificar performance de queries</li>\n<li>Proteger contra regressions</li>\n<li>Validar migrations</li></ol></ul>\n\n<hr>\n<h2>Tipos de Testes de Banco de Dados</h2>\n\n<h3>1. Testes de Schema</h3>\n\n<pre><code># Testes de Schema\ndef test_schema_has_required_tables(postgres):\n    \"\"\"Verifica que tabelas existem\"\"\"\n    result = postgres.run(\"\"\"\n        SELECT table_name \n        FROM information_schema.tables \n        WHERE table_schema = \'public\'\n    \"\"\")\n\n<p>tables = [row[0] for row in result.fetchall()]</p>\n\n<p>assert \'users\' in tables<br>    assert \'products\' in tables<br>    assert \'orders\' in tables</p>\n\n<p>def test_users_table_columns(postgres):<br>    \"\"\"Verifica colunas da tabela users\"\"\"<br>    result = postgres.run(\"\"\"<br>        SELECT column_name, data_type, is_nullable<br>        FROM information_schema.columns<br>        WHERE table_name = \'users\'<br>        ORDER BY ordinal_position<br>    \"\"\")</p>\n\n<p>columns = {row[0]: {\'type\': row[1], \'nullable\': row[2]} <br>               for row in result.fetchall()}</p>\n\n<p>assert \'id\' in columns<br>    assert columns[\'id\'][\'type\'] == \'integer\'<br>    assert \'email\' in columns<br>    assert columns[\'email\'][\'is_nullable\'] == \'NO\'</p>\n\n<p>def test_primary_keys(postgres):<br>    \"\"\"Verifica primary keys\"\"\"<br>    result = postgres.run(\"\"\"<br>        SELECT tc.table_name, kcu.column_name<br>        FROM information_schema.table_constraints tc<br>        JOIN information_schema.key_column_usage kcu<br>            ON tc.constraint_name = kcu.constraint_name<br>        WHERE tc.constraint_type = \'PRIMARY KEY\'<br>    \"\"\")</p>\n\n<p>primary_keys = {row[0]: row[1] for row in result.fetchall()}</p>\n\n<p>assert primary_keys[\'users\'] == \'id\'<br>    assert primary_keys[\'products\'] == \'id\'<br></code></pre></p>\n\n<h3>2. Testes de Constraints</h3>\n\n<pre><code>def test_unique_constraint_email(postgres):\n    \"\"\"Email deve ser único\"\"\"\n    # Insert primeiro usuário\n    postgres.run(\"\"\"\n        INSERT INTO users (name, email, password)\n        VALUES (\'User 1\', \'test@example.com\', \'hash\')\n    \"\"\")\n\n<p># Tentar inserir email duplicado<br>    with pytest.raises(Exception) as exc:<br>        postgres.run(\"\"\"<br>            INSERT INTO users (name, email, password)<br>            VALUES (\'User 2\', \'test@example.com\', \'hash2\')<br>        \"\"\")</p>\n\n<p>assert \'unique constraint\' in str(exc.value).lower()</p>\n\n<p>def test_foreign_key_constraint(postgres):<br>    \"\"\"Order deve referenciar user válido\"\"\"<br>    with pytest.raises(Exception):<br>        postgres.run(\"\"\"<br>            INSERT INTO orders (user_id, total)<br>            VALUES (99999, 100.00)  # user_id não existe<br>        \"\"\")</p>\n\n<p>def test_check_constraint(postgres):<br>    \"\"\"Preço deve ser positivo\"\"\"<br>    with pytest.raises(Exception):<br>        postgres.run(\"\"\"<br>            INSERT INTO products (name, price)<br>            VALUES (\'Invalid Product\', -10.00)<br>        \"\"\")</p>\n\n<p>def test_not_null_constraint(postgres):<br>    \"\"\"Nome do usuário não pode ser nulo\"\"\"<br>    with pytest.raises(Exception):<br>        postgres.run(\"\"\"<br>            INSERT INTO users (email, password)<br>            VALUES (\'test@example.com\', \'hash\')<br>        \"\"\")<br></code></pre></p>\n\n<h3>3. Testes de Queries</h3>\n\n<pre><code>def test_select_users_by_email(postgres):\n    \"\"\"Busca usuário por email\"\"\"\n    # Setup\n    postgres.run(\"\"\"\n        INSERT INTO users (name, email, password)\n        VALUES (\'João Silva\', \'joao@example.com\', \'hash\')\n    \"\"\")\n\n<p># Execute<br>    result = postgres.run(\"\"\"<br>        SELECT name, email <br>        FROM users <br>        WHERE email = \'joao@example.com\'<br>    \"\"\")</p>\n\n<p># Assert<br>    assert len(result.fetchall()) == 1<br>    row = result.fetchone()<br>    assert row[0] == \'João Silva\'<br>    assert row[1] == \'joao@example.com\'</p>\n\n<p>def test_join_orders_with_users(postgres):<br>    \"\"\"Join orders com users\"\"\"<br>    # Setup<br>    user_id = insert_user(postgres, \'João\', \'joao@example.com\')<br>    insert_order(postgres, user_id, 100.00)</p>\n\n<p># Execute<br>    result = postgres.run(\"\"\"<br>        SELECT u.name, u.email, o.total<br>        FROM users u<br>        JOIN orders o ON u.id = o.user_id<br>        WHERE u.id = :user_id<br>    \"\"\", {\'user_id\': user_id})</p>\n\n<p>row = result.fetchone()<br>    assert row[0] == \'João\'<br>    assert row[2] == 100.00</p>\n\n<p>def test_aggregate_query(postgres):<br>    \"\"\"Query com agregação\"\"\"<br>    # Setup<br>    user_id = insert_user(postgres, \'João\', \'joao@example.com\')<br>    insert_order(postgres, user_id, 100.00)<br>    insert_order(postgres, user_id, 200.00)</p>\n\n<p># Execute<br>    result = postgres.run(\"\"\"<br>        SELECT SUM(total) as total_sum, COUNT(*) as order_count<br>        FROM orders<br>        WHERE user_id = :user_id<br>    \"\"\", {\'user_id\': user_id})</p>\n\n<p>row = result.fetchone()<br>    assert row[0] == 300.00<br>    assert row[1] == 2<br></code></pre></p>\n\n<h3>4. Testes de Migrations</h3>\n\n<pre><code>import subprocess\nimport os\n\n<p>def test_migration_up(postgres):<br>    \"\"\"Executa migration up\"\"\"<br>    result = subprocess.run(<br>        [\'python\', \'manage.py\', \'migrate\'],<br>        capture_output=True,<br>        text=True<br>    )</p>\n\n<p>assert result.returncode == 0<br>    assert \'Migration complete\' in result.stdout or \'No migrations to apply\' in result.stdout</p>\n\n<p>def test_migration_down(postgres):<br>    \"\"\"Rollback migration\"\"\"<br>    migration_name = \'add_phone_to_users\'</p>\n\n<p># Rollback<br>    result = subprocess.run(<br>        [\'python\', \'manage.py\', \'migrate\', migration_name, \'down\'],<br>        capture_output=True,<br>        text=True<br>    )</p>\n\n<p>assert result.returncode == 0</p>\n\n<p># Verificar que coluna foi removida<br>    result = postgres.run(\"\"\"<br>        SELECT column_name <br>        FROM information_schema.columns <br>        WHERE table_name = \'users\' AND column_name = \'phone\'<br>    \"\"\")</p>\n\n<p>assert len(result.fetchall()) == 0</p>\n\n<p>def test_data_integrity_after_migration(postgres):<br>    \"\"\"Verifica integridade após migration\"\"\"<br>    # Setup data<br>    postgres.run(\"\"\"<br>        INSERT INTO users (name, email, password)<br>        VALUES (\'Test\', \'test@example.com\', \'hash\')<br>    \"\"\")</p>\n\n<p># Run migration<br>    subprocess.run([\'python\', \'manage.py\', \'migrate\'], check=True)</p>\n\n<p># Verify data intact<br>    result = postgres.run(\"\"\"<br>        SELECT COUNT(*) FROM users WHERE email = \'test@example.com\'<br>    \"\"\")</p>\n\n<p>assert result.fetchone()[0] == 1<br></code></pre></p>\n\n<hr>\n<h2>TestContainers para Testes de DB</h2>\n\n<pre><code># conftest.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\n\n<p>@pytest.fixture(scope=\'session\')<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as pg:<br>        # Setup schema<br>        db_url = pg.get_connection_url()</p>\n\n<p># Run migrations<br>        subprocess.run([\'python\', \'manage.py\', \'migrate\'], check=True)</p>\n\n<p>yield pg</p>\n\n<p># Teardown</p>\n\n<p>@pytest.fixture<br>def clean_db(postgres):<br>    \"\"\"Limpa dados antes de cada teste\"\"\"<br>    db = psycopg2.connect(postgres.get_connection_url())<br>    cursor = db.cursor()</p>\n\n<p># Disable triggers para speed<br>    cursor.execute(\"SET session_replication_role = \'replica\'\")</p>\n\n<p># Truncate tables (exceto immutable)<br>    cursor.execute(\"\"\"<br>        TRUNCATE TABLE orders, users, products CASCADE<br>    \"\"\")</p>\n\n<p>db.commit()<br>    cursor.close()<br>    db.close()</p>\n\n<p>yield</p>\n\n<p>@pytest.fixture<br>def sample_data(postgres, clean_db):<br>    \"\"\"Popula dados de exemplo\"\"\"<br>    db = psycopg2.connect(postgres.get_connection_url())<br>    cursor = db.cursor()</p>\n\n<p># Insert users<br>    cursor.execute(\"\"\"<br>        INSERT INTO users (name, email, password)<br>        VALUES <br>            (\'User 1\', \'user1@example.com\', \'hash1\'),<br>            (\'User 2\', \'user2@example.com\', \'hash2\')<br>        RETURNING id<br>    \"\"\")<br>    user_ids = [row[0] for row in cursor.fetchall()]</p>\n\n<p># Insert products<br>    cursor.execute(\"\"\"<br>        INSERT INTO products (name, price, stock)<br>        VALUES <br>            (\'Product A\', 10.00, 100),<br>            (\'Product B\', 20.00, 50)<br>        RETURNING id<br>    \"\"\")<br>    product_ids = [row[0] for row in cursor.fetchall()]</p>\n\n<p>db.commit()<br>    cursor.close()<br>    db.close()</p>\n\n<p>yield {<br>        \'user_ids\': user_ids,<br>        \'product_ids\': product_ids<br>    }<br></code></pre></p>\n\n<hr>\n<h2>Testes de NoSQL</h2>\n\n<h3>MongoDB</h3>\n\n<pre><code>from pymongo import MongoClient\nfrom datetime import datetime\n\n<p>@pytest.fixture<br>def mongodb():<br>    with MongoDBContainer(\"mongo:7\") as mongo:<br>        client = MongoClient(mongo.get_connection_url())<br>        yield client[\'testdb\']<br>        client.close()</p>\n\n<p>def test_mongodb_insert(mongodb):<br>    \"\"\"Insere e busca documento\"\"\"<br>    result = mongodb.users.insert_one({<br>        \'name\': \'João\',<br>        \'email\': \'joao@example.com\',<br>        \'created_at\': datetime.now()<br>    })</p>\n\n<p>assert result.inserted_id is not None</p>\n\n<p>found = mongodb.users.find_one({\'email\': \'joao@example.com\'})<br>    assert found[\'name\'] == \'João\'</p>\n\n<p>def test_mongodb_aggregation(mongodb):<br>    \"\"\"Testa aggregation pipeline\"\"\"<br>    # Insert orders<br>    mongodb.orders.insert_many([<br>        {\'user_id\': 1, \'total\': 100, \'status\': \'completed\'},<br>        {\'user_id\': 1, \'total\': 200, \'status\': \'completed\'},<br>        {\'user_id\': 2, \'total\': 50, \'status\': \'pending\'},<br>    ])</p>\n\n<p>pipeline = [<br>        {\'$match\': {\'status\': \'completed\'}},<br>        {\'$group\': {\'_id\': \'$user_id\', \'total\': {\'$sum\': \'$total\'}}}<br>    ]</p>\n\n<p>results = list(mongodb.orders.aggregate(pipeline))</p>\n\n<p>assert len(results) == 1<br>    assert results[0][\'total\'] == 300<br></code></pre></p>\n\n<h3>Redis</h3>\n\n<pre><code>import redis\n\n<p>@pytest.fixture<br>def redis_client():<br>    with RedisContainer(\"redis:7\") as redis:<br>        client = redis.get_connection_url(client_class=redis.Redis)<br>        yield client</p>\n\n<p>def test_redis_cache(redis_client):<br>    \"\"\"Testa caching com Redis\"\"\"<br>    # Set value<br>    redis_client.setex(\'user:1:name\', 3600, \'João\')</p>\n\n<p># Get value<br>    name = redis_client.get(\'user:1:name\')</p>\n\n<p>assert name == \'João\'</p>\n\n<p>def test_redis_sorted_set(redis_client):<br>    \"\"\"Testa sorted set para ranking\"\"\"<br>    # Add scores<br>    redis_client.zadd(\'leaderboard\', {\'user1\': 100, \'user2\': 200, \'user3\': 150})</p>\n\n<p># Get top 3<br>    top = redis_client.zrevrange(\'leaderboard\', 0, 2, withscores=True)</p>\n\n<p>assert top[0][0] == \'user2\'<br>    assert top[0][1] == 200<br>    assert len(top) == 3<br></code></pre></p>\n\n<hr>\n<h2>Performance Testing de Queries</h2>\n\n<pre><code>import time\n\n<p>def test_query_performance(postgres, sample_data):<br>    \"\"\"Verifica que query executa em menos de 100ms\"\"\"<br>    start = time.time()</p>\n\n<p>result = postgres.run(\"\"\"<br>        SELECT u.name, COUNT(o.id) as order_count, SUM(o.total) as total<br>        FROM users u<br>        LEFT JOIN orders o ON u.id = o.user_id<br>        GROUP BY u.id<br>        ORDER BY total DESC<br>        LIMIT 100<br>    \"\"\")</p>\n\n<p>elapsed = (time.time() - start) * 1000  # ms</p>\n\n<p>assert elapsed &lt; 100, f&quot;Query took {elapsed}ms, expected &lt; 100ms&quot;</p>\n\n<p># Log para monitoramento<br>    print(f\"Query executed in {elapsed}ms\")</p>\n\n<p>def test_index_usage(postgres):<br>    \"\"\"Verifica que índice está sendo usado\"\"\"<br>    result = postgres.run(\"\"\"<br>        EXPLAIN ANALYZE<br>        SELECT * FROM users WHERE email = \'test@example.com\'<br>    \"\"\")</p>\n\n<p>explain_output = result.fetchall()<br>    explain_text = \' \'.join([row[0] for row in explain_output])</p>\n\n<p>assert \'Index Scan\' in explain_text or \'Bitmap Index Scan\' in explain_text<br>    assert \'Seq Scan\' not in explain_text  # Bad!<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testar banco de dados é crucial para garantir integridade, performance e confiabilidade dos dados. As chaves são:<br><ol><li><strong>Testar schema</strong> - Valide estrutura</li><br><li><strong>Testar constraints</strong> - Garanta regras de negócio</li><br><li><strong>Testar queries</strong> - Verifique funcionalidade</li><br><li><strong>Testar migrations</strong> - Previna regressions</li><br><li><strong>Testar performance</strong> - Queries devem ser rápidas</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Usar TestContainers em vez de DB real?</strong>  <br>R: Sim! TestContainers oferece DB isolado, descartável e rápido para testes.</p>\n\n<p><strong>P: Como testar migrations?</strong>  <br>R: Teste UP e DOWN, verifice integridade de dados após migration.</p>\n\n<p><strong>P: Mock vs DB real para testes?</strong>  <br>R: DB real para queries complexas e joins. Mock para unit tests isolados.</p>', 'Testes de Banco de Dados: SQL, NoSQL e Data Integrity', '', 'inherit', 'closed', 'closed', '', '196-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '196', 'http://localhost:8082/ideiasti/?p=425', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('426', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a implementar testes de integração eficazes: APIs, serviços, bancos de dados e microsserviços. Guia completo com estratégias e exemplos práticos.</p>\n\n<hr>\n<h2>O Que São Testes de Integração?</h2>\n\n<p>Testes de integração verificam que diferentes módulos ou serviços funcionam corretamente quando combinados. São o meio termo entre unit tests (testam unidades isoladas) e E2E tests (testam sistema completo).</p>\n\n<h3>Quando Usar Testes de Integração</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Situação</th><th>Teste Recomendado</th></tr>\n<tr><td>Testar uma função isolada</td><td>Unit</td></tr>\n<tr><td>Testar integração API ↔ Database</td><td>Integração</td></tr>\n<tr><td>Testar múltiplos serviços juntos</td><td>Integração</td></tr>\n<tr><td>Testar fluxo completo do usuário</td><td>E2E</td></tr>\n<tr><td>Testar sistema inteiro em produção-like</td><td>Sistema</td></tr>\n</table></figure>\n\n<hr>\n<h2>Tipos de Testes de Integração</h2>\n\n<h3>1. Testes de Integração de APIs</h3>\n\n<pre><code># test_integration_api.py\nimport requests\nimport pytest\n\n<p>class TestOrderAPI:</p>\n\n<p>@pytest.fixture(autouse=True)<br>    def setup(self):<br>        self.base_url = \"http://localhost:8000/api/v1\"<br>        self.session = requests.Session()</p>\n\n<p># Setup: criar usuário de teste<br>        response = self.session.post(f\"{self.base_url}/users\", json={<br>            \"name\": \"Test User\",<br>            \"email\": f\"test_{uuid.uuid4()}@example.com\",<br>            \"password\": \"testpass123\"<br>        })<br>        self.user_id = response.json()[\"id\"]<br>        self.token = response.json()[\"token\"]<br>        self.session.headers.update({\"Authorization\": f\"Bearer {self.token}\"})</p>\n\n<p>def test_create_order_flow(self):<br>        \"\"\"Testa fluxo completo: criar usuário -&gt; adicionar produto -&gt; fazer pedido\"\"\"</p>\n\n<p># 1. Listar produtos<br>        products_response = self.session.get(f\"{self.base_url}/products\")<br>        assert products_response.status_code == 200<br>        products = products_response.json()[\"items\"]<br>        product_id = products[0][\"id\"]</p>\n\n<p># 2. Adicionar ao carrinho<br>        cart_response = self.session.post(f\"{self.base_url}/cart/items\", json={<br>            \"product_id\": product_id,<br>            \"quantity\": 2<br>        })<br>        assert cart_response.status_code == 201</p>\n\n<p># 3. Verificar carrinho<br>        cart = self.session.get(f\"{self.base_url}/cart\").json()<br>        assert len(cart[\"items\"]) == 1<br>        assert cart[\"items\"][0][\"quantity\"] == 2</p>\n\n<p># 4. Criar pedido<br>        order_response = self.session.post(f\"{self.base_url}/orders\", json={<br>            \"shipping_address\": \"Rua Teste, 123\",<br>            \"payment_method\": \"credit_card\"<br>        })<br>        assert order_response.status_code == 201<br>        order = order_response.json()</p>\n\n<p># 5. Verificar pedido criado<br>        assert order[\"status\"] == \"pending\"<br>        assert order[\"total\"] == products[0][\"price\"] * 2<br></code></pre></p>\n\n<h3>2. Testes de Integração com Banco de Dados</h3>\n\n<pre><code># test_integration_database.py\nimport psycopg2\nfrom decimal import Decimal\n\n<p>@pytest.fixture<br>def db_connection():<br>    connection = psycopg2.connect(<br>        host=\"localhost\",<br>        database=\"testdb\",<br>        user=\"test\",<br>        password=\"test\"<br>    )<br>    yield connection<br>    connection.close()</p>\n\n<p>@pytest.fixture<br>def clean_db(db_connection):<br>    \"\"\"Limpa tabelas antes de cada teste\"\"\"<br>    cursor = db_connection.cursor()</p>\n\n<p>cursor.execute(\"\"\"<br>        TRUNCATE TABLE orders, cart_items, products, users<br>        RESTART IDENTITY CASCADE<br>    \"\"\")<br>    db_connection.commit()<br>    cursor.close()</p>\n\n<p>yield db_connection</p>\n\n<p>def test_user_order_integration(clean_db):<br>    \"\"\"Testa integração usuário -&gt; pedido\"\"\"<br>    cursor = clean_db.cursor()</p>\n\n<p># 1. Criar usuário<br>    cursor.execute(\"\"\"<br>        INSERT INTO users (name, email, password_hash)<br>        VALUES ({6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s)<br>        RETURNING id<br>    \"\"\", (\"João\", \"joao@example.com\", \"hash123\"))<br>    user_id = cursor.fetchone()[0]</p>\n\n<p># 2. Criar produto<br>    cursor.execute(\"\"\"<br>        INSERT INTO products (name, price, stock)<br>        VALUES ({6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s)<br>        RETURNING id<br>    \"\"\", (\"Camiseta\", Decimal(\"49.90\"), 100))<br>    product_id = cursor.fetchone()[0]</p>\n\n<p># 3. Criar pedido<br>    cursor.execute(\"\"\"<br>        INSERT INTO orders (user_id, total, status)<br>        VALUES ({6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s)<br>        RETURNING id<br>    \"\"\", (user_id, Decimal(\"49.90\"), \"pending\"))<br>    order_id = cursor.fetchone()[0]</p>\n\n<p># 4. Verificar integridade<br>    cursor.execute(\"\"\"<br>        SELECT u.name, o.id, o.total<br>        FROM users u<br>        JOIN orders o ON u.id = o.user_id<br>        WHERE u.id = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s<br>    \"\"\", (user_id,))</p>\n\n<p>result = cursor.fetchone()<br>    assert result[0] == \"João\"<br>    assert result[1] == order_id<br>    assert result[2] == Decimal(\"49.90\")</p>\n\n<p>clean_db.commit()</p>\n\n<p>def test_product_inventory_update(clean_db):<br>    \"\"\"Testa que estoque é decrementado\"\"\"<br>    cursor = clean_db.cursor()</p>\n\n<p># Setup: criar produto com estoque 10<br>    cursor.execute(\"\"\"<br>        INSERT INTO products (name, price, stock)<br>        VALUES ({6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s)<br>        RETURNING id<br>    \"\"\", (\"Tênis\", Decimal(\"199.90\"), 10))<br>    product_id = cursor.fetchone()[0]</p>\n\n<p># Action: decrementar estoque (simula venda)<br>    cursor.execute(\"\"\"<br>        UPDATE products <br>        SET stock = stock - 2<br>        WHERE id = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s<br>    \"\"\", (product_id,))</p>\n\n<p># Assert: estoque correto<br>    cursor.execute(\"SELECT stock FROM products WHERE id = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s\", (product_id,))<br>    assert cursor.fetchone()[0] == 8<br></code></pre></p>\n\n<h3>3. Testes de Microsserviços</h3>\n\n<pre><code># test_integration_microservices.py\nimport requests\nfrom unittest.mock import patch, Mock\n\n<p>class TestOrderServiceIntegration:<br>    \"\"\"Testa integração entre Order Service e Payment/Gateway Service\"\"\"</p>\n\n<p>@pytest.fixture<br>    def mock_payment_gateway(self):<br>        \"\"\"Mock do serviço de pagamento\"\"\"<br>        with patch(\'services.payment_gateway.requests.post\') as mock:<br>            mock.return_value = Mock(<br>                status_code=200,<br>                json=lambda: {<br>                    \"transaction_id\": \"tx_123\",<br>                    \"status\": \"approved\",<br>                    \"amount\": 99.90<br>                }<br>            )<br>            yield mock</p>\n\n<p>def test_order_with_payment(self, mock_payment_gateway):<br>        \"\"\"Testa que pedido processa corretamente com pagamento\"\"\"<br>        # Call order service<br>        response = requests.post(<br>            \"http://localhost:8001/api/orders\",<br>            json={<br>                \"user_id\": 1,<br>                \"items\": [{\"product_id\": 1, \"quantity\": 1}],<br>                \"payment\": {<br>                    \"method\": \"credit_card\",<br>                    \"card_token\": \"tok_test\"<br>                }<br>            }<br>        )</p>\n\n<p>assert response.status_code == 201<br>        order = response.json()</p>\n\n<p># Verifica que pagamento foi chamado<br>        mock_payment_gateway.assert_called_once()</p>\n\n<p># Verifica resultado<br>        assert order[\"status\"] == \"confirmed\"<br>        assert \"transaction_id\" in order[\"payment\"]</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def service_containers():<br>    \"\"\"Start containers para serviços reais\"\"\"<br>    containers = {<br>        \'user_service\': start_container(\'user-service:latest\'),<br>        \'product_service\': start_container(\'product-service:latest\'),<br>        \'order_service\': start_container(\'order-service:latest\'),<br>    }</p>\n\n<p>wait_for_services(containers)</p>\n\n<p>yield containers</p>\n\n<p>stop_containers(containers)<br></code></pre></p>\n\n<h3>4. Testes de Contrato (Consumer-Driven)</h3>\n\n<pre><code># test_contract_consumer.py\nfrom pact import Consumer, Provider\n\n<p>def test_consumer_driven_contract():<br>    \"\"\"Testa contrato definido pelo consumer\"\"\"</p>\n\n<p>pact = Consumer(\'OrderService\').has_pact_with(<br>        Provider(\'ProductService\')<br>    )<br>    pact.start_service()</p>\n\n<p>try:<br>        (pact<br>         .given(\'product with id 1 exists\')<br>         .upon_receiving(\'a request for product details\')<br>         .with_request(\'GET\', \'/products/1\')<br>         .will_respond_with(200, body={<br>             \'id\': 1,<br>             \'name\': \'Test Product\',<br>             \'price\': 99.99,<br>             \'in_stock\': True<br>         })<br>         .with_request(\'GET\', \'/products/999\')<br>         .will_respond_with(404, body={<br>             \'error\': \'Product not found\'<br>         })<br>         .verify())<br>    finally:<br>        pact.stop_service()<br></code></pre></p>\n\n<hr>\n<h2>TestContainers para Integração</h2>\n\n<pre><code># conftest.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\n\n<p>@pytest.fixture(scope=\"module\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as pg:<br>        # Run migrations<br>        run_migrations(pg.get_connection_url())<br>        yield pg</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def redis():<br>    with RedisContainer(\"redis:7\") as rd:<br>        yield rd</p>\n\n<p>@pytest.fixture<br>def integration_app(postgres, redis):<br>    \"\"\"Aplica com todas dependências\"\"\"<br>    app = create_app(<br>        database_url=postgres.get_connection_url(),<br>        redis_url=redis.get_connection_url()<br>    )<br>    app.config[\'TESTING\'] = True</p>\n\n<p>with app.app_context():<br>        yield app</p>\n\n<p>@pytest.fixture<br>def clean_data(postgres):<br>    \"\"\"Limpa dados entre testes\"\"\"<br>    cursor = postgres.get_connection().cursor()<br>    cursor.execute(\"\"\"<br>        TRUNCATE TABLE orders, users, products, sessions<br>        RESTART IDENTITY CASCADE<br>    \"\"\")<br>    postgres.get_connection().commit()<br>    cursor.close()</p>\n\n<p>yield postgres<br></code></pre></p>\n\n<hr>\n<h2>Testes de Integração de Mensageria</h2>\n\n<pre><code># test_integration_messaging.py\nimport pika\nimport json\n\n<p>@pytest.fixture<br>def rabbitmq():<br>    with RabbitMQContainer(\"rabbitmq:3\") as rmq:<br>        yield rmq</p>\n\n<p>def test_message_publishing(rabbitmq):<br>    \"\"\"Testa publicação e consumo de mensagens\"\"\"<br>    connection = pika.BlockingConnection(<br>        pika.URLParameters(rabbitmq.get_connection_url())<br>    )<br>    channel = connection.channel()</p>\n\n<p># Declare queue<br>    channel.queue_declare(queue=\'order_events\', durable=True)</p>\n\n<p># Publish message<br>    message = {<br>        \'event\': \'order_created\',<br>        \'order_id\': 123,<br>        \'user_id\': 456,<br>        \'total\': 99.90<br>    }<br>    channel.basic_publish(<br>        exchange=\'\',<br>        routing_key=\'order_events\',<br>        body=json.dumps(message)<br>    )</p>\n\n<p># Consume message<br>    method, properties, body = channel.basic_get(queue=\'order_events\')<br>    received = json.loads(body)</p>\n\n<p>assert received[\'event\'] == \'order_created\'<br>    assert received[\'order_id\'] == 123</p>\n\n<p>connection.close()<br></code></pre></p>\n\n<hr>\n<h2>Estratégias de Integração</h2>\n\n<h3>Bottom-Up</h3>\n\n<pre><code>[DAL] → [BLL] → [API]\n  ↓\n testes de unidade\n</code></pre>\n\n<h3>Top-Down</h3>\n\n<pre><code>[UI] → [API] → [Services]\n  ↑\n stubs\n</code></pre>\n\n<h3>Sandwich</h3>\n\n<pre><code>[UI] → [API] → [Services] → [DAL]\n   ↑          ↓\n  stubs       drivers\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de integração são essenciais para garantir que componentes funcionam juntos. As chaves são:<br><ol><li><strong>Selecionar escopo adequado</strong> - Nem demais, nem de menos</li><br><li><strong>Usar TestContainers</strong> - Isolamento e repeatability</li><br><li><strong>Testar contratos</strong> - Consumer-driven para microservices</li><br><li><strong>Manter dados limpos</strong> - Setup e teardown</li><br><li><strong>Executar frequentemente</strong> - CI/CD integrado</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Quantos testes de integração devo ter?</strong>  <br>R: Cobertura adequada das interfaces críticas. Priorize integrações com maior risco.</p>\n\n<p><strong>P: Testes de integração são lentos?</strong>  <br>R: Sim, mas TestContainers e paralelização ajudam. Priorize velocidade.</p>\n\n<p><strong>P: Usar mocks ou serviços reais?</strong>  <br>R: Mocks para dependências externas lentas/indisponíveis. Reais para DB e cache locais.</p>', 'Testes de Integração: Conectando Componentes', '', 'inherit', 'closed', 'closed', '', '197-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '197', 'http://localhost:8082/ideiasti/?p=426', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('427', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda mutation testing: técnica avançada para avaliar e melhorar a qualidade dos testes unitários. Ferramentas e implementação prática.</p>\n\n<hr>\n<h2>O Que é Mutation Testing?</h2>\n\n<p>Mutation testing é uma técnica que avalia a qualidade dos testes unitários introduzindo pequenas mudanças (mutações) no código-fonte e verificando se os testes detectam essas mudanças.</p>\n\n<h3>Analogia</h3>\n\n<pre><code>Código Original: if (age &gt;= 18) → permitido\nMutação 1: if (age &gt; 18) → ainda passa? Bug!\nMutação 2: if (age &gt;= 0) → ainda passa? Bug!\n</code></pre>\n\n<p>Se seus testes passam mesmo com mutações, eles não estão realmente testando o código.</p>\n\n<hr>\n<h2>Por Que Mutation Testing?</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Com Coverage Tradicional</th><th>Com Mutation Testing</th></tr>\n<tr><td><strong>O que mede</strong></td><td>Linhas executadas</td><td>Testes que detectam bugs</td></tr>\n<tr><td><strong>Confiança</strong></td><td>Baixa</td><td>Alta</td></tr>\n<tr><td><strong>Bug detection</strong></td><td>Não verifica</td><td>Verifica</td></tr>\n</table></figure>\n\n<h3>Como Funciona</h3>\n<ol><li><strong>Generate Mutations</strong>: Criar variantes do código</li>\n<li><strong>Run Tests</strong>: Executar suite contra cada mutante</li>\n<li><strong>Classify Results</strong>: Identificar se mutante foi \"matado\"</li>\n<li><strong>Calculate Score</strong>: {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de mutantes mortos</li>\n</ol>\n<hr>\n<h2>Tipos de Mutações</h2>\n\n<h3>Arithmetic Mutations</h3>\n\n<pre><code># Original\nresult = a + b\n\n<p># Mutations<br>result = a - b    # +<br>result = a * b    # +<br>result = a / b    # +<br>result = a ** b   # +<br>result = a {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} b    # +<br></code></pre></p>\n\n<h3>Relational Mutations</h3>\n\n<pre><code># Original\nif (x &gt; 10)\n\n<p># Mutations<br>if (x &gt;= 10)    # &gt;<br>if (x <br>if (x <br>if (x == 10)    # &gt;<br>if (x != 10)    # &gt;<br></code></pre></p>\n\n<h3>Logical Mutations</h3>\n\n<pre><code># Original\nif (is_valid and has_permission)\n\n<p># Mutations<br>if (is_valid or has_permission)      # and → or<br>if (not is_valid and has_permission) # negação<br>if (is_valid and not has_permission) # negação<br></code></pre></p>\n\n<h3>Conditional Boundary</h3>\n\n<pre><code># Original\nwhile (count &lt; 100)\n\n<p># Mutations<br>while (count &lt;= 100)    # &lt; → &lt;=<br>while (count &gt; 100)     # <br></code></pre></p>\n\n<hr>\n<h2>Ferramentas de Mutation Testing</h2>\n\n<h3>Para Diferentes Linguagens</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Ferramentas</th></tr>\n<tr><td><strong>Python</strong></td><td>mutmut, Cosmic Ray, mutatest</td></tr>\n<tr><td><strong>Java</strong></td><td>PITest (pitest)</td></tr>\n<tr><td><strong>JavaScript</strong></td><td>Stryker Mutator</td></tr>\n<tr><td><strong>C#</strong></td><td>NinjaTurtles, Pitest.NET</td></tr>\n<tr><td><strong>Ruby</strong></td><td>Mutant</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementação Prática</h2>\n\n<h3>Python com mutmut</h3>\n\n<pre><code># Instalação\npip install mutmut\n\n<p># Configuração (pyproject.toml ou .mutmut.toml)<br>[mutmut]<br>paths_to_mutate = src/<br>test_command = pytest -x<br>backup_command = git checkout<br></code></pre></p>\n\n<pre><code># Executar mutation testing\nmutmut run\n\n<p># Ver resultados<br>mutmut results</p>\n\n<p># Mostrar mutants sobrevientes<br>mutmut show survived<br></code></pre></p>\n\n<pre><code># Exemplo: Código a ser testado\n# src/calculator.py\ndef calcular_desconto(valor: float, percentual: float) -&gt; float:\n    \"\"\"Aplica desconto percentual a um valor.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual não pode exceder 100\")\n\n<p>desconto = valor * (percentual / 100)<br>    return valor - desconto</p>\n\n<p># src/test_calculator.py<br>import pytest<br>from calculator import calcular_desconto</p>\n\n<p>def test_desconto_basico():<br>    \"\"\"Testa desconto simples de 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\"\"<br>    assert calcular_desconto(100, 10) == 90.0</p>\n\n<p>def test_desconto_zero():<br>    \"\"\"Testa que desconto de 0{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} mantém valor\"\"\"<br>    assert calcular_desconto(100, 0) == 100.0</p>\n\n<p>def test_desconto_100_porcento():<br>    \"\"\"Testa que desconto de 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} retorna 0\"\"\"<br>    assert calcular_desconto(100, 100) == 0.0</p>\n\n<p>def test_desconto_negativo_deve_falhar():<br>    \"\"\"Desconto negativo deve lançar erro\"\"\"<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, -10)</p>\n\n<p>def test_desconto_acima_100_deve_falhar():<br>    \"\"\"Desconto acima de 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} deve lançar erro\"\"\"<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 110)<br></code></pre></p>\n\n<h3>Java com PITest</h3>\n\n<pre><code><!-- pom.xml -->\n\n    org.pitest\n    pitest-maven\n    1.15.8\n    \n        \n            org.pitest\n            pitest-junit5-plugin\n            1.15.8\n        \n    \n    \n        \n            com.example.*\n        \n        \n            com.example.*Test\n        \n    \n\n</code></pre>\n\n<pre><code># Executar\nmvn org.pitest:pitest-maven:mutationCoverage\n</code></pre>\n\n<h3>JavaScript com Stryker</h3>\n\n<pre><code># Instalação\nnpm install -D @stryker-mutator/core\n\n<p># Configuração (stryker.conf.js)<br>module.exports = {<br>  testRunner: \'jest\',<br>  mutate: [\'src/<em>*/</em>.js\'],<br>  reporters: [\'html\', \'clear-text\'],<br>  jest: {<br>    projectType: \'react\'<br>  }<br>}<br></code></pre></p>\n\n<pre><code># Executar\nnpx stryker run\n</code></pre>\n\n<hr>\n<h2>Interpretando Resultados</h2>\n\n<h3>Score de Mutação</h3>\n\n<pre><code>Mutation Score = (Mutantes Mortos / Total de Mutantes) × 100\n\n<p>Interpretação:<br><ul><li>90-100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: Excelente (muitos bugs detectados)</li><ol><li>80-90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: Bom</li><br><li>60-80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: Precisa melhorar</li><br><li>&lt;60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: Suite fraca</li><br></ol></code></pre></p>\n\n<h3>Exemplo de Relatório</h3>\n\n<pre><code>=============== MUTATION TESTING ===============\n\n<p>Total Mutants: 25<br>Killed: 23<br>Survived: 2<br>Timeout: 0<br>Skipped: 0</p>\n\n<p>Score: 92{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</p>\n\n<p>=============== SURVIVING MUTANTS ===============<br><ol><li>src/calculator.py:32</li><br></ol>   - Changed &gt; to &gt;=<br>   - Still passes: test_desconto_100_porcento<br>   <ol><li>src/validator.py:45</li><br></ol>   - Changed &amp;&amp; to ||<br>   - Still passes: test_validate_multiple_conditions</p>\n\n<p>=============== RECOMMENDATIONS ===============<br><ol><li>Adicione teste para valor exatamente 18</li><br><li>Teste edge case para validação AND/OR</li></ol></ul><br></code></pre></p>\n\n<hr>\n<h2>Melhores Práticas</h2>\n\n<h3>1. Combine com Code Coverage</h3>\n\n<pre><code># Mutation testing complementa coverage\n# Coverage 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} não significa testes bons\n# Mutation testing revela gaps\n</code></pre>\n\n<h3>2. Priorize Módulos Críticos</h3>\n\n<pre><code># Execute mutation testing em módulos críticos\nmutmut run --paths src/payment/,src/auth/\n</code></pre>\n\n<h3>3. Corrija Mutantes Sobrevientes</h3>\n\n<pre><code># Mutante sobreviente indica teste fraco\ndef test_critical_path():\n    # Este teste não detecta mudança de &gt; para &gt;=\n    result = processar_idade(18)\n    assert result == \"adulto\"  # Passa mesmo com &gt;=\n\n<p># Adicione edge case<br>def test_critical_path_18_anos():<br>    result = processar_idade(18)<br>    assert result == \"adulto\"<br>    assert processar_idade(17) != \"adulto\"  # Detecta mudança &gt; para &gt;=<br></code></pre></p>\n\n<h3>4. Automatize no CI</h3>\n\n<pre><code># GitHub Actions\nname: Mutation Testing\n\n<p>on:<br>  schedule:<br>    - cron: \'0 2 <em> </em> 0\'  # Semanalmente</p>\n\n<p>jobs:<br>  mutation:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run mutation tests<br>        run: |<br>          pip install mutmut<br>          mutmut run --paths-to-mutate src/<br>          mutmut results</p>\n\n<p>- name: Check score<br>        run: |<br>          SCORE=$(mutmut results --only-result)<br>          if [ \"$SCORE\" -lt 80 ]; then<br>            echo \"Mutation score below 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: $SCORE\"<br>            exit 1<br>          fi<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Mutation testing é uma técnica poderosa para avaliar qualidade real dos testes. As chaves são:<br><ol><li><strong>Entender conceito</strong> - Muta código, verifica se testes detectam</li><br><li><strong>Usar ferramentas</strong> - mutmut, PITest, Stryker</li><br><li><strong>Interpretar resultados</strong> - Score alto = testes fortes</li><br><li><strong>Criar testes para mutantes sobrevientes</strong> - Melhoria contínua</li><br><li><strong>Automatizar</strong> - Execute regularmente no CI</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Mutation testing substitui coverage?</strong>  <br>R: Não. Coverage mostra linhas executadas; mutation mostra se testes detectam bugs.</p>\n\n<p><strong>P: É lento?</strong>  <br>R: Sim! Pode ser 10-100x mais lento que testes normais. Use CI/discrete.</p>\n\n<p><strong>P: Qual score é bom?</strong>  <br>R: 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}+ é bom, 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}+ é excelente.</p>\n\n<p><strong>P: Vale o esforço?</strong>  <br>R: Para código crítico, sim. Para código simples, talvez não.</p>', 'Mutation Testing: Melhorando a Qualidade dos Testes', '', 'inherit', 'closed', 'closed', '', '198-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '198', 'http://localhost:8082/ideiasti/?p=427', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('428', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda visual regression testing: screenshots comparison, ferramentas como Applitools, Percy e Cypress Percy. Como detectar mudanças visuais automaticamente.</p>\n\n<hr>\n<h2>O Que É Visual Regression Testing?</h2>\n\n<p>Visual regression testing captura screenshots de interfaces e os compara com baselines para detectar mudanças visuais não intencionais (regressões).</p>\n\n<h3>Por Que Importa?</h3>\n\n<ul><li>Detectar mudanças em CSS/HTML</li><ol><li>Prevenir \"pixel perfect\" regressions</li>\n<li>Garantir consistência cross-browser</li>\n<li>Automatizar verificação de design</li></ol></ul>\n\n<hr>\n<h2>Abordagens</h2>\n\n<h3>1. Pixel-to-Pixel Comparison</h3>\n\n<pre><code># Simple screenshot comparison\nimport PIL.Image\nimport numpy as np\n\n<p>def compare_images(baseline_path, current_path):<br>    baseline = PIL.Image.open(baseline_path)<br>    current = PIL.Image.open(current_path)</p>\n\n<p># Convert to numpy arrays<br>    baseline_array = np.array(baseline)<br>    current_array = np.array(current)</p>\n\n<p># Calculate difference<br>    diff = np.abs(baseline_array.astype(float) - current_array.astype(float))</p>\n\n<p># Count different pixels<br>    different_pixels = np.sum(diff &gt; 0)<br>    total_pixels = diff.size</p>\n\n<p>change_percentage = (different_pixels / total_pixels) * 100</p>\n\n<p>return {<br>        \'match\': change_percentage &lt; 0.1,  # Less than 0.1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} change<br>        \'change_percentage\': change_percentage,<br>        \'different_pixels\': different_pixels<br>    }<br></code></pre></p>\n\n<h3>2. DOM-based Comparison</h3>\n\n<pre><code>// Playwright com screenshot comparison\nconst { chromium } = require(\'playwright\');\n\n<p>async function compareScreenshots(page, url, selector) {<br>    // Baseline<br>    await page.goto(url);<br>    await page.waitForSelector(selector);<br>    const baseline = await page.locator(selector).screenshot();</p>\n\n<p>// Current<br>    await page.goto(url);<br>    await page.waitForSelector(selector);<br>    const current = await page.locator(selector).screenshot();</p>\n\n<p>// Compare<br>    return await page.evaluate(([b, c]) =&gt; {<br>        // Canvas comparison<br>        const canvas = document.createElement(\'canvas\');<br>        // ... comparison logic<br>    }, [baseline, current]);<br>}<br></code></pre></p>\n\n<hr>\n<h2>Ferramentas</h2>\n\n<h3>Applitools (Líder de Mercado)</h3>\n\n<pre><code># pytest + Applitools\nfrom applitools.selenium import Eyes, RunnerOptions\nfrom selenium import webdriver\n\n<p>@pytest.fixture<br>def eyes():<br>    eyes = Eyes(RunnerOptions().test_name(\"Login Page\"))<br>    eyes.api_key = \"YOUR_API_KEY\"<br>    eyes.force_full_page_screenshot = True<br>    yield eyes</p>\n\n<p>@pytest.fixture<br>def driver(eyes):<br>    driver = webdriver.Chrome()<br>    driver.get(\"https://example.com\")<br>    yield driver<br>    eyes.abort_async()<br>    driver.quit()</p>\n\n<p>def test_login_page_visual(driver, eyes):<br>    eyes.open(driver, \"MyApp\", \"Login Page Test\")<br>    driver.get(\"https://example.com/login\")<br>    eyes.check_window(\"Login Form\")<br>    eyes.close_async()<br></code></pre></p>\n\n<pre><code>// Java/Selenium + Applitools\nimport com.applitools.eyes.selenium.Eyes;\nimport org.openqa.selenium.WebDriver;\n\n<p>@ExtendWith(ApplitoolsFieldExtension.class)<br>class VisualTests {</p>\n\n<p>@Eyes<br>    Eyes eyes;</p>\n\n<p>@Test<br>    void loginPageTest(WebDriver driver) {<br>        driver.get(\"https://example.com/login\");<br>        eyes.checkWindow(\"Login Form\");</p>\n\n<p>// Fill form<br>        driver.findElement(By.id(\"email\")).sendKeys(\"test@example.com\");<br>        eyes.checkWindow(\"Form Filled\");</p>\n\n<p>// Submit<br>        driver.findElement(By.id(\"submit\")).click();<br>        eyes.checkWindow(\"After Submit\");<br>    }<br>}<br></code></pre></p>\n\n<h3>Cypress Percy</h3>\n\n<pre><code># Instalação\nnpm install @percy/cypress --save-dev\n</code></pre>\n\n<pre><code>// cypress/integration/visual.spec.js\nimport { percySnapshot } from \'@percy/cypress\';\n\n<p>describe(\'Visual Regression\', () =&gt; {<br>    it(\'homepage looks correct\', () =&gt; {<br>        cy.visit(\'/\');<br>        percySnapshot(\'Homepage\');<br>    });</p>\n\n<p>it(\'login page\', () =&gt; {<br>        cy.visit(\'/login\');<br>        percySnapshot(\'Login Page\', { widths: [768, 1280, 1920] });<br>    });</p>\n\n<p>it(\'product page with different themes\', () =&gt; {<br>        cy.visit(\'/product/1\');</p>\n\n<p>// Light theme<br>        percySnapshot(\'Product Page - Light\');</p>\n\n<p>// Dark theme<br>        cy.get(\'[data-theme=\"dark\"]\').click();<br>        percySnapshot(\'Product Page - Dark\');<br>    });<br>});<br></code></pre></p>\n\n<h3>Playwright + Screenshot Comparison</h3>\n\n<pre><code>// playwright.config.js\nconst { defineConfig } = require(\'@playwright/test\');\n\n<p>module.exports = defineConfig({<br>    testDir: \'./visual-tests\',<br>    screenshotDir: \'./screenshots\',<br>    updateSnapshots: process.argv.includes(\'--update-snapshots\')<br>});</p>\n\n<p>// visual-tests/homepage.spec.js<br>const { test, expect } = require(\'@playwright/test\');</p>\n\n<p>test(\'homepage visual\', async ({ page }) =&gt; {<br>    await page.goto(\'https://example.com\');<br>    await page.waitForLoadState(\'networkidle\');</p>\n\n<p>const screenshot = await page.screenshot();</p>\n\n<p>// Compare with baseline<br>    const baseline = await page.goto(\'https://example.com\');<br>    const baselineScreenshot = await baseline.screenshot();</p>\n\n<p>const match = await page.evaluate(<br>        ([current, baseline]) =&gt; {<br>            // Simple diff percentage<br>            return current.length === baseline.length;<br>        },<br>        [screenshot, baselineScreenshot]<br>    );</p>\n\n<p>expect(match).toBeTruthy();<br>});<br></code></pre></p>\n\n<hr>\n<h2>Configuração por Framework</h2>\n\n<h3>Cypress com cypress-image-snapshot</h3>\n\n<pre><code>npm install --save-dev cypress-image-snapshot\n</code></pre>\n\n<pre><code>// cypress/support/index.js\nconst { addMatchImageSnapshotCommand } = require(\'cypress-image-snapshot/command\');\naddMatchImageSnapshotCommand({\n    failureThreshold: 0.03,\n    failureThresholdType: \'percent\',\n    customSnapshotsDir: \'./cypress/snapshots\'\n});\n\n<p>Cypress.Commands.add(\'getByTestId\', (testId) =&gt; {<br>    return cy.get(<code>[data-testid=\"${testId}\"]</code>);<br>});<br></code></pre></p>\n\n<pre><code>// cypress/integration/button.spec.js\ndescribe(\'Button Component\', () =&gt; {\n    it(\'primary button renders correctly\', () =&gt; {\n        cy.visit(\'/button\');\n        cy.getByTestId(\'primary-button\')\n            .matchImageSnapshot(\'primary-button-default\');\n    });\n\n<p>it(\'button hover state\', () =&gt; {<br>        cy.visit(\'/button\');<br>        cy.getByTestId(\'primary-button\')<br>            .trigger(\'mouseover\')<br>            .matchImageSnapshot(\'primary-button-hover\');<br>    });</p>\n\n<p>it(\'button disabled state\', () =&gt; {<br>        cy.visit(\'/button?disabled=true\');<br>        cy.getByTestId(\'primary-button\')<br>            .matchImageSnapshot(\'primary-button-disabled\');<br>    });<br>});<br></code></pre></p>\n\n<h3>Jest com jest-image-snapshot</h3>\n\n<pre><code>npm install --save-dev jest-image-snapshot\n</code></pre>\n\n<pre><code>// setupTests.js\nconst { toMatchImageSnapshot } = require(\'jest-image-snapshot\');\n\n<p>expect.extend({ toMatchImageSnapshot });</p>\n\n<p>// Component.test.jsx<br>import { render } from \'@testing-library/react\';<br>import Button from \'./Button\';</p>\n\n<p>test(\'Button renders correctly\', () =&gt; {<br>    const { container } = render(<Button>Click me</Button>);</p>\n\n<p>expect(container.firstChild).toMatchImageSnapshot({<br>        customSnapshotIdentifier: \'button-default\'<br>    });<br>});<br></code></pre></p>\n\n<hr>\n<h2>Estratégias de Visual Testing</h2>\n\n<h3>1. Full Page vs Component</h3>\n\n<pre><code>// Full page - everything\ncy.visit(\'/homepage\');\ncy.percySnapshot(\'Homepage Full\');\n\n<p>// Specific component<br>cy.visit(\'/homepage\');<br>cy.percySnapshot(\'Homepage Header\', {<br>    blackout: [\'.ads\', \'.sidebar\']  // Ignore dynamic content<br>});</p>\n\n<p>// Specific element<br>cy.get(\'.main-content\')<br>    .percySnapshotElement(\'Main Content Only\');<br></code></pre></p>\n\n<h3>2. Responsive Testing</h3>\n\n<pre><code>const viewports = [\n    { name: \'mobile\', width: 375, height: 667 },\n    { name: \'tablet\', width: 768, height: 1024 },\n    { name: \'desktop\', width: 1280, height: 720 },\n    { name: \'large\', width: 1920, height: 1080 }\n];\n\n<p>viewports.forEach(viewport =&gt; {<br>    it(<code>renders correctly on ${viewport.name}</code>, () =&gt; {<br>        cy.viewport(viewport.width, viewport.height);<br>        cy.visit(\'/\');<br>        cy.percySnapshot(<code>${viewport.name}-homepage</code>);<br>    });<br>});<br></code></pre></p>\n\n<h3>3. Ignore Dynamic Content</h3>\n\n<pre><code>// Applitools - Ignore regions\neyes.checkWindow(\'Dashboard\', {\n    ignore: [\n        { element: \'#dynamic-widget-1\' },\n        { element: \'#ads-banner\' },\n        { region: { left: 0, top: 0, width: 200, height: 100 } }\n    ]\n});\n\n<p>// Percy - Blackout<br>cy.percySnapshot(\'Dashboard\', {<br>    blackout: [\'[data-testid=\"ad-banner\"]\', \'.cookie-consent\']<br>});<br></code></pre></p>\n\n<hr>\n<h2>CI/CD Integration</h2>\n\n<pre><code># GitHub Actions\nname: Visual Regression Tests\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  visual-tests:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Percy<br>        uses: browser-actions/run-percy@latest<br>        with:<br>          percy-token: ${{ secrets.PERCY_TOKEN }}</p>\n\n<p>- name: Run visual tests<br>        run: npm run test:visual</p>\n\n<p>- name: Upload snapshots<br>        uses: actions/upload-artifact@v4<br>        if: failure()<br>        with:<br>          name: visual-diffs<br>          path: visual-test-results/<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Visual regression testing detecta mudanças visuais automaticamente. As chaves são:<br><ol><li><strong>Escolher ferramenta</strong> - Applitools, Percy, oubuilt-in</li><br><li><strong>Configurar ignores</strong> - Ignorar conteúdo dinâmico</li><br><li><strong>Testar responsivo</strong> - Múltiplos viewports</li><br><li><strong>Integrar CI</strong> - Executar em cada PR</li><br><li><strong>Revisar diffs</strong> - Aprovar ou corrigir</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Como lidar com conteúdo dinâmico?</strong>  <br>R: Use blackout/ignore para elementos variáveis.</p>\n\n<p><strong>P: Qual threshold usar?</strong>  <br>R: 0.1-3{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dependendo da tolerância. Testes strict = 0{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}.</p>\n\n<p><strong>P: Atualizar snapshots automaticamente?</strong>  <br>R: Apenas quando mudanças são intencionais, com code review.</p>', 'Visual Regression Testing: Detectando Mudanças Visuais', '', 'inherit', 'closed', 'closed', '', '199-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '199', 'http://localhost:8082/ideiasti/?p=428', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('429', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Domine Selenium WebDriver: setup, locators, Page Objects, waits, debugging e melhores práticas para automação de testes web.</p>\n\n<hr>\n<h2>Introdução ao Selenium WebDriver</h2>\n\n<p>Selenium WebDriver é a ferramenta mais popular para automação de testes web. Permite controlar browsers programaticamente para executar ações e verificar resultados.</p>\n\n<h3>Arquitetura</h3>\n\n<pre><code>┌─────────────┐    JSON Wire Protocol    ┌─────────────┐\n│    Tests    │ ←──────────────────────→ │   Browser   │\n│  (Python)   │                          │  (Chrome)   │\n└─────────────┘                          └─────────────┘\n       ↑                                        ↑\n       │                                        │\n       └────────── WebDriver API ───────────────┘\n</code></pre>\n\n<hr>\n<h2>Setup</h2>\n\n<h3>Instalação</h3>\n\n<pre><code># Python\npip install selenium webdriver-manager\n\n<p># Java<br><br>    org.seleniumhq.selenium<br>    selenium-java<br>    4.15.0<br></p>\n\n<p># JavaScript<br>npm install selenium-webdriver<br></code></pre></p>\n\n<h3>Setup Rápido</h3>\n\n<pre><code>from selenium import webdriver\nfrom selenium.webdriver.chrome.service import Service\nfrom webdriver_manager.chrome import ChromeDriverManager\n\n<p># Setup automático<br>driver = webdriver.Chrome(<br>    service=Service(ChromeDriverManager().install())<br>)</p>\n\n<p>driver.get(\"https://example.com\")<br>print(driver.title)<br>driver.quit()<br></code></pre></p>\n\n<hr>\n<h2>Locators</h2>\n\n<h3>Priority de Locators</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Prioridade</th><th>Locator</th><th>Exemplo</th><th>Confiabilidade</th></tr>\n<tr><td>1</td><td>ID</td><td><code>By.ID, \"username\"</code></td><td>Mais confiável</td></tr>\n<tr><td>2</td><td>Name</td><td><code>By.NAME, \"email\"</code></td><td>Bom</td></tr>\n<tr><td>3</td><td>Data Test ID</td><td><code>By.CSS, \"[data-testid=\'btn\']\"</code></td><td>Excelente</td></tr>\n<tr><td>4</td><td>Class</td><td><code>By.CLASS_NAME, \"btn-primary\"</code></td><td>Médio</td></tr>\n<tr><td>5</td><td>XPath</td><td><code>By.XPATH, \"//button[@id=\'submit\']\"</code></td><td>Flexível</td></tr>\n<tr><td>6</td><td>CSS</td><td><code>By.CSS_SELECTOR, \"#submit\"</code></td><td>Rápido</td></tr>\n<tr><td>7</td><td>Link Text</td><td><code>By.LINK_TEXT, \"Click here\"</code></td><td>Texto âncora</td></tr>\n<tr><td>8</td><td>Partial Link</td><td><code>By.PARTIAL_LINK_TEXT, \"here\"</code></td><td>Texto parcial</td></tr>\n</table></figure>\n\n<h3>Exemplos de Locators</h3>\n\n<pre><code>from selenium.webdriver.common.by import By\n\n<p># By ID (mais rápido)<br>driver.find_element(By.ID, \"username\")<br>driver.find_element(By.ID, \"password\")<br>driver.find_element(By.ID, \"login-button\")</p>\n\n<p># By Name<br>driver.find_element(By.NAME, \"email\")<br>driver.find_element(By.NAME, \"search\")</p>\n\n<p># By XPath (absoluto - evitar)<br>driver.find_element(By.XPATH, \"/html/body/div[2]/form/input[1]\")</p>\n\n<p># XPath relativo (preferir)<br>driver.find_element(By.XPATH, \"//input[@id=\'username\']\")<br>driver.find_element(By.XPATH, \"//button[contains(text(), \'Login\')]\")<br>driver.find_element(By.XPATH, \"//div[@class=\'form\']//input[@name=\'email\']\")</p>\n\n<p># XPath com múltiplas condições<br>driver.find_element(By.XPATH, <br>    \"//button[@type=\'submit\' and contains(@class, \'btn-primary\')]\")</p>\n\n<p># CSS Selector<br>driver.find_element(By.CSS_SELECTOR, \"#username\")<br>driver.find_element(By.CSS_SELECTOR, \".form-group .form-control\")<br>driver.find_element(By.CSS_SELECTOR, \"input[name=\'email\']\")<br>driver.find_element(By.CSS_SELECTOR, \"button[type=\'submit\']\")</p>\n\n<p># Link Text<br>driver.find_element(By.LINK_TEXT, \"Forgot Password?\")<br>driver.find_element(By.PARTIAL_LINK_TEXT, \"Forgot\")</p>\n\n<p># Data Test ID (recomendado para testes)<br>driver.find_element(By.CSS_SELECTOR, \"[data-testid=\'login-button\']\")<br></code></pre></p>\n\n<p>###Locator Strategies</p>\n\n<pre><code># Hierarquia de preferências\nLOCATOR_STRATEGY = [\n    (\"data-testid\", lambda x: By.CSS_SELECTOR, f\"[data-testid=\'{x}\']\"),\n    (\"id\", lambda x: By.ID, x),\n    (\"name\", lambda x: By.NAME, x),\n    (\"aria-label\", lambda x: By.CSS_SELECTOR, f\"[aria-label=\'{x}\']\"),\n    (\"text\", lambda x: By.XPATH, f\"//*[contains(text(), \'{x}\')]\"),\n    (\"css\", lambda x: By.CSS_SELECTOR, x),\n]\n\n<p>def find_element(driver, locator_type, locator_value):<br>    \"\"\"Encontra elemento usando estratégia otimizada\"\"\"<br>    by, value = LOCATOR_STRATEGY<a href=\"locator_value\">locator_type</a><br>    return driver.find_element(by, value)<br></code></pre></p>\n\n<hr>\n<h2>Interações Básicas</h2>\n\n<pre><code># Navegação\ndriver.get(\"https://example.com\")\ndriver.back()\ndriver.forward()\ndriver.refresh()\ndriver.title  # Page title\ndriver.current_url  # Current URL\n\n<p># Localizar e interagir<br>element = driver.find_element(By.ID, \"username\")<br>element.send_keys(\"user@example.com\")<br>element.clear()</p>\n\n<p># Click<br>driver.find_element(By.ID, \"submit-button\").click()</p>\n\n<p># Dropdowns<br>from selenium.webdriver.support.ui import Select</p>\n\n<p>dropdown = Select(driver.find_element(By.ID, \"country\"))<br>dropdown.select_by_visible_text(\"Brazil\")<br>dropdown.select_by_value(\"br\")<br>dropdown.select_by_index(1)</p>\n\n<p># Checkboxes<br>checkbox = driver.find_element(By.ID, \"accept-terms\")<br>if not checkbox.is_selected():<br>    checkbox.click()</p>\n\n<p># Radio buttons<br>radio = driver.find_element(By.CSS_SELECTOR, \"input[name=\'plan\'][value=\'premium\']\")<br>if not radio.is_selected():<br>    radio.click()<br></code></pre></p>\n\n<hr>\n<h2>Waits</h2>\n\n<h3>Wait Implícito vs Explícito</h3>\n\n<pre><code># ❌ NÃO USE: Wait implícito (global, aplicado a todos)\ndriver.implicitly_wait(10)  # Espera 10s para cada elemento\n\n<p># ✅ USE: Wait explícito (específico por situação)<br>from selenium.webdriver.support.ui import WebDriverWait<br>from selenium.webdriver.support import expected_conditions as EC</p>\n\n<p># Espera elemento ficar clicável<br>button = WebDriverWait(driver, 10).until(<br>    EC.element_to_be_clickable((By.ID, \"submit\"))<br>)<br>button.click()<br></code></pre></p>\n\n<h3>Expected Conditions</h3>\n\n<pre><code>from selenium.webdriver.support import expected_conditions as EC\n\n<p># Elemento presente no DOM<br>EC.presence_of_element_located((By.ID, \"username\"))</p>\n\n<p># Elemento visível<br>EC.visibility_of_element_located((By.ID, \"welcome-message\"))</p>\n\n<p># Elemento clicável<br>EC.element_to_be_clickable((By.ID, \"submit-button\"))</p>\n\n<p># Texto presente<br>EC.text_to_be_present_in_element((By.CLASS_NAME, \"message\"), \"Success\")</p>\n\n<p># URL contém<br>EC.url_contains(\"dashboard\")</p>\n\n<p># Título contém<br>EC.title_contains(\"Dashboard\")</p>\n\n<p># Nova janela abre<br>EC.new_window_is_opened(original_handles)</p>\n\n<p># Alerta presente<br>EC.alert_is_present()</p>\n\n<p># Loading spinners disappear<br>EC.invisibility_of_element_located((By.CLASS_NAME, \"spinner\"))<br></code></pre></p>\n\n<h3>Wait Customizado</h3>\n\n<pre><code># Wait para elemento com texto específico\ndef wait_for_text(driver, locator, text, timeout=10):\n    \"\"\"Espera até elemento conter texto específico\"\"\"\n    return WebDriverWait(driver, timeout).until(\n        EC.text_to_be_present_in_element(locator, text)\n    )\n\n<p># Wait para página carregar completamente<br>def wait_for_page_load(driver, timeout=30):<br>    \"\"\"Espera documento.readyState ser \'complete\'\"\"\"<br>    def document_ready(driver):<br>        return driver.execute_script(\"return document.readyState\") == \"complete\"<br>    WebDriverWait(driver, timeout).until(document_ready)</p>\n\n<p># Wait para requisição AJAX<br>def wait_for_ajax(driver, timeout=10):<br>    \"\"\"Espera requisições AJAX terminarem\"\"\"<br>    def ajax_complete(driver):<br>        return driver.execute_script(<br>            \"return jQuery.active == 0\"<br>        )<br>    WebDriverWait(driver, timeout).until(ajax_complete)<br></code></pre></p>\n\n<hr>\n<h2>Page Object Pattern</h2>\n\n<pre><code># pages/base_page.py\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n<p>class BasePage:<br>    def __init__(self, driver):<br>        self.driver = driver<br>        self.wait = WebDriverWait(driver, 10)</p>\n\n<p>def _find(self, locator):<br>        return self.wait.until(<br>            EC.presence_of_element_located(locator)<br>        )</p>\n\n<p>def _click(self, locator):<br>        self.wait.until(<br>            EC.element_to_be_clickable(locator)<br>        ).click()</p>\n\n<p>def _input(self, locator, text):<br>        element = self.wait.until(<br>            EC.presence_of_element_located(locator)<br>        )<br>        element.clear()<br>        element.send_keys(text)</p>\n\n<p>def _get_text(self, locator):<br>        return self.wait.until(<br>            EC.visibility_of_element_located(locator)<br>        ).text</p>\n\n<p>def is_displayed(self, locator):<br>        try:<br>            return self.wait.until(<br>                EC.visibility_of_element_located(locator)<br>            ).is_displayed()<br>        except:<br>            return False</p>\n\n<p># pages/login_page.py<br>from selenium.webdriver.common.by import By<br>from .base_page import BasePage</p>\n\n<p>class LoginPage(BasePage):<br>    URL = \"https://example.com/login\"</p>\n\n<p># Locators<br>    EMAIL_INPUT = (By.ID, \"email\")<br>    PASSWORD_INPUT = (By.ID, \"password\")<br>    LOGIN_BUTTON = (By.ID, \"login-button\")<br>    ERROR_MESSAGE = (By.CLASS_NAME, \"error-message\")<br>    FORGOT_PASSWORD_LINK = (By.LINK_TEXT, \"Forgot Password?\")</p>\n\n<p>def load(self):<br>        self.driver.get(self.URL)<br>        return self</p>\n\n<p>def login(self, email, password):<br>        self._input(self.EMAIL_INPUT, email)<br>        self._input(self.PASSWORD_INPUT, password)<br>        self._click(self.LOGIN_BUTTON)<br>        from pages.dashboard_page import DashboardPage<br>        return DashboardPage(self.driver)</p>\n\n<p>def get_error_message(self):<br>        return self._get_text(self.ERROR_MESSAGE)</p>\n\n<p>def click_forgot_password(self):<br>        self._click(self.FORGOT_PASSWORD_LINK)<br>        from pages.forgot_password_page import ForgotPasswordPage<br>        return ForgotPasswordPage(self.driver)</p>\n\n<p># pages/dashboard_page.py<br>from .base_page import BasePage<br>from selenium.webdriver.common.by import By</p>\n\n<p>class DashboardPage(BasePage):<br>    WELCOME_MESSAGE = (By.CLASS_NAME, \"welcome-message\")<br>    USER_NAME = (By.CSS_SELECTOR, \"[data-testid=\'user-name\']\")<br>    LOGOUT_BUTTON = (By.ID, \"logout-button\")</p>\n\n<p>def get_welcome_message(self):<br>        return self._get_text(self.WELCOME_MESSAGE)</p>\n\n<p>def get_user_name(self):<br>        return self._get_text(self.USER_NAME)</p>\n\n<p>def logout(self):<br>        self._click(self.LOGOUT_BUTTON)<br>        from pages.login_page import LoginPage<br>        return LoginPage(self.driver)<br></code></pre></p>\n\n<hr>\n<h2>Testando Exemplos</h2>\n\n<pre><code># tests/test_login.py\nimport pytest\nfrom pages.login_page import LoginPage\nfrom pages.dashboard_page import DashboardPage\n\n<p>class TestLogin:</p>\n\n<p>@pytest.fixture(autouse=True)<br>    def setup(self, driver):<br>        self.driver = driver<br>        self.login_page = LoginPage(driver)</p>\n\n<p>def test_login_with_valid_credentials(self):<br>        \"\"\"Deve fazer login e ir para dashboard\"\"\"<br>        dashboard = self.login_page.load().login(<br>            email=\"user@example.com\",<br>            password=\"password123\"<br>        )</p>\n\n<p>assert dashboard.get_welcome_message() == \"Welcome!\"<br>        assert dashboard.get_user_name() == \"John Doe\"</p>\n\n<p>def test_login_with_invalid_credentials(self):<br>        \"\"\"Deve exibir mensagem de erro\"\"\"<br>        self.login_page.load()<br>        self.login_page.login(<br>            email=\"invalid@example.com\",<br>            password=\"wrongpassword\"<br>        )</p>\n\n<p>assert \"Invalid credentials\" in self.login_page.get_error_message()</p>\n\n<p>def test_forgot_password_flow(self):<br>        \"\"\"Deve navegar para recuperação de senha\"\"\"<br>        forgot_page = self.login_page.load().click_forgot_password()</p>\n\n<p>assert forgot_page.is_displayed()<br>        assert \"Reset Password\" in forgot_page.get_title()<br></code></pre></p>\n\n<hr>\n<h2>Headless Mode</h2>\n\n<pre><code>from selenium.webdriver.chrome.options import Options\n\n<p>options = Options()<br>options.add_argument(\"--headless\")<br>options.add_argument(\"--no-sandbox\")<br>options.add_argument(\"--disable-dev-shm-usage\")<br>options.add_argument(\"--disable-gpu\")</p>\n\n<p>driver = webdriver.Chrome(options=options)<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Selenium WebDriver é poderoso para automação web. As chaves são:<br><ol><li><strong>Use locators estáveis</strong> - data-testid &gt; ID &gt; XPath</li><br><li><strong>Waits explícitos</strong> - Sempre prefira sobre implícitos</li><br><li><strong>Page Objects</strong> - Separe locators e ações</li><br><li><strong>Evite sleeps</strong> - Use expected conditions</li><br><li><strong>Debug com screenshots</strong> - Capture estado em falhas</li></ol></p>', 'Selenium WebDriver: Guia Completo para Automação Web', '', 'inherit', 'closed', 'closed', '', '200-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '200', 'http://localhost:8082/ideiasti/?p=429', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('430', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a configurar CI/CD para QA: GitHub Actions, GitLab CI, Jenkins. Automação de testes, quality gates e deploy contínuo.</p>\n\n<hr>\n<h2>O Que é CI/CD?</h2>\n\n<h3>Continuous Integration (CI)</h3>\n\n<p>Desenvolvedores commitam código frequentemente (diariamente ou mais). Cada commit triggers build automático e suite de testes.</p>\n\n<h3>Continuous Delivery (CD)</h3>\n\n<p>Código que passa em todos os testes é automaticamente deployado para staging/produção.</p>\n\n<hr>\n<h2>GitHub Actions</h2>\n\n<h3>Estrutura Básica</h3>\n\n<pre><code># .github/workflows/ci.yml\nname: CI Pipeline\n\n<p>on:<br>  push:<br>    branches: [main, develop]<br>  pull_request:<br>    branches: [main]</p>\n\n<p>env:<br>  NODE_VERSION: \'18\'</p>\n\n<p>jobs:<br>  lint:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Node<br>        uses: actions/setup-node@v4<br>        with:<br>          node-version: ${{ env.NODE_VERSION }}<br>          cache: \'npm\'</p>\n\n<p>- name: Install dependencies<br>        run: npm ci</p>\n\n<p>- name: Run linter<br>        run: npm run lint</p>\n\n<p>- name: Run type check<br>        run: npm run type-check</p>\n\n<p>test:<br>    needs: lint<br>    runs-on: ubuntu-latest<br>    services:<br>      postgres:<br>        image: postgres:15<br>        env:<br>          POSTGRES_DB: test<br>          POSTGRES_USER: test<br>          POSTGRES_PASSWORD: test<br>        ports:<br>          - 5432:5432<br>        options: &gt;-<br>          --health-cmd pg_isready<br>          --health-interval 10s<br>          --health-timeout 5s<br>          --health-retries 5</p>\n\n<p>redis:<br>        image: redis:7<br>        ports:<br>          - 6379:6379</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Node<br>        uses: actions/setup-node@v4<br>        with:<br>          node-version: ${{ env.NODE_VERSION }}<br>          cache: \'npm\'</p>\n\n<p>- name: Install dependencies<br>        run: npm ci</p>\n\n<p>- name: Run unit tests<br>        run: npm run test:unit -- --coverage</p>\n\n<p>- name: Run integration tests<br>        env:<br>          DATABASE_URL: postgresql://test:test@localhost:5432/test<br>          REDIS_URL: redis://localhost:6379<br>        run: npm run test:integration</p>\n\n<p>- name: Upload coverage<br>        uses: codecov/codecov-action@v3<br>        with:<br>          files: ./coverage/lcov.info<br>          fail_ci_if_error: true</p>\n\n<p>e2e:<br>    needs: test<br>    runs-on: ubuntu-latest<br>    if: github.event_name == \'push\'</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Node<br>        uses: actions/setup-node@v4<br>        with:<br>          node-version: ${{ env.NODE_VERSION }}</p>\n\n<p>- name: Install dependencies<br>        run: npm ci</p>\n\n<p>- name: Install Playwright<br>        run: npx playwright install --with-deps</p>\n\n<p>- name: Run E2E tests<br>        run: npm run test:e2e</p>\n\n<p>- name: Upload test results<br>        uses: actions/upload-artifact@v4<br>        if: always()<br>        with:<br>          name: playwright-report<br>          path: playwright-report/</p>\n\n<p>security:<br>    needs: test<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Snyk<br>        uses: snyk/actions/node@master<br>        env:<br>          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}</p>\n\n<p>- name: Run SonarCloud<br>        uses: SonarSource/sonarcloud-github-action@master<br>        env:<br>          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}</p>\n\n<p>deploy-staging:<br>    needs: [test, security, e2e]<br>    runs-on: ubuntu-latest<br>    if: github.ref == \'refs/heads/develop\'<br>    environment: staging</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Deploy to Staging<br>        run: |<br>          echo \"Deploying to staging...\"<br>          kubectl apply -f k8s/staging/</p>\n\n<p>- name: Smoke tests<br>        run: |<br>          sleep 30<br>          curl -f https://staging.exemplo.com/health</p>\n\n<p>deploy-production:<br>    needs: [deploy-staging]<br>    runs-on: ubuntu-latest<br>    if: github.ref == \'refs/heads/main\'<br>    environment: production</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Deploy to Production<br>        run: |<br>          echo \"Deploying to production...\"<br>          kubectl apply -f k8s/production/<br></code></pre></p>\n\n<hr>\n<h2>GitLab CI</h2>\n\n<pre><code># .gitlab-ci.yml\nstages:\n  - lint\n  - test\n  - security\n  - deploy\n\n<p>variables:<br>  NODE_VERSION: \'18\'<br>  POSTGRES_DB: test<br>  POSTGRES_USER: test<br>  POSTGRES_PASSWORD: test</p>\n\n<p>lint:<br>  stage: lint<br>  image: node:$NODE_VERSION<br>  before_script:<br>    - npm ci<br>  script:<br>    - npm run lint<br>    - npm run type-check<br>  allow_failure: false</p>\n\n<p>test:unit:<br>  stage: test<br>  image: node:$NODE_VERSION<br>  services:<br>    - postgres:15<br>  before_script:<br>    - npm ci<br>  script:<br>    - npm run test:unit -- --coverage<br>  coverage: \'/Liness<em>:s</em>(d+.d+){6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}/\'<br>  artifacts:<br>    reports:<br>      junit: junit.xml<br>      coverage_report:<br>        coverage_format: cobertura<br>        path: coverage/cobertura-coverage.xml</p>\n\n<p>test:integration:<br>  stage: test<br>  image: node:$NODE_VERSION<br>  services:<br>    - postgres:15<br>    - redis:7<br>  before_script:<br>    - npm ci<br>  script:<br>    - npm run test:integration<br>  dependencies:<br>    - test:unit</p>\n\n<p>test:e2e:<br>  stage: test<br>  image: node:$NODE_VERSION<br>  before_script:<br>    - npm ci<br>    - npx playwright install --with-deps<br>  script:<br>    - npm run test:e2e<br>  dependencies:<br>    - test:integration<br>  allow_failure: true</p>\n\n<p>security:dependency-scanning:<br>  stage: security<br>  image: alpine:latest<br>  before_script:<br>    - apk add --no-cache curl<br>  script:<br>    - curl -sL https://getsentry.com/snippets/snyk-gitlab.sh | bash</p>\n\n<p>deploy:staging:<br>  stage: deploy<br>  script:<br>    - echo \"Deploying to staging\"<br>    - kubectl config use-context staging<br>    - kubectl apply -f k8s/staging/<br>  environment:<br>    name: staging<br>  only:<br>    - develop</p>\n\n<p>deploy:production:<br>  stage: deploy<br>  script:<br>    - echo \"Deploying to production\"<br>    - kubectl config use-context production<br>    - kubectl apply -f k8s/production/<br>  environment:<br>    name: production<br>  when: manual<br>  only:<br>    - main<br></code></pre></p>\n\n<hr>\n<h2>Quality Gates</h2>\n\n<h3>Implementação</h3>\n\n<pre><code>quality-gates:\n  stage: quality\n  image: node:$NODE_VERSION\n  before_script:\n    - npm ci\n  script:\n    - |\n      # Check coverage\n      COVERAGE=$(cat coverage/coverage.json | jq \'.total.lines.pct\')\n      echo \"Coverage: $COVERAGE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\n\n<p>if (( $(echo \"$COVERAGE &lt; 80&quot; | bc -l) )); then<br>        echo \"Coverage below 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} threshold\"<br>        exit 1<br>      fi</p>\n\n<p># Check test pass rate<br>      PASS_RATE=$(cat test-results.json | jq \'.passed / .total * 100\')<br>      echo \"Pass rate: $PASS_RATE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</p>\n\n<p>if (( $(echo \"$PASS_RATE &lt; 95&quot; | bc -l) )); then<br>        echo \"Pass rate below 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} threshold\"<br>        exit 1<br>      fi</p>\n\n<p># Check security<br>      if grep -q \"high|critical\" security-report.json; then<br>        echo \"Security vulnerabilities found\"<br>        exit 1<br>      fi</p>\n\n<p>echo \"All quality gates passed\"<br>  needs:<br>    - test<br>  allow_failure: false<br></code></pre></p>\n\n<hr>\n<h2>Test Reports</h2>\n\n<h3>JUnit XML Format</h3>\n\n<pre><code>\n\n  \n  \n    assert \'token\' not in response\n  \n\n</code></pre>\n\n<h3>GitHub Actions Upload</h3>\n\n<pre><code>- name: Upload JUnit test results\n  uses: actions/upload-artifact@v4\n  with:\n    name: test-results\n    path: test-results/junit.xml\n\n<ul><li>name: Publish Test Results</li></ul>\n  uses: dorny/test-reporter@v1\n  with:\n    name: Test Results\n    path: test-results/*.xml\n    reporter: java-junit\n    fail-on: test failures\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>CI/CD robusto é essencial para QA moderno. As chaves são:<br><ol><li><strong>Automação completa</strong> - Build, test, deploy</li><br><li><strong>Quality gates</strong> - Critérios objetivos para avançar</li><br><li><strong>Feedback rápido</strong> - Resultados em minutos</li><br><li><strong>Parallel execution</strong> - Speed up pipelines</li><br><li><strong>Reliable reporting</strong> - JUnit XML, cobertura, etc.</li></ol></p>', 'CI/CD para QA: Automação do Pipeline de Testes', '', 'inherit', 'closed', 'closed', '', '202-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '202', 'http://localhost:8082/ideiasti/?p=430', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('431', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda testes de carga e stress: JMeter, k6, Gatling. Como simular milhares de usuários e identificar gargalos de performance.</p>\n\n<hr>\n<h2>Tipos de Teste de Carga</h2>\n\n<h3>Load Testing</h3>\n\n<p>Verifica comportamento sob carga esperada.</p>\n\n<pre><code>Carga: 1000 usuários simultâneos\nDuração: 30 minutos\nMétrica: P95 &lt; 500ms\n</code></pre>\n\n<h3>Stress Testing</h3>\n\n<p>Vai além dos limites normais.</p>\n\n<pre><code>Carga: 1000 → 2000 → 5000 usuários\nObjetivo: Encontrar ponto de quebra\n</code></pre>\n\n<h3>Spike Testing</h3>\n\n<p>Picos súbitos de carga.</p>\n\n<pre><code>Normal: 500 usuários\nSpike: 5000 usuários em 5 segundos\nRecovery: 500 usuários\n</code></pre>\n\n<h3>Soak Testing</h3>\n\n<p>Carga sustentada por longo período.</p>\n\n<pre><code>Carga: 1000 usuários\nDuração: 8 horas\nObjetivo: Memory leaks, degradação\n</code></pre>\n\n<hr>\n<h2>k6 - Modern Load Testing</h2>\n\n<h3>Instalação</h3>\n\n<pre><code># macOS\nbrew install k6\n\n<p># Linux<br>sudo apt install k6</p>\n\n<p># Windows<br>choco install k6<br></code></pre></p>\n\n<h3>Script Básico</h3>\n\n<pre><code>// load-test.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },   // Ramp-up<br>    { duration: \'5m\', target: 100 },   // Steady<br>    { duration: \'2m\', target: 200 },   // Stress<br>    { duration: \'5m\', target: 200 },   // Steady<br>    { duration: \'2m\', target: 0 },     // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // &lt; 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} errors<br>    checks: [\'rate&gt;0.95\'],              // &gt; 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} checks pass<br>  },<br>};</p>\n\n<p>const BASE_URL = \'https://api.exemplo.com\';</p>\n\n<p>export default function () {<br>  // Login<br>  const loginRes = http.post(<code>${BASE_URL}/auth/login</code>, {<br>    email: \'user@example.com\',<br>    password: \'password123\',<br>  });</p>\n\n<p>check(loginRes, {<br>    \'login status 200\': (r) =&gt; r.status === 200,<br>    \'has token\': (r) =&gt; r.json(\'token\') !== undefined,<br>  });</p>\n\n<p>const token = loginRes.json(\'token\');</p>\n\n<p>// Get products<br>  const productsRes = http.get(<code>${BASE_URL}/products</code>, {<br>    headers: { \'Authorization\': <code>Bearer ${token}</code> },<br>  });</p>\n\n<p>check(productsRes, {<br>    \'products status 200\': (r) =&gt; r.status === 200,<br>    \'has products\': (r) =&gt; r.json(\'items\').length &gt; 0,<br>  });</p>\n\n<p>sleep(1);<br>}<br></code></pre></p>\n\n<h3>Cenários Complexos</h3>\n\n<pre><code>// scenarios.js\nimport http from \'k6/http\';\nimport { check, group } from \'k6/http\';\nimport { Rate, Trend } from \'k6/metrics\';\n\n<p>const errorRate = new Rate(\'errors\');<br>const apiLatency = new Trend(\'api_latency\');</p>\n\n<p>export const options = {<br>  scenarios: {<br>    // Smoke test<br>    smoke: {<br>      executor: \'constant-vus\',<br>      vus: 10,<br>      duration: \'1m\',<br>      tags: { test_type: \'smoke\' },<br>    },</p>\n\n<p>// Load test<br>    load: {<br>      executor: \'ramping-vus\',<br>      startVUs: 0,<br>      stages: [<br>        { duration: \'2m\', target: 100 },<br>        { duration: \'5m\', target: 100 },<br>        { duration: \'2m\', target: 0 },<br>      ],<br>      tags: { test_type: \'load\' },<br>    },</p>\n\n<p>// Stress test<br>    stress: {<br>      executor: \'ramping-arrival-rate\',<br>      startRate: 1,<br>      timeUnit: \'1s\',<br>      preAllocatedVUs: 100,<br>      maxVUs: 500,<br>      stages: [<br>        { duration: \'2m\', target: 10 },<br>        { duration: \'5m\', target: 50 },<br>        { duration: \'2m\', target: 100 },<br>        { duration: \'1m\', target: 0 },<br>      ],<br>      tags: { test_type: \'stress\' },<br>    },</p>\n\n<p>// Spike test<br>    spike: {<br>      executor: \'ramping-vus\',<br>      startVUs: 0,<br>      stages: [<br>        { duration: \'30s\', target: 100 },<br>        { duration: \'1m\', target: 1000 },  // Spike!<br>        { duration: \'30s\', target: 1000 },<br>        { duration: \'2m\', target: 0 },<br>      ],<br>      tags: { test_type: \'spike\' },<br>    },<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/health\');</p>\n\n<p>errorRate.add(res.status !== 200);<br>  apiLatency.add(res.timings.duration);<br>}<br></code></pre></p>\n\n<hr>\n<h2>JMeter - Enterprise Load Testing</h2>\n\n<h3>Instalação</h3>\n\n<pre><code># Download\nwget https://jmeter.apache.org/download_jmeter.cgi\n\n<p># Run<br>./bin/jmeter.sh<br></code></pre></p>\n\n<h3>Plano de Teste (GUI)</h3>\n\n<pre><code>Test Plan\n├── Thread Group (100 users, 10s ramp-up, loop 10)\n│   ├── HTTP Request Defaults\n│   │   └── Server: api.exemplo.com\n│   │\n│   ├── Once Only Controller\n│   │   └── Login Request\n│   │       └── POST /auth/login\n│   │\n│   ├── Recording Controller\n│   │   └── GET /products\n│   │   └── GET /products/{id}\n│   │   └── POST /orders\n│   │\n│   └── Listeners\n│       ├── Summary Report\n│       ├── View Results Tree\n│       ├── Aggregate Report\n│       └── Graph Results\n</code></pre>\n\n<h3>JMeter CLI</h3>\n\n<pre><code># Run non-GUI\njmeter -n -t test-plan.jmx -l results.jtl -e -o html-report\n\n<p># With specific properties<br>jmeter -n -t api-test.jmx <br>  -Jthreads=100 <br>  -Jrampup=10 <br>  -Jduration=300 <br>  -l results.jtl<br></code></pre></p>\n\n<h3>Distributed Testing</h3>\n\n<pre><code># jmeter-server (on slave machines)\njmeter-server -Djava.rmi.server.hostname=192.168.1.100\n\n<p># Run distributed<br>jmeter -n -t test.jmx <br>  -R192.168.1.100,192.168.1.101,192.168.1.102 <br>  -l results.jtl<br></code></pre></p>\n\n<hr>\n<h2>Gatling - Scala-based Load Testing</h2>\n\n<h3>Instalação</h3>\n\n<pre><code># Download\nwget https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/3.10.5/gatling-charts-highcharts-bundle-3.10.5.zip\nunzip gatling-charts-highcharts-bundle-3.10.5.zip\n</code></pre>\n\n<h3>Script Scala</h3>\n\n<pre><code>// src/test/scala/LoadSimulation.scala\npackage simulations\n\n<p>import io.gatling.core.Predef._<br>import io.gatling.http.Predef._<br>import io.gatling.jdbc.Predef._<br>import io.gatling.core.structure.ScenarioBuilder</p>\n\n<p>class ApiLoadSimulation extends Simulation {</p>\n\n<p>val httpProtocol = http<br>    .baseUrl(\"https://api.exemplo.com\")<br>    .acceptHeader(\"application/json\")<br>    .contentTypeHeader(\"application/json\")<br>    .disableCaching</p>\n\n<p>val userFeeder = csv(\"users.csv\").circular.random</p>\n\n<p>val loginScenario: ScenarioBuilder = scenario(\"Login Flow\")<br>    .feed(userFeeder)<br>    .exec(<br>      http(\"Login\")<br>        .post(\"/auth/login\")<br>        .body(StringBody(<br>          \"\"\"{\"email\":\"${email}\",\"password\":\"${password}\"}\"\"\"<br>        )).asJson<br>        .check(jsonPath(\"$.token\").saveAs(\"authToken\"))<br>    )<br>    .pause(1)<br>    .exec(<br>      http(\"Get Products\")<br>        .get(\"/products\")<br>        .header(\"Authorization\", \"Bearer ${authToken}\")<br>        .check(status.is(200))<br>    )<br>    .pause(1)<br>    .exec(<br>      http(\"Create Order\")<br>        .post(\"/orders\")<br>        .header(\"Authorization\", \"Bearer ${authToken}\")<br>        .body(StringBody(<br>          \"\"\"{\"productId\":1,\"quantity\":2}\"\"\"<br>        )).asJson<br>        .check(status.is(201))<br>    )</p>\n\n<p>setUp(<br>    loginScenario<br>      .inject(<br>        rampUsers(100).during(30.seconds),<br>        constantUsersPerSec(50).during(5.minutes),<br>        rampUsers(100).during(30.seconds)<br>      )<br>      .protocols(httpProtocol)<br>  )<br>  .assertions(<br>    global.responseTime.percentile(95).lt(500),<br>    global.successfulRequests.percent.gt(99)<br>  )<br>  .thresholds(<br>    http(\"Login\").responseTime.percentile(99).lt(1000)<br>  )<br>}<br></code></pre></p>\n\n<hr>\n<h2>Interpreting Results</h2>\n\n<h3>Key Metrics</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Significado</th><th>Target</th></tr>\n<tr><td><strong>P95 Latency</strong></td><td>95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições</td><td>&lt; 500ms</td></tr>\n<tr><td><strong>P99 Latency</strong></td><td>99{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições</td><td>&lt; 1s</td></tr>\n<tr><td><strong>Throughput</strong></td><td>Req/s</td><td>&gt; 1000</td></tr>\n<tr><td><strong>Error Rate</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} falhas</td><td>&lt; 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>CPU</strong></td><td>Utilização</td><td>&lt; 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Memory</strong></td><td>Utilização</td><td>&lt; 85{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n</table></figure>\n\n<h3>Finding Bottlenecks</h3>\n\n<pre><code>// k6 com métricas customizadas\nimport { Trend } from \'k6/metrics\';\n\n<p>const dbLatency = new Trend(\'db_query_duration\');<br>const externalLatency = new Trend(\'external_api_duration\');</p>\n\n<p>export default function () {<br>  const start = Date.now();<br>  // DB query<br>  const dbRes = http.get(<code>${BASE_URL}/db</code>);<br>  dbLatency.add(Date.now() - start);</p>\n\n<p>// External API<br>  const extStart = Date.now();<br>  const extRes = http.get(\'https://external-api.com/data\');<br>  externalLatency.add(Date.now() - extStart);<br>}<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de carga são essenciais para garantir performance. As chaves são:<br><ol><li><strong>Definir objetivos claros</strong> - SLAs e thresholds</li><br><li><strong>Simular realista</strong> - Dados e comportamento reais</li><br><li><strong>Monitorar infra</strong> - CPU, memória, rede</li><br><li><strong>Analisar resultados</strong> - P95, P99, throughput</li><br><li><strong>Testar regularmente</strong> - CI/CD integrado</li></ol></p>', 'Testes de Load/Stress: Garantindo Performance sob Carga', '', 'inherit', 'closed', 'closed', '', '203-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '203', 'http://localhost:8082/ideiasti/?p=431', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('432', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a testar aplicações em Kubernetes: Helm, deployments, services, configmaps e como integrar testes ao ciclo de deploy em K8s.</p>\n\n<hr>\n<h2>Kubernetes para QA</h2>\n\n<h3>Por Que Kubernetes?</h3>\n\n<ul><li><strong>Isolamento</strong> - Cada ambiente isolado</li><ol><li><strong>Reproducibilidade</strong> - Ambientes idênticos</li>\n<li><strong>Escalabilidade</strong> - Teste com múltiplas réplicas</li>\n<li><strong>Orquestração</strong> - Deploys atômicos</li></ol></ul>\n\n<hr>\n<h2>Recursos Kubernetes</h2>\n\n<h3>Pod</h3>\n\n<pre><code># pod.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: api-test-pod\n  labels:\n    app: api\n    env: test\nspec:\n  containers:\n  - name: api\n    image: api:latest\n    ports:\n    - containerPort: 8080\n    env:\n    - name: DATABASE_URL\n      valueFrom:\n        secretKeyRef:\n          name: api-secrets\n          key: database-url\n    resources:\n      requests:\n        memory: \"256Mi\"\n        cpu: \"250m\"\n      limits:\n        memory: \"512Mi\"\n        cpu: \"500m\"\n    readinessProbe:\n      httpGet:\n        path: /health\n        port: 8080\n      initialDelaySeconds: 5\n      periodSeconds: 10\n    livenessProbe:\n      httpGet:\n        path: /health\n        port: 8080\n      initialDelaySeconds: 15\n      periodSeconds: 20\n</code></pre>\n\n<h3>Deployment</h3>\n\n<pre><code># deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: api-deployment\nspec:\n  replicas: 3\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxSurge: 1\n      maxUnavailable: 0\n  selector:\n    matchLabels:\n      app: api\n  template:\n    metadata:\n      labels:\n        app: api\n    spec:\n      containers:\n      - name: api\n        image: api:v1.0.0\n        ports:\n        - containerPort: 8080\n        env:\n        - name: ENV\n          value: \"production\"\n        livenessProbe:\n          httpGet:\n            path: /health\n            port: 8080\n        readinessProbe:\n          httpGet:\n            path: /ready\n            port: 8080\n</code></pre>\n\n<h3>Service</h3>\n\n<pre><code># service.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: api-service\nspec:\n  type: ClusterIP\n  selector:\n    app: api\n  ports:\n  - port: 80\n    targetPort: 8080\n    name: http\n</code></pre>\n\n<hr>\n<h2>Helm - Gerenciamento de Charts</h2>\n\n<h3>Estrutura</h3>\n\n<pre><code>myapp/\n├── Chart.yaml\n├── values.yaml\n├── charts/\n├── templates/\n│   ├── deployment.yaml\n│   ├── service.yaml\n│   ├── ingress.yaml\n│   ├── _helpers.tpl\n│   └── tests/\n│       └── test-connection.yaml\n└── README.md\n</code></pre>\n\n<h3>Chart.yaml</h3>\n\n<pre><code># Chart.yaml\napiVersion: v2\nname: myapp\ndescription: A Helm chart for MyApp\ntype: application\nversion: 1.0.0\nappVersion: \"1.0.0\"\nkeywords:\n  - web\n  - api\nhome: https://myapp.com\nmaintainers:\n  - name: DevOps Team\n    email: devops@myapp.com\ndependencies:\n  - name: postgresql\n    version: \"12.x\"\n    repository: \"https://charts.bitnami.com/bitnami\"\n    condition: postgresql.enabled\n</code></pre>\n\n<h3>values.yaml</h3>\n\n<pre><code># values.yaml\nreplicaCount: 3\n\n<p>image:<br>  repository: myapp/api<br>  tag: latest<br>  pullPolicy: IfNotPresent</p>\n\n<p>service:<br>  type: ClusterIP<br>  port: 80</p>\n\n<p>ingress:<br>  enabled: true<br>  className: \"nginx\"<br>  annotations:<br>    cert-manager.io/cluster-issuer: \"letsencrypt-prod\"<br>  hosts:<br>    - host: api.myapp.com<br>      paths:<br>        - path: /<br>          pathType: Prefix<br>  tls:<br>    - secretName: api-tls<br>      hosts:<br>        - api.myapp.com</p>\n\n<p>resources:<br>  limits:<br>    cpu: 500m<br>    memory: 512Mi<br>  requests:<br>    cpu: 100m<br>    memory: 256Mi</p>\n\n<p>autoscaling:<br>  enabled: true<br>  minReplicas: 2<br>  maxReplicas: 10<br>  targetCPUUtilizationPercentage: 70</p>\n\n<p>postgresql:<br>  enabled: true<br>  auth:<br>    database: myapp<br>    username: myapp<br>    password: changeme</p>\n\n<p>tests:<br>  enabled: true<br>  image: curlimages/curl:latest<br></code></pre></p>\n\n<h3>Test Template</h3>\n\n<pre><code># templates/tests/test-connection.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"myapp.fullname\" . }}-test-connection\"\n  labels:\n    helm.sh/hook: test\n    helm.sh/hook-delete-policy: before-hook-creation\n  annotations:\n    \"helm.sh/hook\": test\nspec:\n  containers:\n  - name: wget\n    image: \"{{ .Values.tests.image }}\"\n    command: [\'sh\', \'-c\']\n    args:\n      - |\n        echo \"Testing API health endpoint...\"\n        response=$(curl -f http://{{ include \"myapp.fullname\" . }}:{{ .Values.service.port }}/health || echo \"FAILED\")\n        echo \"Response: $response\"\n        if [ \"$response\" != \"OK\" ]; then\n          exit 1\n        fi\n  restartPolicy: Never\n</code></pre>\n\n<hr>\n<h2>Testando no Kubernetes</h2>\n\n<h3>Testes de Integração com Kind</h3>\n\n<pre><code># Criar cluster Kind\nkind create cluster --name qa-tests\n\n<p># Deploy app<br>kubectl apply -f deployment.yaml</p>\n\n<p># Run tests<br>kubectl run test-runner --image=myapp/test-runner -- curl http://api-service/health</p>\n\n<p># Ver resultado<br>kubectl logs test-runner</p>\n\n<p># Cleanup<br>kind delete cluster --name qa-tests<br></code></pre></p>\n\n<h3>kubectl Testing Commands</h3>\n\n<pre><code># Verificar pods\nkubectl get pods -l app=api\n\n<p># Ver logs<br>kubectl logs -l app=api --tail=100</p>\n\n<p># Port-forward para teste local<br>kubectl port-forward svc/api-service 8080:80</p>\n\n<p># Executar testes<br>kubectl exec -it api-pod -- python -m pytest tests/</p>\n\n<p># Ver events<br>kubectl get events --sort-by=\'.lastTimestamp\'<br></code></pre></p>\n\n<h3>Teste com cURL</h3>\n\n<pre><code>#!/bin/bash\n# test-api.sh\n\n<p>API_URL=\"http://api-service\"</p>\n\n<p>echo \"Testing API endpoints...\"</p>\n\n<p># Health check<br>echo \"1. Health check...\"<br>response=$(curl -s -o /dev/null -w \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}{http_code}\" $API_URL/health)<br>if [ \"$response\" != \"200\" ]; then<br>  echo \"FAILED: Health check returned $response\"<br>  exit 1<br>fi<br>echo \"OK\"</p>\n\n<p># Teste de endpoint<br>echo \"2. GET /users...\"<br>response=$(curl -s $API_URL/users)<br>if echo \"$response\" | grep -q \"users\"; then<br>  echo \"OK\"<br>else<br>  echo \"FAILED\"<br>  exit 1<br>fi</p>\n\n<p>echo \"All tests passed!\"<br></code></pre></p>\n\n<hr>\n<h2>CI/CD com Kubernetes</h2>\n\n<h3>GitHub Actions</h3>\n\n<pre><code># .github/workflows/k8s-tests.yml\nname: Kubernetes Tests\n\n<p>on:<br>  push:<br>    branches: [main, develop]</p>\n\n<p>jobs:<br>  test:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup kubectl<br>        uses: azure/setup-kubectl@v3</p>\n\n<p>- name: Configure kubectl<br>        run: |<br>          echo \"${{ secrets.KUBE_CONFIG }}\" | base64 -d &gt; kubeconfig<br>          export KUBECONFIG=kubeconfig</p>\n\n<p>- name: Deploy to test<br>        run: |<br>          helm upgrade --install myapp ./chart <br>            --namespace test <br>            --create-namespace <br>            --values ./chart/values-test.yaml <br>            --wait --timeout 5m</p>\n\n<p>- name: Wait for pods<br>        run: |<br>          kubectl wait --for=condition=ready pod -l app=myapp <br>            -n test --timeout=300s</p>\n\n<p>- name: Run API tests<br>        run: |<br>          kubectl exec -n test deploy/myapp -- <br>            python -m pytest tests/ -v --junit-xml=/tmp/results.xml</p>\n\n<p>- name: Run integration tests<br>        run: |<br>          kubectl run test-runner -n test <br>            --image=myapp/test-runner <br>            --rm -it --restart=Never <br>            -- curl -f http://myapp/health</p>\n\n<p>- name: Collect test results<br>        uses: actions/upload-artifact@v4<br>        with:<br>          name: test-results<br>          path: /tmp/results.xml</p>\n\n<p>- name: Cleanup<br>        if: always()<br>        run: helm uninstall myapp -n test<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Kubernetes facilita testes em ambientes controlados. As chaves são:<br><ol><li><strong>Containerização</strong> - Ambientes reproduzíveis</li><br><li><strong>Helm charts</strong> - Deploys versionados</li><br><li><strong>Test hooks</strong> - Testes no ciclo de deploy</li><br><li><strong>CI/CD integration</strong> - Automação completa</li><br><li><strong>Monitoring</strong> - Observabilidade em testes</li></ol></p>', 'Kubernetes e QA: Testes em Ambientes Containerizados', '', 'inherit', 'closed', 'closed', '', '204-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '204', 'http://localhost:8082/ideiasti/?p=432', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('433', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a monitorar qualidade de software: métricas de QA, dashboards de teste, KPIs deDevOps e como usar dados para melhoria contínua.</p>\n\n<hr>\n<h2>Por Que Monitorar Qualidade?</h2>\n\n<ul><li><strong>Visibilidade</strong> - Entender estado atual</li><ol><li><strong>Tendências</strong> - Identificar melhoras/pioras</li>\n<li><strong>Decisões</strong> - Base para ação</li>\n<li><strong>Accountability</strong> - Responsabilidade clara</li>\n</ol>\n<hr>\n<h2>Métricas de QA</h2>\n\n<h3>Cobertura de Testes</h3>\n\n<pre><code># Métricas de cobertura\nmetrics = {\n    \"line_coverage\": calculate_line_coverage(),\n    \"branch_coverage\": calculate_branch_coverage(),\n    \"function_coverage\": calculate_function_coverage(),\n\n<p>\"covered_lines\": 450,<br>    \"total_lines\": 500,<br>    \"uncovered_lines\": [12, 45, 78],  # Linhas críticas</p>\n\n<p>\"coverage_trend\": {<br>        \"week_1\": 65,<br>        \"week_2\": 68,<br>        \"week_3\": 72,<br>        \"week_4\": 78<br>    }<br>}</p>\n\n<p># Dashboard metrics<br>def calculate_coverage_metrics():<br>    return {<br>        \"current\": get_current_coverage(),<br>        \"target\": 80,<br>        \"delta\": get_current_coverage() - 80,<br>        \"trend\": get_coverage_trend(weeks=4)<br>    }<br></code></pre></p>\n\n<h3>Defect Metrics</h3>\n\n<pre><code>class DefectMetrics:\n    def __init__(self, sprint_data):\n        self.sprint = sprint_data\n\n<p>def defect_leakage_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos encontrados em produção\"\"\"<br>        prod = len([d for d in self.sprint.defects if d.found_in == \'production\'])<br>        total = len(self.sprint.defects)<br>        return (prod / total) * 100 if total &gt; 0 else 0</p>\n\n<p>def defect_density(self):<br>        \"\"\"Defeitos por story point\"\"\"<br>        return len(self.sprint.defects) / self.sprint.story_points_completed</p>\n\n<p>def mean_time_to_detect(self):<br>        \"\"\"Tempo médio para detectar defeito\"\"\"<br>        return sum(d.time_to_detect for d in self.sprint.defects) / len(self.sprint.defects)</p>\n\n<p>def mean_time_to_fix(self):<br>        \"\"\"Tempo médio para corrigir\"\"\"<br>        return sum(d.time_to_fix for d in self.sprint.defects) / len(self.sprint.defects)</p>\n\n<p>def escape_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos escapados para produção\"\"\"<br>        escaped = len([d for d in self.sprint.defects if d.escaped_to_prod])<br>        total = len(self.sprint.defects)<br>        return (escaped / total) * 100 if total &gt; 0 else 0</p>\n\n<p>def defect_by_severity(self):<br>        return {<br>            \"critical\": len([d for d in self.sprint.defects if d.severity == \'critical\']),<br>            \"high\": len([d for d in self.sprint.defects if d.severity == \'high\']),<br>            \"medium\": len([d for d in self.sprint.defects if d.severity == \'medium\']),<br>            \"low\": len([d for d in self.sprint.defects if d.severity == \'low\'])<br>        }</p>\n\n<p>def defect_by_type(self):<br>        return {<br>            \"functional\": len([d for d in self.sprint.defects if d.type == \'functional\']),<br>            \"performance\": len([d for d in self.sprint.defects if d.type == \'performance\']),<br>            \"security\": len([d for d in self.sprint.defects if d.type == \'security\']),<br>            \"ux\": len([d for d in self.sprint.defects if d.type == \'ux\'])<br>        }<br></code></pre></p>\n\n<h3>Test Execution Metrics</h3>\n\n<pre><code>class TestExecutionMetrics:\n    def __init__(self, execution_history):\n        self.history = execution_history\n\n<p>def pass_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de testes passando\"\"\"<br>        passed = len([t for t in self.history if t.status == \'passed\'])<br>        total = len(self.history)<br>        return (passed / total) * 100 if total &gt; 0 else 0</p>\n\n<p>def flaky_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de testes flaky\"\"\"<br>        flaky = len([t for t in self.history if t.is_flaky])<br>        total = len(self.history)<br>        return (flaky / total) * 100 if total &gt; 0 else 0</p>\n\n<p>def execution_time(self):<br>        \"\"\"Tempo de execução total\"\"\"<br>        return sum(t.duration for t in self.history)</p>\n\n<p>def execution_time_trend(self):<br>        \"\"\"Tendência de tempo de execução\"\"\"<br>        return self.history.group_by(\'date\').avg(\'duration\')</p>\n\n<p>def coverage_trend(self):<br>        \"\"\"Tendência de cobertura\"\"\"<br>        return self.history.group_by(\'date\').avg(\'coverage\')</p>\n\n<p>def blocked_tests(self):<br>        \"\"\"Testes bloqueados\"\"\"<br>        return [t for t in self.history if t.status == \'blocked\']</p>\n\n<p>def skipped_tests(self):<br>        \"\"\"Testes pulados\"\"\"<br>        return [t for t in self.history if t.status == \'skipped\']<br></code></pre></p>\n\n<hr>\n<h2>DORA Metrics</h2>\n\n<h3>Deployment Frequency</h3>\n\n<pre><code>def deployment_frequency():\n    \"\"\"\n    Target: On-demand ou múltiplas vezes por dia\n    \"\"\"\n    deployments = get_deployments(last_30_days=True)\n\n<p>return {<br>        \"count\": len(deployments),<br>        \"frequency\": len(deployments) / 30,  # por dia<br>        \"target\": \"&gt;1/day\",<br>        \"status\": \"elite\" if len(deployments) &gt;= 30 else \"high\" if len(deployments) &gt;= 5 else \"medium\"<br>    }<br></code></pre></p>\n\n<h3>Lead Time for Changes</h3>\n\n<pre><code>def lead_time_for_changes():\n    \"\"\"\n    Target: &lt;1 hora (elite)\n    &quot;&quot;&quot;\n    changes = get_code_changes()\n\n<p>lead_times = []<br>    for change in changes:<br>        commit_time = change.commit_timestamp<br>        deploy_time = change.deployed_timestamp<br>        lead_time = (deploy_time - commit_time).total_seconds() / 3600  # horas<br>        lead_times.append(lead_time)</p>\n\n<p>return {<br>        \"median_hours\": statistics.median(lead_times),<br>        \"p95_hours\": statistics.quantiles(lead_times, n=20)[18],  # P95<br>        \"target\": \"&lt;1 hour&quot;,<br>        \"status\": \"elite\" if statistics.median(lead_times) &lt; 1 else &quot;high&quot;<br>    }<br></code></pre></p>\n\n<h3>Time to Restore</h3>\n\n<pre><code>def time_to_restore():\n    \"\"\"\n    Target: &lt;1 hora (elite)\n    &quot;&quot;&quot;\n    incidents = get_incidents(last_30_days=True)\n\n<p>restore_times = []<br>    for incident in incidents:<br>        restore_hours = (incident.resolved_at - incident.detected_at).total_seconds() / 3600<br>        restore_times.append(restore_hours)</p>\n\n<p>return {<br>        \"median_hours\": statistics.median(restore_times),<br>        \"p99_hours\": max(restore_times),  # P99 worst case<br>        \"target\": \"&lt;1 hour&quot;,<br>        \"incidents_count\": len(incidents)<br>    }<br></code></pre></p>\n\n<h3>Change Failure Rate</h3>\n\n<pre><code>def change_failure_rate():\n    \"\"\"\n    Target: &lt;15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} (elite)\n    &quot;&quot;&quot;\n    deployments = get_deployments(last_30_days=True)\n    failed = len([d for d in deployments if d.failed or d.rolled_back])\n\n<p>return {<br>        \"failed_count\": failed,<br>        \"total_count\": len(deployments),<br>        \"rate_percent\": (failed / len(deployments)) * 100 if deployments else 0,<br>        \"target\": \"&lt;15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}&quot;,<br>        \"status\": \"elite\" if failed / len(deployments) &lt; 0.15 else &quot;high&quot;<br>    }<br></code></pre></p>\n\n<hr>\n<h2>Dashboard Design</h2>\n\n<h3>Grafana Dashboard</h3>\n\n<pre><code># dashboard.json\n{\n  \"dashboard\": {\n    \"title\": \"QA Metrics Dashboard\",\n    \"panels\": [\n      {\n        \"title\": \"Test Pass Rate\",\n        \"type\": \"stat\",\n        \"targets\": [\n          {\n            \"expr\": \"sum(test_results{status=\'passed\'}) / sum(test_results) * 100\"\n          }\n        ],\n        \"fieldConfig\": {\n          \"defaults\": {\n            \"unit\": \"percent\",\n            \"thresholds\": {\n              \"mode\": \"absolute\",\n              \"steps\": [\n                {\"value\": 0, \"color\": \"red\"},\n                {\"value\": 90, \"color\": \"yellow\"},\n                {\"value\": 95, \"color\": \"green\"}\n              ]\n            }\n          }\n        }\n      },\n      {\n        \"title\": \"Test Execution Time\",\n        \"type\": \"timeseries\",\n        \"targets\": [\n          {\n            \"expr\": \"rate(test_execution_seconds_sum[5m]) / rate(test_execution_seconds_count[5m])\"\n          }\n        ],\n        \"fieldConfig\": {\n          \"defaults\": {\n            \"unit\": \"s\",\n            \"custom\": {\n              \"lineWidth\": 2,\n              \"fillOpacity\": 10\n            }\n          }\n        }\n      },\n      {\n        \"title\": \"Coverage Trend\",\n        \"type\": \"timeseries\",\n        \"targets\": [\n          {\n            \"expr\": \"test_coverage_percent\",\n            \"legendFormat\": \"Coverage {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\n          }\n        ]\n      },\n      {\n        \"title\": \"DORA Metrics\",\n        \"type\": \"table\",\n        \"targets\": [\n          {\n            \"expr\": \"deployment_frequency\"\n          },\n          {\n            \"expr\": \"lead_time_hours\"\n          },\n          {\n            \"expr\": \"time_to_restore_hours\"\n          },\n          {\n            \"expr\": \"change_failure_rate_percent\"\n          }\n        ]\n      },\n      {\n        \"title\": \"Defect Trends\",\n        \"type\": \"timeseries\",\n        \"targets\": [\n          {\n            \"expr\": \"rate(defects_created_total[1h])\",\n            \"legendFormat\": \"Created\"\n          },\n          {\n            \"expr\": \"rate(defects_resolved_total[1h])\",\n            \"legendFormat\": \"Resolved\"\n          }\n        ]\n      },\n      {\n        \"title\": \"Flaky Tests\",\n        \"type\": \"table\",\n        \"targets\": [\n          {\n            \"expr\": \"flaky_tests\",\n            \"format\": \"table\"\n          }\n        ]\n      }\n    ],\n    \"refresh\": \"5m\",\n    \"time\": {\n      \"from\": \"now-7d\",\n      \"to\": \"now\"\n    }\n  }\n}\n</code></pre>\n\n<hr>\n<h2>Relatórios</h2>\n\n<h3>Sprint Quality Report</h3>\n\n<pre><code># Sprint Quality Report - Sprint 42\n\n<h2>Resumo Executivo</h2><ol><li>Sprint durou: 14 dias</li>\n<li>Velocity: 42 story points</li>\n<li>Defect density: 0.4/story point</li>\n</ol>\n<h2>Métricas de Teste</h2>\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Sprint Atual</th><th>Sprint Anterior</th><th>Target</th></tr>\n<tr><td>Test Pass Rate</td><td>97{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&gt;95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Coverage</td><td>78{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>75{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Execution Time</td><td>25 min</td><td>28 min</td><td>&lt;30 min</td></tr>\n<tr><td>Flaky Tests</td><td>2{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>3{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&lt;2{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n</table></figure>\n\n<h2>DORA Metrics</h2>\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Valor</th><th>Status</th></tr>\n<tr><td>Deployment Frequency</td><td>12/day</td><td>Elite</td></tr>\n<tr><td>Lead Time</td><td>2h</td><td>High</td></tr>\n<tr><td>MTTR</td><td>45min</td><td>Elite</td></tr>\n<tr><td>Change Failure Rate</td><td>8{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>Elite</td></tr>\n</table></figure>\n\n<h2>Defeitos</h2><ol><li>Total criados: 17</li>\n<li>Total resolvidos: 15</li>\n<li>Em aberto: 2 (1 medium, 1 low)</li>\n<li>Em produção: 1</li>\n</ol>\n<h2>Riscos</h2>\n⚠️ Cobertura abaixo do target\n⚠️ 1 defeito crítico em produção\n\n<h2>Ações</h2><ol><li>[ ] Aumentar cobertura para 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</li>\n<li>[ ] Investigar causa do defeito em produção</li>\n<li>[ ] Revisar testes flaky</li></ol></ul>\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Monitoramento é essencial para melhoria contínua. As chaves são:<br><ol><li><strong>Definir métricas certas</strong> - Alinhadas com objetivos</li><br><li><strong>Coletar automaticamente</strong> - CI/CD integration</li><br><li><strong>Visualizar claramente</strong> - Dashboards efetivos</li><br><li><strong>Analisar tendências</strong> - Não apenas snapshots</li><br><li><strong>Agir sobre dados</strong> - Métricas sem ação não valem nada</li></ol></p>', 'Monitoramento de Qualidade: Métricas e Dashboards', '', 'inherit', 'closed', 'closed', '', '205-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '205', 'http://localhost:8082/ideiasti/?p=433', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('434', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda GitOps: infraestrutura como código, testes de infraestrutura, Terraform, Ansible e como garantir qualidade em configs.</p>\n\n<hr>\n<h2>O Que é GitOps?</h2>\n\n<p>GitOps usa Git como fonte única de verdade para infraestrutura e configurações. Changes são feitos via Git commits, não manualmente.</p>\n\n<h3>Princípios</h3>\n<ol><li><strong>Tudo no Git</strong> - Código, configs, infraestrutura</li>\n<li><strong>Automação</strong> - CI/CD reconcile com Git</li>\n<li><strong>Idempotência</strong> - mesmo resultado sempre</li>\n<li><strong>Auditoria</strong> - histórico completo de mudanças</li>\n</ol>\n<hr>\n<h2>Terraform - Infraestrutura como Código</h2>\n\n<h3>Setup</h3>\n\n<pre><code># main.tf\nterraform {\n  required_version = \"&gt;= 1.0\"\n\n<p>required_providers {<br>    aws = {<br>      source  = \"hashicorp/aws\"<br>      version = \"~&gt; 5.0\"<br>    }<br>  }</p>\n\n<p>backend \"s3\" {<br>    bucket = \"my-terraform-state\"<br>    key    = \"prod/terraform.tfstate\"<br>    region = \"us-east-1\"<br>  }<br>}</p>\n\n<p>provider \"aws\" {<br>  region = var.aws_region<br>}</p>\n\n<p># Variables<br>variable \"aws_region\" {<br>  description = \"AWS region\"<br>  type        = string<br>  default     = \"us-east-1\"<br>}</p>\n\n<p>variable \"environment\" {<br>  description = \"Environment name\"<br>  type        = string<br>  validation {<br>    condition     = contains([\"dev\", \"staging\", \"prod\"], var.environment)<br>    error_message = \"Environment must be dev, staging, or prod.\"<br>  }<br>}<br></code></pre></p>\n\n<h3>Recursos</h3>\n\n<pre><code># modules/api-service/main.tf\nvariable \"environment\" {}\nvariable \"app_name\" {}\nvariable \"desired_count\" { default = 2 }\nvariable \"instance_type\" { default = \"t3.micro\" }\n\n<p>resource \"aws_ecs_cluster\" \"main\" {<br>  name = \"${var.app_name}-${var.environment}\"</p>\n\n<p>setting {<br>    name  = \"containerInsights\"<br>    value = \"enabled\"<br>  }<br>}</p>\n\n<p>resource \"aws_ecs_task_definition\" \"api\" {<br>  family                   = \"${var.app_name}-api\"<br>  network_mode             = \"awsvpc\"<br>  requires_compatibilities = [\"FARGATE\"]<br>  cpu                      = \"256\"<br>  memory                   = \"512\"</p>\n\n<p>container_definitions = jsonencode([<br>    {<br>      name      = \"api\"<br>      image     = \"${var.app_name}:latest\"<br>      essential = true</p>\n\n<p>portMappings = [{<br>        containerPort = 8080<br>        protocol      = \"tcp\"<br>      }]</p>\n\n<p>environment = [<br>        { name = \"ENV\", value = var.environment }<br>      ]</p>\n\n<p>logConfiguration = {<br>        logDriver = \"awslogs\"<br>        options = {<br>          \"awslogs-group\"         = \"/ecs/${var.app_name}\"<br>          \"awslogs-region\"        = \"us-east-1\"<br>          \"awslogs-stream-prefix\" = \"ecs\"<br>        }<br>      }<br>    }<br>  ])<br>}</p>\n\n<p>resource \"aws_ecs_service\" \"api\" {<br>  name            = \"${var.app_name}-api-${var.environment}\"<br>  cluster         = aws_ecs_cluster.main.id<br>  task_definition = aws_ecs_task_definition.api.arn<br>  desired_count   = var.desired_count</p>\n\n<p>deployment_controller {<br>    type = \"ECS\"<br>  }</p>\n\n<p>deployment_maximum_percent         = 200<br>  deployment_minimum_healthy_percent = 100</p>\n\n<p>load_balancer {<br>    target_group_arn = aws_lb_target_group.api.arn<br>    container_name   = \"api\"<br>    container_port   = 8080<br>  }</p>\n\n<p>depends_on = [aws_lb.api]<br>}<br></code></pre></p>\n\n<hr>\n<h2>Testando Infraestrutura</h2>\n\n<h3>Terratest (Go)</h3>\n\n<pre><code>// api_service_test.go\npackage test\n\n<p>import (<br>    \"testing\"<br>    \"github.com/gruntwork-io/terratest/modules/terraform\"<br>    \"github.com/stretchr/testify/assert\"<br>    \"github.com/gruntwork-io/terratest/modules/aws\"<br>    \"time\"<br>)</p>\n\n<p>func TestAPIService(t *testing.T) {<br>    // Setup<br>    terraformOptions := &amp;terraform.Options{<br>        TerraformDir: \"../modules/api-service\",<br>        Vars: map[string]interface{}{<br>            \"environment\": \"test\",<br>            \"app_name\":    \"myapp\",<br>            \"desired_count\": 2,<br>        },<br>        BackendConfig: map[string]interface{}{<br>            \"bucket\": \"my-test-tfstate\",<br>            \"key\":    \"test/terraform.tfstate\",<br>        },<br>    }</p>\n\n<p>defer terraform.Destroy(t, terraformOptions)<br>    terraform.InitAndApply(t, terraformOptions)</p>\n\n<p>// Get outputs<br>    clusterName := terraform.Output(t, terraformOptions, \"cluster_name\")<br>    serviceName := terraform.Output(t, terraformOptions, \"service_name\")</p>\n\n<p>// Assertions<br>    assert.NotEmpty(t, clusterName)<br>    assert.NotEmpty(t, serviceName)</p>\n\n<p>// Wait for service to be stable<br>    aws.WaitForServiceToStabilize(t, \"us-east-1\", clusterName, serviceName, 10*time.Minute)</p>\n\n<p>// Get service details<br>    service := aws.GetEcsServiceDetails(t, \"us-east-1\", clusterName, serviceName)<br>    assert.Equal(t, int32(2), *service.DesiredCount)</p>\n\n<p>// Verify load balancer<br>    lbArn := terraform.Output(t, terraformOptions, \"lb_arn\")<br>    assert.NotEmpty(t, lbArn)<br>}<br></code></pre></p>\n\n<h3>Checkov (Security Scanning)</h3>\n\n<pre><code># .github/workflows/security-scan.yml\nname: Infrastructure Security Scan\n\n<p>on:<br>  pull_request:<br>    paths:<br>      - \'**.tf\'<br>      - \'<strong>/terrform/</strong>\'</p>\n\n<p>jobs:<br>  security-scan:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Checkov<br>        uses: bridgecrewio/checkov-action@master<br>        with:<br>          directory: .<br>          framework: terraform<br>          output_format: sarif<br>          output_file_path: results.sarif</p>\n\n<p>- name: Upload to GitHub Security<br>        uses: github/codeql-action/upload-sarif@v2<br>        with:<br>          sarif_file: results.sarif<br></code></pre></p>\n\n<pre><code># CLI\ncheckov -d ./infrastructure --framework terraform\n\n<p># Com fail<br>checkov -d ./infrastructure --check CK_VPC_SG_1</p>\n\n<p># Skip específico<br>checkov -d ./infrastructure --skip-check CK_VPC_SG_1<br></code></pre></p>\n\n<h3>Sentinel (Policy as Code)</h3>\n\n<pre><code># policies/api-service.sentinel\nimport \"tfplan/v2\" as tfplan\n\n<p># Validate environment<br>validate_environment = func() {<br>    violations = []</p>\n\n<p>for tfplan.resource_changes as rc {<br>        if rc.type is \"aws_ecs_service\" {<br>            environment = rc.change.after.environment<br>            if environment is \"production\" {<br>                desired_count = rc.change.after.desired_count<br>                if desired_count &lt; 2 {<br>                    append(violations, rc.name)<br>                }<br>            }<br>        }<br>    }</p>\n\n<p>return violations<br>}</p>\n\n<p>main = rule {<br>    validate_environment() is []<br>}<br></code></pre></p>\n\n<hr>\n<h2>Ansible - Configuração</h2>\n\n<h3>Playbook</h3>\n\n<pre><code># playbooks/deploy-api.yml\n<hr>\n<ul><li>name: Deploy API Service</li></ul>\n  hosts: api_servers\n  become: yes\n  vars:\n    app_version: \"1.2.3\"\n    deploy_path: \"/opt/myapp\"\n\n<p>tasks:<br>    - name: Ensure deploy directory exists<br>      file:<br>        path: \"{{ deploy_path }}\"<br>        state: directory<br>        owner: www-data<br>        group: www-data<br>        mode: \'0755\'</p>\n\n<p>- name: Deploy application<br>      template:<br>        src: \"app.conf.j2\"<br>        dest: \"{{ deploy_path }}/config.conf\"<br>        owner: www-data<br>        group: www-data<br>        mode: \'0644\'<br>      notify: Restart API</p>\n\n<p>- name: Pull latest image<br>      docker_image:<br>        name: myapp/api<br>        tag: \"{{ app_version }}\"<br>        source: pull<br>        force_source: yes</p>\n\n<p>- name: Ensure API is running<br>      docker_container:<br>        name: api<br>        image: \"myapp/api:{{ app_version }}\"<br>        state: started<br>        restart_policy: always<br>        ports:<br>          - \"8080:8080\"<br>        env:<br>          ENV: \"{{ app_environment }}\"<br>          DATABASE_URL: \"{{ db_connection_string }}\"<br>        volumes:<br>          - \"{{ deploy_path }}/config.conf:/app/config.conf:ro\"</p>\n\n<p>- name: Wait for API to be healthy<br>      uri:<br>        url: \"http://localhost:8080/health\"<br>        status_code: 200<br>      register: result<br>      until: result.status == 200<br>      retries: 30<br>      delay: 5</p>\n\n<p>handlers:<br>    - name: Restart API<br>      docker_container:<br>        name: api<br>        state: restarted<br></code></pre></p>\n\n<h3>Molecule (Testing Ansible)</h3>\n\n<pre><code># molecule/default/molecule.yml\n<hr>\ndependency:\n  name: galaxy\ndriver:\n  name: docker\nplatforms:\n  - name: instance\n    image: \"geerlingguy/docker-${MOLECULE_DISTRO:-centos7}\"\n    command: \"\"\n    volumes:\n      - /sys/fs/cgroup:/sys/fs/cgroup:ro\n    privileged: true\nprovisioner:\n  name: ansible\n  lint: |\n    ansible-lint\nverifier:\n  name: testinfra\n  lint:\n    - flake8\n</code></pre>\n\n<pre><code># molecule/default/tests/test_default.py\nimport os\nimport pytest\n\n<p>def test_api_installed(host):<br>    api = host.file(\"/opt/myapp\")<br>    assert api.exists<br>    assert api.is_directory</p>\n\n<p>def test_api_config(host):<br>    config = host.file(\"/opt/myapp/config.conf\")<br>    assert config.exists<br>    assert config.user == \"www-data\"</p>\n\n<p>def test_api_service(host):<br>    service = host.service(\"api\")<br>    assert service.is_running<br>    assert service.is_enabled</p>\n\n<p>def test_api_health(host):<br>    response = host.run(\"curl -f http://localhost:8080/health\")<br>    assert response.rc == 0<br>    assert \"healthy\" in response.stdout<br></code></pre></p>\n\n<hr>\n<h2>ArgoCD - GitOps</h2>\n\n<h3>Application</h3>\n\n<pre><code># argocd/application.yaml\napiVersion: argoproj.io/v1alpha1\nkind: Application\nmetadata:\n  name: myapp-api\n  namespace: argocd\n  finalizers:\n    - resources-finalizer.argocd.argoproj.io\nspec:\n  project: default\n  source:\n    repoURL: https://github.com/myorg/manifests.git\n    targetRevision: HEAD\n    path: apps/api-service/overlays/production\n  destination:\n    server: https://kubernetes.default.svc\n    namespace: production\n  syncPolicy:\n    automated:\n      prune: true\n      selfHeal: true\n      allowEmpty: false\n    syncOptions:\n      - CreateNamespace=true\n      - PruneLast=true\n    retry:\n      limit: 5\n      backoff:\n        duration: 5s\n        factor: 2\n        maxDuration: 3m\n  ignoreDifferences:\n    - group: apps\n      kind: Deployment\n      jsonPointers:\n        - /spec/replicas\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>GitOps garante infraestrutura versionada e testável. As chaves são:<br><ol><li><strong>Tudo no Git</strong> - Audit trail completo</li><br><li><strong>Testar infraestrutura</strong> - Terratest, Checkov, Molecule</li><br><li><strong>Automação</strong> - ArgoCD reconcile</li><br><li><strong>Policy as Code</strong> - Validate with Sentinel</li><br><li><strong>Drift detection</strong> - Detect unauthorized changes</li></ol></p>', 'GitOps e Qualidade: Infraestrutura como Código Testável', '', 'inherit', 'closed', 'closed', '', '206-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '206', 'http://localhost:8082/ideiasti/?p=434', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('435', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a testar acessibilidade: WCAG 2.1, ARIA, screen readers, testes automatizados e manuais para garantir que seu site é acessível a todos.</p>\n\n<hr>\n<h2>O Que é Acessibilidade?</h2>\n\n<p>Acessibilidade web garante que pessoas com deficiências podem usar websites. No Brasil, a <strong>Lei Brasileira de Inclusão (Lei 13.146/2015)</strong> exige acessibilidade em sites públicos e de empresas.</p>\n\n<h3>Por Que Importa?</h3>\n\n<ul><li><strong>Inclusão</strong>: 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} da população tem algum tipo de deficiência</li><ol><li><strong>Legal</strong>: Conformidade com LGPD e leis</li>\n<li><strong>SEO</strong>: Sites acessíveis rankeiam melhor</li>\n<li><strong>UX</strong>: Boas práticas beneficiam todos</li>\n</ol>\n<hr>\n<h2>WCAG 2.1 - 4 Princípios</h2>\n\n<h3>1. Perceivable (Perceptível)</h3>\n\n<pre><code><!-- Imagens com alt text -->\n<img src=\"logo.png\" alt=\"Empresa X - Página inicial\">\n\n<p><!-- Vídeos com legendas --><br><video><br>  <track kind=\"subtitles\" src=\"legendas.vtt\" srclang=\"pt\" label=\"Português\"><br></video></p>\n\n<p><!-- Contrast adequado --><br><br>  .text {<br>    color: #1a1a1a;        /<em> Pior: #767676 = 4.5:1 em fundo branco </em>/<br>    background: #ffffff;   /<em> Melhor: #1a1a1a = 21:1 em fundo branco </em>/<br>  }<br><br></code></pre></p>\n\n<h3>2. Operable (Operável)</h3>\n\n<pre><code><!-- Navegação por teclado -->\n<nav>\n  <a href=\"#main\" class=\"skip-link\">Pular para conteúdo principal</a>\n  <a href=\"#menu\">Menu</a>\n  <a href=\"#search\">Busca</a>\n</nav>\n\n<p><br>.skip-link {<br>  position: absolute;<br>  top: -40px;<br>  left: 0;<br>  background: #000;<br>  color: #fff;<br>  padding: 8px;<br>  z-index: 100;<br>}<br>.skip-link:focus {<br>  top: 0;<br>}<br></p>\n\n<p><!-- Focus visível --><br>:focus {<br>  outline: 3px solid #005fcc;<br>  outline-offset: 2px;<br>}<br></code></pre></p>\n\n<h3>3. Understandable (Compreensível)</h3>\n\n<pre><code><!-- Labels em inputs -->\n<label for=\"email\">Email</label>\n\n<span id=\"email-hint\">Formato: usuario@dominio.com</span>\n\n<p><!-- Erros claros --><br><div class=\"error\" role=\"alert\"><br>  <span id=\"password-error\">Senha deve ter:</span><br>  <ul aria-labelledby=\"password-error\"><br>    <li id=\"error-length\">Mínimo 8 caracteres</li><br>    <li id=\"error-number\">Pelo menos 1 número</li><br>  </ul><br></div><br></code></pre></p>\n\n<h3>4. Robust (Robusto)</h3>\n\n<pre><code><!-- HTML semântico -->\n<header role=\"banner\">\n  <nav role=\"navigation\" aria-label=\"Menu principal\">\n  <main role=\"main\">\n  <article role=\"article\">\n  <aside role=\"complementary\">\n  <footer role=\"contentinfo\">\n</code></pre>\n\n<hr>\n<h2>ARIA - Accessible Rich Internet Applications</h2>\n\n<h3>Roles</h3>\n\n<pre><code><!-- Landmarks -->\n<header role=\"banner\">\n<nav role=\"navigation\">\n<main role=\"main\">\n<aside role=\"complementary\">\n<footer role=\"contentinfo\">\n\n<p><!-- Widgets --><br><button role=\"button\" aria-expanded=\"false\"><br><div role=\"menu\" aria-label=\"Menu\"><br><div role=\"menuitem\"><br><div role=\"tablist\"><br><div role=\"tab\"><br><div role=\"tabpanel\"><br><div role=\"dialog\" aria-labelledby=\"dialog-title\"><br></code></pre></p>\n\n<h3>Estados e Propriedades</h3>\n\n<pre><code><!-- Expanded/Collapsed -->\n<button aria-expanded=\"false\" aria-controls=\"menu-content\">\n<div id=\"menu-content\" hidden>\n\n<p><!-- Selected --><br><br></p>\n\n<p><!-- Disabled --><br><button></p>\n\n<p><!-- Live Regions --><br><div aria-live=\"polite\">Notificação</div><br><div aria-live=\"assertive\">Erro</div><br><div><br></code></pre></p>\n\n<hr>\n<h2>Testes Automatizados</h2>\n\n<h3>axe-core</h3>\n\n<pre><code>// Playwright + axe\nconst { test, expect } = require(\'@playwright/test\');\nconst AxeBuilder = require(\'@axe-core/playwright\').default;\n\n<p>test(\'accessibility on login page\', async ({ page }) =&gt; {<br>  await page.goto(\'/login\');</p>\n\n<p>const accessibilityScanResults = await new AxeBuilder({ page })<br>    .withTags([\'wcag2a\', \'wcag2aa\', \'wcag21a\', \'wcag21aa\'])<br>    .analyze();</p>\n\n<p>// Log violations<br>  if (accessibilityScanResults.violations.length &gt; 0) {<br>    console.log(\'Violations found:\');<br>    accessibilityScanResults.violations.forEach(v =&gt; {<br>      console.log(<code>  - ${v.id}: ${v.description}</code>);<br>    });<br>  }</p>\n\n<p>// Fail if critical violations<br>  const critical = accessibilityScanResults.violations.filter(<br>    v =&gt; v.impact === \'critical\'<br>  );<br>  expect(critical.length, <code>${critical.length} critical violations</code>).toBe(0);<br>});<br></code></pre></p>\n\n<pre><code># pytest + axe\nimport pytest\nfrom playwright.sync_api import Page\n\n<p>def test_accessibility(page: Page):<br>    page.goto(\'/login\')</p>\n\n<p>results = page.run_axe()</p>\n\n<p>critical_violations = [<br>        v for v in results[\'violations\']<br>        if v[\'impact\'] in [\'critical\', \'serious\']<br>    ]</p>\n\n<p>assert len(critical_violations) == 0, (<br>        f\"Found {len(critical_violations)} critical accessibility violations\"<br>    )<br></code></pre></p>\n\n<h3>Lighthouse CI</h3>\n\n<pre><code># .github/workflows/a11y.yml\nname: Accessibility Tests\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  accessibility:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Lighthouse CI<br>        uses: treosh/lighthouse-ci-action@v10<br>        with:<br>          urls: |<br>            https://example.com/<br>            https://example.com/login<br>          budgetPath: ./lighthouse-budget.json<br>          uploadArtifacts: true<br>          temporaryPublicStorage: true</p>\n\n<p># lighthouse-budget.json<br>{<br>  \"ci\": {<br>    \"collect\": {<br>      \"startServerCommand\": \"npm run start\",<br>      \"url\": [<br>        \"http://localhost:8080/\"<br>      ]<br>    },<br>    \"assert\": {<br>      \"assertions\": {<br>        \"categories:accessibility\": [\"error\", {\"minScore\": 0.9}]<br>      }<br>    }<br>  }<br>}<br></code></pre></p>\n\n<hr>\n<h2>Testes Manuais</h2>\n\n<h3>Checklist de Testes Manuais</h3>\n\n<pre><code># Accessibility Testing Checklist\n\n<h2>Navegação por Teclado</h2><ol><li>[ ] Tab percorre todos os elementos interativos</li>\n<li>[ ] ordem de foco faz sentido</li>\n<li>[ ] Focus é sempre visível</li>\n<li>[ ] Links úteis no topo (skip link)</li>\n<li>[ ] ESC fecha modais</li>\n<li>[ ] Enter ativa botões e links</li>\n</ol>\n<h2>Imagens</h2><ol><li>[ ] Todas imagens têm alt text</li>\n<li>[ ] Alt text descreve conteúdo/função</li>\n<li>[ ] Imagens decorativas têm alt=\"\"</li>\n<li>[ ] Textos em imagens evitados</li>\n</ol>\n<h2>Contrastes</h2><ol><li>[ ] Texto normal: 4.5:1 mínimo</li>\n<li>[ ] Texto grande (18pt+): 3:1 mínimo</li>\n<li>[ ] Gráficos: 3:1</li>\n</ol>\n<h2>Formulários</h2><ol><li>[ ] Labels associados a inputs</li>\n<li>[ ] Erros descritos claramente</li>\n<li>[ ] Campos obrigatórios marcados</li>\n<li>[ ] Autocomplete quando aplicável</li>\n</ol>\n<h2>Semântica</h2><ol><li>[ ] Cabeçalhos em ordem (h1 &gt; h2 &gt; h3)</li>\n<li>[ ] Listas usam <ul>/<ol></li>\n<li>[ ] Tabelas têm headers</li>\n<li>[ ] Landmarks definidos</li>\n</ol>\n<h2>ARIA</h2><ol><li>[ ] ARIA usado quando HTML não é suficiente</li>\n<li>[ ] ARIA não sobrepõe semântica nativa</li>\n<li>[ ] Live regions atualizam corretamente</li>\n</ol></code></pre>\n\n<h3>Screen Reader Testing</h3>\n\n<pre><code># Screen Reader Testing\n\n<h2>VoiceOver (macOS)</h2><ol><li>Cmd + F5: Ativar VoiceOver</li>\n<li>Tab/Cmd + Option + Setas: Navegar</li>\n<li>Cmd + Option + U: Rotor</li>\n</ol>\n<h2>NVDA (Windows)</h2><ol><li>Insert + D: Ler documento</li>\n<li>Tab: Próximo elemento</li>\n<li>Insert + Espaço: Modo foco</li>\n</ol>\n<h2>Verificar:</h2><ol><li>[ ] Ordem de leitura faz sentido</li>\n<li>[ ] Imagens descritas</li>\n<li>[ ] Links têm contexto</li>\n<li>[ ] Formulários etiquetados</li>\n<li>[ ] Tabelas fazem sentido</li>\n<li>[ ] Headings navegáveis</li></ol></ul>\n</code></pre>\n\n<hr>\n<h2>Ferramentas</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Custo</th></tr>\n<tr><td><strong>axe DevTools</strong></td><td>Browser Extension</td><td>Grátis</td></tr>\n<tr><td><strong>WAVE</strong></td><td>Browser Extension</td><td>Grátis</td></tr>\n<tr><td><strong>Lighthouse</strong></td><td>DevTools/CLI</td><td>Grátis</td></tr>\n<tr><td><strong>AXE-core</strong></td><td>Library</td><td>Grátis</td></tr>\n<tr><td><strong>SiteImprove</strong></td><td>SaaS</td><td>Pago</td></tr>\n<tr><td><strong>Deque aXe</strong></td><td>Enterprise</td><td>Pago</td></tr>\n<tr><td><strong>Tenon.io</strong></td><td>API</td><td>Pago</td></tr>\n</table></figure>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Acessibilidade é fundamental para inclusão. As chaves são:<br><ol><li><strong>Semântica primeiro</strong> - Use HTML correto</li><br><li><strong>Teste automatizado</strong> - Capture issues rapidamente</li><br><li><strong>Teste manual</strong> - Screen readers e teclado</li><br><li><strong>WCAG compliance</strong> - Atingir nível AA mínimo</li><br><li><strong>Continuous testing</strong> - Integre ao CI/CD</li></ol></p>', 'Accessibility Testing: Garantindo Inclusão e Conformidade WCAG', '', 'inherit', 'closed', 'closed', '', '207-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '207', 'http://localhost:8082/ideiasti/?p=435', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('436', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a usar Docker para QA: imagens otimizadas, docker-compose, multi-stage builds, e como containerizar sua suite de testes.</p>\n\n<hr>\n<h2>Por Que Docker para QA?</h2>\n\n<ul><li><strong>Ambientes consistentes</strong> - Same in dev, CI, prod</li><ol><li><strong>Isolamento</strong> - Testes não afetam sistema host</li>\n<li><strong>Reproducibilidade</strong> - Resultados consistentes</li>\n<li><strong>Escalabilidade</strong> - Múltiplos containers de teste</li>\n<li><strong>CI/CD integration</strong> - Fáceis de automatizar</li></ol></ul>\n\n<hr>\n<h2>Dockerfile para Testes</h2>\n\n<h3>Multi-Stage Build</h3>\n\n<pre><code># syntax=docker/dockerfile:1\n\n<p># Stage 1: Build<br>FROM node:18-alpine AS builder<br>WORKDIR /app</p>\n\n<p>COPY package*.json ./<br>RUN npm ci --only=production</p>\n\n<p>COPY . .<br>RUN npm run build</p>\n\n<p># Stage 2: Test<br>FROM node:18-alpine AS test<br>WORKDIR /app</p>\n\n<p># Copy dependencies only (layer caching)<br>COPY package*.json ./<br>RUN npm ci</p>\n\n<p># Copy source<br>COPY . .</p>\n\n<p># Install test dependencies<br>RUN npm ci --prefix .</p>\n\n<p># Copy built artifacts<br>COPY --from=builder /app/dist ./dist<br>COPY --from=builder /app/node_modules ./node_modules</p>\n\n<p># Run tests<br>CMD [\"npm\", \"test\"]</p>\n\n<p># Stage 3: Production<br>FROM node:18-alpine AS production<br>WORKDIR /app</p>\n\n<p>COPY --from=builder /app/dist ./dist<br>COPY --from=builder /app/node_modules ./node_modules<br>COPY --from=builder /app/package*.json ./</p>\n\n<p>USER node<br>EXPOSE 8080</p>\n\n<p>CMD [\"node\", \"dist/index.js\"]<br></code></pre></p>\n\n<h3>Python Tests</h3>\n\n<pre><code>FROM python:3.11-slim\n\n<p>WORKDIR /app</p>\n\n<p># Install system dependencies<br>RUN apt-get update &amp;&amp; apt-get install -y --no-install-recommends <br>    build-essential <br>    libpq-dev <br>    &amp;&amp; rm -rf /var/lib/apt/lists/*</p>\n\n<p># Copy requirements first (layer caching)<br>COPY requirements.txt .<br>RUN pip install --no-cache-dir -r requirements.txt</p>\n\n<p># Copy application<br>COPY . .</p>\n\n<p># Run tests with coverage<br>CMD [\"pytest\", \"-v\", \"--cov=src\", \"--cov-report=xml\", \"--cov-report=html\"]<br></code></pre></p>\n\n<hr>\n<h2>Docker Compose para Ambientes</h2>\n\n<h3>Desenvolvimento Local</h3>\n\n<pre><code># docker-compose.yml\nversion: \'3.8\'\n\n<p>services:<br>  app:<br>    build:<br>      context: .<br>      dockerfile: Dockerfile<br>    ports:<br>      - \"3000:3000\"<br>    environment:<br>      - NODE_ENV=development<br>      - DATABASE_URL=postgres://test:test@db:5432/test<br>      - REDIS_URL=redis://cache:6379<br>    depends_on:<br>      db:<br>        condition: service_healthy<br>      cache:<br>        condition: service_started<br>    volumes:<br>      - .:/app<br>      - /app/node_modules<br>    command: npm run dev</p>\n\n<p>db:<br>    image: postgres:15-alpine<br>    environment:<br>      POSTGRES_DB: test<br>      POSTGRES_USER: test<br>      POSTGRES_PASSWORD: test<br>    ports:<br>      - \"5432:5432\"<br>    volumes:<br>      - postgres_data:/var/lib/postgresql/data<br>      - ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init.sql<br>    healthcheck:<br>      test: [\"CMD-SHELL\", \"pg_isready -U test -d test\"]<br>      interval: 5s<br>      timeout: 5s<br>      retries: 5</p>\n\n<p>cache:<br>    image: redis:7-alpine<br>    ports:<br>      - \"6379:6379\"<br>    volumes:<br>      - redis_data:/data</p>\n\n<p>test:<br>    build:<br>      context: .<br>      dockerfile: Dockerfile.test<br>    environment:<br>      - DATABASE_URL=postgres://test:test@db:5432/test<br>      - REDIS_URL=redis://cache:6379<br>    depends_on:<br>      db:<br>        condition: service_healthy<br>      cache:<br>        condition: service_started<br>    volumes:<br>      - ./test-results:/app/test-results<br>    command: pytest -v --junitxml=/app/test-results/results.xml</p>\n\n<p>volumes:<br>  postgres_data:<br>  redis_data:<br></code></pre></p>\n\n<h3>CI Environment</h3>\n\n<pre><code># docker-compose.ci.yml\nversion: \'3.8\'\n\n<p>services:<br>  app:<br>    build:<br>      context: .<br>      target: test<br>    depends_on:<br>      postgres:<br>        condition: service_healthy<br>      redis:<br>        condition: service_started<br>    environment:<br>      DATABASE_URL: postgres://test:test@postgres:5432/test<br>      REDIS_URL: redis://redis:6379<br>    command: pytest -v --cov=src --cov-report=xml --cov-fail-under=80</p>\n\n<p>postgres:<br>    image: postgres:15-alpine<br>    environment:<br>      POSTGRES_DB: test<br>      POSTGRES_USER: test<br>      POSTGRES_PASSWORD: test<br>    healthcheck:<br>      test: [\"CMD-SHELL\", \"pg_isready -U test\"]<br>      interval: 5s<br>      timeout: 5s<br>      retries: 5</p>\n\n<p>redis:<br>    image: redis:7-alpine<br></code></pre></p>\n\n<hr>\n<h2>Testcontainers</h2>\n\n<pre><code># testcontainers_example.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\nfrom testcontainers.compose import DockerCompose\nimport psycopg2\n\n<p>@pytest.fixture(scope=\"module\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as pg:<br>        yield pg</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def redis():<br>    with RedisContainer(\"redis:7\") as rd:<br>        yield rd</p>\n\n<p>@pytest.fixture<br>def db_connection(postgres):<br>    conn = psycopg2.connect(postgres.get_connection_url())<br>    yield conn<br>    conn.close()</p>\n\n<p>def test_with_containers(postgres, redis):<br>    \"\"\"Test usando bancos containerizados\"\"\"<br>    # Use containers<br>    db_url = postgres.get_connection_url()<br>    redis_url = redis.get_connection_url()</p>\n\n<p># Your test logic here<br>    conn = psycopg2.connect(db_url)<br>    cursor = conn.cursor()<br>    cursor.execute(\"SELECT version();\")<br>    result = cursor.fetchone()<br>    assert \"PostgreSQL\" in result[0]<br></code></pre></p>\n\n<hr>\n<h2>Docker para Selenium Grid</h2>\n\n<pre><code># selenium-grid.yml\nversion: \'3.8\'\n\n<p>services:<br>  selenium-hub:<br>    image: selenium/hub:4.15<br>    ports:<br>      - \"4442:4442\"<br>      - \"4443:4443\"<br>      - \"4444:4444\"<br>    environment:<br>      SE_EVENT_BUS_HOST: selenium-hub<br>      SE_EVENT_BUS_PUBLISH_PORT: 4442<br>      SE_EVENT_BUS_SUBSCRIBE_PORT: 4443</p>\n\n<p>chrome:<br>    image: selenium/node-chrome:4.15<br>    depends_on:<br>      - selenium-hub<br>    environment:<br>      SE_EVENT_BUS_HOST: selenium-hub<br>      SE_EVENT_BUS_PUBLISH_PORT: 4442<br>      SE_EVENT_BUS_SUBSCRIBE_PORT: 4443<br>      SE_NODE_MAX_SESSIONS: 5<br>    shm_size: \'2gb\'</p>\n\n<p>firefox:<br>    image: selenium/node-firefox:4.15<br>    depends_on:<br>      - selenium-hub<br>    environment:<br>      SE_EVENT_BUS_HOST: selenium-hub<br>      SE_EVENT_BUS_PUBLISH_PORT: 4442<br>      SE_EVENT_BUS_SUBSCRIBE_PORT: 4443<br>      SE_NODE_MAX_SESSIONS: 3</p>\n\n<p>edge:<br>    image: selenium/node-edge:4.15<br>    depends_on:<br>      - selenium-hub<br>    environment:<br>      SE_EVENT_BUS_HOST: selenium-hub<br>      SE_EVENT_BUS_PUBLISH_PORT: 4442<br>      SE_EVENT_BUS_SUBSCRIBE_PORT: 4443<br>      SE_NODE_MAX_SESSIONS: 3<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Docker é essencial para QA moderno. As chaves são:<br><ol><li><strong>Multi-stage builds</strong> - Imagens otimizadas</li><br><li><strong>Docker Compose</strong> - Ambientes completos</li><br><li><strong>Testcontainers</strong> - DBs containerizados para testes</li><br><li><strong>Layer caching</strong> - Builds mais rápidos</li><br><li><strong>CI integration</strong> - Automação simplificada</li></ol></p>', 'Docker para QA: Containers para Testes e Ambientes', '', 'inherit', 'closed', 'closed', '', '208-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '208', 'http://localhost:8082/ideiasti/?p=436', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('437', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a criar e usar fake services: mocking de APIs, databases, message queues. Como testar sem dependências externas.</p>\n\n<hr>\n<h2>Por Que Usar Fakes e Mocks?</h2>\n\n<ul><li><strong>Isolamento</strong>: Testes não dependem de serviços externos</li><ol><li><strong>Velocidade</strong>: Mocks são mais rápidos que serviços reais</li>\n<li><strong>Confiabilidade</strong>: Não há flaky tests por dependências</li>\n<li><strong>Cobertura</strong>: Testar edge cases difíceis de reproduzir</li></ol></ul>\n\n<hr>\n<h2>Tipos de Fakes</h2>\n\n<h3>1. Fake Objects</h3>\n\n<p>Simulam comportamento de objetos reais.</p>\n\n<pre><code># fakes/user_repository.py\nclass FakeUserRepository:\n    def __init__(self):\n        self.users = {}\n        self._id_counter = 1\n\n<p>def save(self, user):<br>        if not user.id:<br>            user.id = self._id_counter<br>            self._id_counter += 1<br>        self.users[user.id] = user<br>        return user</p>\n\n<p>def find_by_id(self, id):<br>        return self.users.get(id)</p>\n\n<p>def find_by_email(self, email):<br>        for user in self.users.values():<br>            if user.email == email:<br>                return user<br>        return None</p>\n\n<p>def delete(self, id):<br>        if id in self.users:<br>            del self.users[id]<br>            return True<br>        return False</p>\n\n<p># Uso em testes<br>def test_create_user():<br>    repo = FakeUserRepository()<br>    service = UserService(repo)</p>\n\n<p>user = service.create_user(\"João\", \"joao@example.com\")</p>\n\n<p>assert user.id is not None<br>    assert user.name == \"João\"<br>    assert repo.find_by_email(\"joao@example.com\") == user<br></code></pre></p>\n\n<h3>2. Fake APIs</h3>\n\n<p>Simulam endpoints HTTP.</p>\n\n<pre><code># fakes/http_fake.py\nimport json\nfrom http.server import HTTPServer, BaseHTTPRequestHandler\nfrom threading import Thread\nfrom typing import Dict, Callable\n\n<p>class FakeAPIHandler(BaseHTTPRequestHandler):<br>    routes: Dict[str, Callable] = {}</p>\n\n<p>def do_GET(self):<br>        self._handle_request(\'GET\')</p>\n\n<p>def do_POST(self):<br>        self._handle_request(\'POST\')</p>\n\n<p>def do_PUT(self):<br>        self._handle_request(\'PUT\')</p>\n\n<p>def do_DELETE(self):<br>        self._handle_request(\'DELETE\')</p>\n\n<p>def _handle_request(self, method):<br>        handler = self.routes.get((method, self.path))<br>        if handler:<br>            response = handler(self)<br>            self._send_response(response)<br>        else:<br>            self._send_response({\'error\': \'Not found\'}, 404)</p>\n\n<p>def _send_response(self, data, status=200):<br>        self.send_response(status)<br>        self.send_header(\'Content-Type\', \'application/json\')<br>        self.end_headers()<br>        self.wfile.write(json.dumps(data).encode())</p>\n\n<p>def log_message(self, format, *args):<br>        pass  # Silenciar logs</p>\n\n<p>class FakeAPIServer:<br>    def __init__(self, port=8080):<br>        self.port = port<br>        self.server = None<br>        self.thread = None<br>        self.routes = {}</p>\n\n<p>def register(self, method, path, handler):<br>        self.routes[(method, path)] = handler<br>        FakeAPIHandler.routes = self.routes</p>\n\n<p>def start(self):<br>        self.server = HTTPServer((\'localhost\', self.port), FakeAPIHandler)<br>        self.thread = Thread(target=self.server.serve_forever)<br>        self.thread.daemon = True<br>        self.thread.start()</p>\n\n<p>def stop(self):<br>        if self.server:<br>            self.server.shutdown()</p>\n\n<p># Uso<br>def payment_handler(request):<br>    return {<br>        \'transaction_id\': \'tx_123\',<br>        \'status\': \'approved\',<br>        \'amount\': 99.90<br>    }</p>\n\n<p>fake_api = FakeAPIServer(8080)<br>fake_api.register(\'POST\', \'/api/payment\', payment_handler)<br>fake_api.start()</p>\n\n<p># Seus testes aqui</p>\n\n<p>fake_api.stop()<br></code></pre></p>\n\n<h3>3. Fake Databases (SQLite)</h3>\n\n<pre><code># fakes/database.py\nimport sqlite3\nimport os\n\n<p>class FakeDatabase:<br>    def __init__(self, in_memory=True):<br>        if in_memory:<br>            self.conn = sqlite3.connect(\':memory:\')<br>        else:<br>            self.db_path = \'test.db\'<br>            self.conn = sqlite3.connect(self.db_path)</p>\n\n<p>self.conn.row_factory = sqlite3.Row<br>        self._create_tables()</p>\n\n<p>def _create_tables(self):<br>        cursor = self.conn.cursor()<br>        cursor.execute(\'\'\'<br>            CREATE TABLE users (<br>                id INTEGER PRIMARY KEY AUTOINCREMENT,<br>                name TEXT NOT NULL,<br>                email TEXT UNIQUE NOT NULL<br>            )<br>        \'\'\')<br>        cursor.execute(\'\'\'<br>            CREATE TABLE products (<br>                id INTEGER PRIMARY KEY AUTOINCREMENT,<br>                name TEXT NOT NULL,<br>                price REAL NOT NULL<br>            )<br>        \'\'\')<br>        self.conn.commit()</p>\n\n<p>def execute(self, query, params=None):<br>        cursor = self.conn.cursor()<br>        if params:<br>            cursor.execute(query, params)<br>        else:<br>            cursor.execute(query)<br>        self.conn.commit()<br>        return cursor</p>\n\n<p>def fetchone(self, query, params=None):<br>        cursor = self.execute(query, params)<br>        return cursor.fetchone()</p>\n\n<p>def fetchall(self, query, params=None):<br>        cursor = self.execute(query, params)<br>        return cursor.fetchall()</p>\n\n<p>def close(self):<br>        self.conn.close()<br>        if hasattr(self, \'db_path\') and os.path.exists(self.db_path):<br>            os.remove(self.db_path)</p>\n\n<p># Uso<br>def test_user_crud():<br>    db = FakeDatabase()</p>\n\n<p># Create<br>    db.execute(<br>        \'INSERT INTO users (name, email) VALUES (?, ?)\',<br>        (\'João\', \'joao@example.com\')<br>    )</p>\n\n<p># Read<br>    user = db.fetchone(\'SELECT * FROM users WHERE email = ?\', (\'joao@example.com\',))<br>    assert user[\'name\'] == \'João\'</p>\n\n<p>db.close()<br></code></pre></p>\n\n<hr>\n<h2>Mocking Libraries</h2>\n\n<h3>unittest.mock (Python)</h3>\n\n<pre><code>from unittest.mock import Mock, patch, MagicMock\n\n<p># Mock básico<br>def test_payment():<br>    mock_gateway = Mock()<br>    mock_gateway.charge.return_value = {\'status\': \'success\'}</p>\n\n<p>result = process_payment(100, mock_gateway)</p>\n\n<p>mock_gateway.charge.assert_called_once_with(100)<br>    assert result == \'success\'</p>\n\n<p># Patch<br>@patch(\'myapp.services.payment_gateway\')<br>def test_with_patch(mock_gateway):<br>    mock_gateway.charge.return_value = {\'status\': \'success\'}</p>\n\n<p>result = process_payment(100)</p>\n\n<p>mock_gateway.charge.assert_called_once()</p>\n\n<p># Spy (partial mock)<br>def test_spy():<br>    real_service = PaymentService()<br>    spy_service = Mock(wraps=real_service)</p>\n\n<p>spy_service.process(100)</p>\n\n<p>assert spy_service.process.called<br>    assert real_service.internal_method.called  # Real method foi chamado<br></code></pre></p>\n\n<h3>WireMock (Java/Server)</h3>\n\n<pre><code>// Java WireMock\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport static com.github.tomakehurst.wiremock.client.WireMock.*;\n\n<p>WireMockServer wireMock = new WireMockServer(8080);<br>wireMock.start();</p>\n\n<p>// Stub<br>wireMock.stubFor(post(urlEqualTo(\"/api/payment\"))<br>    .withRequestBody(containing(\"amount\"))<br>    .willReturn(aResponse()<br>        .withStatus(200)<br>        .withHeader(\"Content-Type\", \"application/json\")<br>        .withBody(\"{\"transaction_id\":\"tx_123\",\"status\":\"approved\"}\")));</p>\n\n<p>// Test<br>RestAssured.given()<br>    .contentType(\"application/json\")<br>    .body(\"{\"amount\":100}\")<br>.when()<br>    .post(\"http://localhost:8080/api/payment\")<br>.then()<br>    .statusCode(200)<br>    .body(\"status\", equalTo(\"approved\"));</p>\n\n<p>wireMock.stop();<br></code></pre></p>\n\n<h3>MSW (Mock Service Worker)</h3>\n\n<pre><code>// Mock API com MSW\nimport { setupWorker, rest } from \'msw\';\n\n<p>const handlers = [<br>  rest.post(\'/api/payment\', (req, res, ctx) =&gt; {<br>    return res(<br>      ctx.status(200),<br>      ctx.json({<br>        transaction_id: \'tx_123\',<br>        status: \'approved\',<br>        amount: req.body.amount<br>      })<br>    );<br>  }),</p>\n\n<p>rest.get(\'/api/users/:id\', (req, res, ctx) =&gt; {<br>    return res(<br>      ctx.status(200),<br>      ctx.json({<br>        id: req.params.id,<br>        name: \'João Silva\',<br>        email: \'joao@example.com\'<br>      })<br>    );<br>  }),</p>\n\n<p>rest.post(\'/api/users\', (req, res, ctx) =&gt; {<br>    return res(<br>      ctx.status(201),<br>      ctx.json({<br>        id: \'new-user-id\',<br>        ...req.body<br>      })<br>    );<br>  })<br>];</p>\n\n<p>export const worker = setupWorker(...handlers);</p>\n\n<p>// No test<br>import { worker } from \'./mocks/browser\';</p>\n\n<p>beforeAll(() =&gt; worker.start());<br>afterAll(() =&gt; worker.stop());</p>\n\n<p>test(\'payment flow\', async () =&gt; {<br>  render();</p>\n\n<p>// MSW intercepta requisição<br>  await userEvent.type(screen.getByLabelText(\'Valor\'), \'100\');<br>  await userEvent.click(screen.getByRole(\'button\', { name: /pagar/i }));</p>\n\n<p>expect(await screen.findByText(/transação aprovada/i)).toBeInTheDocument();<br>});<br></code></pre></p>\n\n<hr>\n<h2>TestContainers vs Fakes</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Aspecto</th><th>TestContainers</th><th>Fakes</th></tr>\n<tr><td><strong>Fidelidade</strong></td><td>Real service</td><td>Simulado</td></tr>\n<tr><td><strong>Velocidade</strong></td><td>Lento (minutos)</td><td>Rápido (ms)</td></tr>\n<tr><td><strong>Complexidade</strong></td><td>Alta</td><td>Baixa</td></tr>\n<tr><td><strong>Bugs encontrados</strong></td><td>Mais realistas</td><td>Menos</td></tr>\n<tr><td><strong>Manutenção</strong></td><td>Baixa</td><td>Alta (manter fakes)</td></tr>\n</table></figure>\n\n<h3>Quando Usar Cada</h3>\n\n<pre><code># Use FAKE quando:\n# - Precisa de respostas específicas/edge cases\n# - Performance é crítica\n# - Serviço externo é lento/não disponível\n# - Quer testar comportamento, não implementação\n\n<p># Use TestContainers quando:<br># - Precisa de comportamento real<br># - Testando integrações complexas<br># - Quer detectar problemas realistas<br># - Manutenção do fake seria muito complexa<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Mocks e fakes são essenciais para testes isolados. As chaves são:<br><ol><li><strong>Isolar</strong> - Testes não devem depender de externos</li><br><li><strong>Velocidade</strong> - Fakes são rápidos</li><br><li><strong>Verossimilhança</strong> - Fakes devem ser realistas</li><br><li><strong>Manutenção</strong> - Mocks automáticos vs manuais</li><br><li><strong>Combinar</strong> - Fakes + TestContainers quando necessário</li></ol></p>', 'Fake Services e Mocking: Isolando Dependências Externas', '', 'inherit', 'closed', 'closed', '', '209-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '209', 'http://localhost:8082/ideiasti/?p=437', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('438', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda testes de acessibilidade: WCAG 2.1, axe-core, Lighthouse, testes manuais e como garantir que seus apps são acessíveis.</p>\n\n<hr>\n<h2>Por Que Acessibilidade Importa?</h2>\n\n<ul><li><strong>1.3 bilhões</strong> de pessoas com deficiência no mundo</li><ol><li><strong>Leis</strong> como ADA, LGPD, EU Accessibility Act</li>\n<li><strong>SEO</strong> - Google prioriza sites acessíveis</li>\n<li><strong>Reputação</strong> - Marca inclusiva</li>\n<li><strong>Mercado</strong> - P público que você está excluindo</li>\n</ol>\n<hr>\n<h2>WCAG 2.1 - Princípios</h2>\n\n<h3>4 Princípios (POUR)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Princípio</th><th>Descrição</th></tr>\n<tr><td><strong>Perceivable</strong></td><td>Informações devem ser perceptíveis</td></tr>\n<tr><td><strong>Operable</strong></td><td>Interface deve ser operável</td></tr>\n<tr><td><strong>Understandable</strong></td><td>Informações e interface compreensíveis</td></tr>\n<tr><td><strong>Robust</strong></td><td>Conteúdo deve funcionar com tecnologias assistivas</td></tr>\n</table></figure>\n\n<h3>Níveis de Conformidade</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Nível</th><th>Significado</th><th>Requisito</th></tr>\n<tr><td><strong>A</strong></td><td>Básico</td><td>Mínimo, deve atender</td></tr>\n<tr><td><strong>AA</strong></td><td>Padrão</td><td>Recomendado, maioria das leis</td></tr>\n<tr><td><strong>AAA</strong></td><td>Avançado</td><td>Mais rigoroso, poucos достигают</td></tr>\n</table></figure>\n\n<hr>\n<h2>Ferramentas Automatizadas</h2>\n\n<h3>axe-core</h3>\n\n<pre><code>// Npm\nnpm install @axe-core/playwright\n\n<p>// Playwright integration<br>const { chromium } = require(\'playwright\');<br>const AxeBuilder = require(\'@axe-core/playwright\').default;</p>\n\n<p>async function runAccessibilityTest() {<br>    const browser = await chromium.launch();<br>    const page = await browser.newPage();</p>\n\n<p>await page.goto(\'https://example.com\');</p>\n\n<p>const results = await new AxeBuilder({ page })<br>        .withTags([\'wcag2a\', \'wcag2aa\', \'wcag21aa\'])<br>        .analyze();</p>\n\n<p>console.log(\'Violations:\', results.violations.length);<br>    results.violations.forEach(v =&gt; {<br>        console.log(<code>- ${v.id}: ${v.description}</code>);<br>    });</p>\n\n<p>await browser.close();<br>}<br></code></pre></p>\n\n<h3>Lighthouse CI</h3>\n\n<pre><code># GitHub Actions<ol><li>name: Lighthouse</li>\n</ol>  uses: treosh/lighthouse-ci-action@v10\n  with:\n    urls: https://example.com\n    budgetPath: ./lighthouserc.json\n    uploadArtifacts: true\n</code></pre>\n\n<pre><code>// lighthouserc.json\n{\n  \"ci\": {\n    \"collect\": {\n      \"settings\": {\n        \"staticDistDir\": \"./dist\"\n      }\n    },\n    \"assert\": {\n      \"assertions\": {\n        \"categories:accessibility\": [\"error\", {\"minScore\": 0.9}],\n        \"first-contentful-paint\": [\"warn\", { \"maxNumericValue\": 2000 }],\n        \"uses-passive-event-listeners\": \"off\"\n      }\n    }\n  }\n}\n</code></pre>\n\n<hr>\n<h2>Testes Manuais</h2>\n\n<h3>Checklist de Teclado</h3>\n\n<pre><code><h2>Navegação por Teclado</h2>\n\n<h3>Essential</h3><ol><li>[ ] Tab avança logicamente entre elementos</li>\n<li>[ ] Shift+Tab retorna ao elemento anterior</li>\n<li>[ ] Enter ativa botões e links</li>\n<li>[ ] Space ativa botões e checkboxes</li>\n<li>[ ] Escape fecha modais e dropdowns</li>\n<li>[ ] Setas navegam em menus</li>\n</ol>\n<h3>Skip Links</h3><ol><li>[ ] Link \"Skip to main content\" existe</li>\n<li>[ ] Link é visível quando focado</li>\n<li>[ ] Link funciona corretamente</li>\n</ol>\n<h3>Focus Indicators</h3><ol><li>[ ] Focus é sempre visível</li>\n<li>[ ] Estilo de focus não é apenas cor</li>\n<li>[ ] Focus não desaparece em nenhum elemento</li>\n</ol></code></pre>\n\n<h3>Checklist de Screen Reader</h3>\n\n<pre><code><h2>Screen Reader Testing</h2>\n\n<h3>Imagens</h3><ol><li>[ ] Alt text em todas imagens informativas</li>\n<li>[ ] Alt text é descritivo e útil</li>\n<li>[ ] Imagens decorativas têm alt=\"\"</li>\n<li>[ ] SVG complexos têm descriptions</li>\n</ol>\n<h3>Formulários</h3><ol><li>[ ] Labels associados corretamente (for/id)</li>\n<li>[ ] Placeholder não substitui label</li>\n<li>[ ] Erros anunciados</li>\n<li>[ ] Required fields marcados</li>\n</ol>\n<h3>Heading Structure</h3><ol><li>[ ] h1 é único na página</li>\n<li>[ ] Hierarquia lógica (h1 &gt; h2 &gt; h3)</li>\n<li>[ ] Sem saltos (h1 &gt; h3, pulando h2)</li>\n<li>[ ] Headings não são só visuais</li>\n</ol>\n<h3>Links e Botões</h3><ol><li>[ ] Links fazem sentido fora de contexto</li>\n<li>[ ] Botões descrevem ação</li>\n<li>[ ] Links novos/abrem em nova aba avisados</li></ol></ul>\n</code></pre>\n\n<hr>\n<h2>Implementando Acessibilidade</h2>\n\n<h3>ARIA Basics</h3>\n\n<pre><code><!-- Botão com acessibilidade -->\n<button aria-label=\"Fechar modal\" aria-expanded=\"false\" aria-controls=\"modal-content\">\n  <span aria-hidden=\"true\">×</span>\n</button>\n\n<p><!-- Modal com ARIA --><br>&lt;div <br>  role=\"dialog\" <br>  aria-labelledby=\"modal-title\"<br>  aria-describedby=\"modal-desc\"<br>  aria-modal=\"true\"<br>&gt;<br>  <h2 id=\"modal-title\">Confirmação</h2><br>  <p id=\"modal-desc\">Tem certeza que deseja excluir?</p><br>  <button>Cancelar</button><br>  <button>Excluir</button><br></div></p>\n\n<p><!-- Live region para updates --><br><div aria-live=\"polite\"><br>  <!-- Conteúdo atualizado dinamicamente --><br></div></p>\n\n<p><!-- Error message --><br><label for=\"email\">Email</label><br><br><span id=\"email-error\" class=\"error\" role=\"alert\"><br>  Email inválido<br></span><br></code></pre></p>\n\n<h3>CSS para Acessibilidade</h3>\n\n<pre><code>/<em> Focus visível </em>/\n*:focus {\n  outline: 3px solid #005fcc;\n  outline-offset: 2px;\n}\n\n<p>/<em> Esconde visualmente mas mantém para screen readers </em>/<br>.sr-only {<br>  position: absolute;<br>  width: 1px;<br>  height: 1px;<br>  padding: 0;<br>  margin: -1px;<br>  overflow: hidden;<br>  clip: rect(0, 0, 0, 0);<br>  white-space: nowrap;<br>  border: 0;<br>}</p>\n\n<p>/<em> Skip link </em>/<br>.skip-link {<br>  position: absolute;<br>  top: -40px;<br>  left: 0;<br>  background: #000;<br>  color: #fff;<br>  padding: 8px;<br>  z-index: 100;<br>}</p>\n\n<p>.skip-link:focus {<br>  top: 0;<br>}</p>\n\n<p>/<em> Contraste adequado </em>/<br>.text-primary {<br>  color: #1a1a1a; /<em> Não use #777777 com fundo branco </em>/<br>}</p>\n\n<p>/<em> Touch target mínimo </em>/<br>button, a, input[type=\"checkbox\"] {<br>  min-height: 44px;<br>  min-width: 44px;<br>}<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Acessibilidade é responsabilidade de todos. As chaves são:<br><ol><li><strong>Testar cedo</strong> - A11y mais barato no início</li><br><li><strong>Automatizar</strong> - axe-core, Lighthouse</li><br><li><strong>Testar manualmente</strong> - Teclado, screen reader</li><br><li><strong>Seguir WCAG</strong> - 2.1 AA como mínimo</li><br><li><strong>Incluir na cultura</strong> - A11y não é \"extra\"</li></ol></p>', 'Testes de Acessibilidade: WCAG e Inclusão Digital', '', 'inherit', 'closed', 'closed', '', '210-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '210', 'http://localhost:8082/ideiasti/?p=438', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('439', '0', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '<p><strong>Meta Description:</strong> Aprenda Cucumber e Gherkin: escrever cenários BDD, step definitions, hooks, tags e como implementar desenvolvimento guiado por comportamento.</p>\n\n<hr>\n<h2>Cucumber Framework</h2>\n\n<p>Cucumber é uma ferramenta que permite escrever testes em linguagem natural (Gherkin) que são executados automaticamente.</p>\n\n<h3>Instalação</h3>\n\n<pre><code># Ruby\ngem install cucumber\n\n<p># Java (Maven)<br><br>    io.cucumber<br>    cucumber-java<br>    7.14.0<br></p>\n\n<p># Python<br>pip install behave</p>\n\n<p># JavaScript<br>npm install @cucumber/cucumber<br></code></pre></p>\n\n<hr>\n<h2>Gherkin - Linguagem</h2>\n\n<h3>Estrutura Básica</h3>\n\n<pre><code>Funcionalidade: Login de Usuário\n  Como um usuário registrado\n  Quero fazer login no sistema\n  Para acessar minha conta\n\n<p>Cenário: Login com credenciais válidas<br>    Dado que estou na página de login<br>    Quando preencho o campo email com \"usuario@exemplo.com\"<br>    E preencho o campo senha com \"senha123\"<br>    E clico no botão \"Entrar\"<br>    Então sou redirecionado para o dashboard<br>    E vejo a mensagem \"Bem-vindo, usuário\"</p>\n\n<p>Cenário: Login com credenciais inválidas<br>    Dado que estou na página de login<br>    Quando preencho o campo email com \"invalido@exemplo.com\"<br>    E preencho o campo senha com \"senhaerrada\"<br>    E clico no botão \"Entrar\"<br>    Então vejo a mensagem de erro \"Credenciais inválidas\"<br>    E permaneço na página de login<br></code></pre></p>\n\n<h3>Keywords</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Keyword</th><th>Usage</th></tr>\n<tr><td>Funcionalidade</td><td>Nome do recurso</td></tr>\n<tr><td>Cenário</td><td>Caso de uso</td></tr>\n<tr><td>Dado</td><td>Pré-condição</td></tr>\n<tr><td>Quando</td><td>Ação</td></tr>\n<tr><td>Então</td><td>Resultado esperado</td></tr>\n<tr><td>E</td><td>Adiciona condição</td></tr>\n<tr><td>Mas</td><td>Condição negativa</td></tr>\n<tr><td>Esquema do Cenário</td><td>Cenário com parâmetros</td></tr>\n<tr><td>Exemplos</td><td>Tabela de dados</td></tr>\n</table></figure>\n\n<hr>\n<h2>Step Definitions</h2>\n\n<h3>Python (Behave)</h3>\n\n<pre><code># features/steps/login_steps.py\nfrom behave import given, when, then\nfrom selenium.webdriver.common.by import By\n\n<p>@given(\'estou na página de login\')<br>def step_impl(context):<br>    context.browser.get(\'https://exemplo.com/login\')</p>\n\n<p>@when(\'preencho o campo email com \"{email}\"\')<br>def step_impl(context, email):<br>    element = context.browser.find_element(By.ID, \'email\')<br>    element.send_keys(email)</p>\n\n<p>@when(\'preencho o campo senha com \"{senha}\"\')<br>def step_impl(context, senha):<br>    element = context.browser.find_element(By.ID, \'password\')<br>    element.send_keys(senha)</p>\n\n<p>@when(\'clico no botão \"{texto}\"\')<br>def step_impl(context, texto):<br>    buttons = context.browser.find_elements(By.TAG_NAME, \'button\')<br>    for button in buttons:<br>        if button.text == texto:<br>            button.click()<br>            break</p>\n\n<p>@then(\'sou redirecionado para o dashboard\')<br>def step_impl(context):<br>    assert \'dashboard\' in context.browser.current_url</p>\n\n<p>@then(\'vejo a mensagem \"{texto}\"\')<br>def step_impl(context, texto):<br>    assert texto in context.browser.page_source<br></code></pre></p>\n\n<h3>Java (Cucumber)</h3>\n\n<pre><code>// src/test/java/steps/LoginSteps.java\npackage steps;\n\n<p>import io.cucumber.java.pt.*;<br>import org.openqa.selenium.By;<br>import static org.junit.Assert.*;</p>\n\n<p>public class LoginSteps {</p>\n\n<p>WebDriver driver = Hooks.driver;</p>\n\n<p>@Dado(\"estou na página de login\")<br>    public void estouNaPaginaDeLogin() {<br>        driver.get(\"https://exemplo.com/login\");<br>    }</p>\n\n<p>@Quando(\"preencho o campo email com {string}\")<br>    public void preenchoEmail(String email) {<br>        driver.findElement(By.id(\"email\")).sendKeys(email);<br>    }</p>\n\n<p>@Quando(\"preencho o campo senha com {string}\")<br>    public void preenchoSenha(String senha) {<br>        driver.findElement(By.id(\"password\")).sendKeys(senha);<br>    }</p>\n\n<p>@Quando(\"clico no botão {string}\")<br>    public void clicoNoBotao(String texto) {<br>        driver.findElement(By.xpath(\"//button[text()=\'\" + texto + \"\']\")).click();<br>    }</p>\n\n<p>@Então(\"sou redirecionado para o dashboard\")<br>    public void souRedirecionado() {<br>        assertTrue(driver.getCurrentUrl().contains(\"dashboard\"));<br>    }</p>\n\n<p>@Então(\"vejo a mensagem {string}\")<br>    public void vejoMensagem(String mensagem) {<br>        assertTrue(driver.getPageSource().contains(mensagem));<br>    }<br>}<br></code></pre></p>\n\n<hr>\n<h2>Data Tables</h2>\n\n<pre><code>Funcionalidade: Carrinho de Compras\n\n<p>Cenário: Adicionar múltiplos produtos ao carrinho<br>    Quando adiciono os seguintes produtos ao carrinho:<br>      | Produto    | Quantidade | Preço  |<br>      | Camiseta  | 2         | R$49,90|<br>      | Calça     | 1         | R$89,90|<br>      | Tênis     | 1         | R$199,90|<br>    Então o total do carrinho deve ser R$389,70<br></code></pre></p>\n\n<pre><code># Step with table\n@when(\'adiciono os seguintes produtos ao carrinho\')\ndef step_impl(context):\n    total = Decimal(\'0\')\n    for row in context.table:\n        product = row[\'Produto\']\n        quantity = int(row[\'Quantidade\'])\n        price = Decimal(row[\'Preço\'].replace(\'R$\', \'\').replace(\',\', \'.\'))\n\n<p># Add to cart logic<br>        add_to_cart(product, quantity)</p>\n\n<p>total += price * quantity</p>\n\n<p>context.expected_total = total<br></code></pre></p>\n\n<hr>\n<h2>Hooks</h2>\n\n<pre><code># features/environment.py\nfrom behave import *\nfrom selenium import webdriver\n\n<p>def before_all(context):<br>    \"\"\"Executa antes de tudo\"\"\"<br>    context.browser = webdriver.Chrome()</p>\n\n<p>def after_all(context):<br>    \"\"\"Executa após tudo\"\"\"<br>    context.browser.quit()</p>\n\n<p>def before_scenario(context, scenario):<br>    \"\"\"Executa antes de cada cenário\"\"\"<br>    context.browser.delete_all_cookies()</p>\n\n<p>def after_scenario(context, scenario):<br>    \"\"\"Executa após cada cenário\"\"\"<br>    if scenario.status == \'failed\':<br>        # Take screenshot<br>        context.browser.save_screenshot(f\'failed_{scenario.name}.png\')</p>\n\n<p>def before_step(context, step):<br>    \"\"\"Executa antes de cada step\"\"\"<br>    pass</p>\n\n<p>def after_step(context, step):<br>    \"\"\"Executa após cada step\"\"\"<br>    if step.status == \'failed\':<br>        print(f\"Step failed: {step.name}\")<br></code></pre></p>\n\n<hr>\n<h2>Tags</h2>\n\n<pre><code>@smoke @login\nFuncionalidade: Login\n\n<p>@critical<br>  Cenário: Login com sucesso<br>    ...</p>\n\n<p>Cenário: Login com falha<br>    ...</p>\n\n<p>@regression<br>Funcionalidade: Carrinho<br>  ...<br></code></pre></p>\n\n<pre><code># Executar apenas com tag\nbehave --tags=@smoke\nbehave --tags=\"not @skip\"\nbehave --tags=\"@smoke,@login\"  # OR\nbehave --tags=\"@smoke+@critical\"  # AND\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Cucumber/Gherkin facilita comunicação entre equipes. As chaves são:<br><ol><li><strong>Linguagem de negócio</strong> - Todos entendem</li><br><li><strong>Step definitions</strong> - Conecta Gherkin a código</li><br><li><strong>Hooks</strong> - Setup/teardown</li><br><li><strong>Tags</strong> - Selecionar cenários</li><br><li><strong>Data tables</strong> - Dados complexos</li></ol></p>', 'Cucumber e Gherkin: Automação BDD com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '212-revision-v1', '', '', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '', '212', 'http://localhost:8082/ideiasti/?p=439', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('440', '0', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '<p><strong>Meta Description:</strong> Aprenda testes de contrato: Pact, contratos entre microservices, consumer-driven testing e como evitar breaking changes.</p>\n\n<hr>\n<h2>O Que São Testes de Contrato?</h2>\n\n<p>Testes de contrato verificam que a interface entre serviços (API) está funcionando conforme acordado. Cada serviço define o que espera e o que fornece.</p>\n\n<h3>Problema</h3>\n\n<pre><code>Microservice A (Consumer)\n        ↓\n    API REST\n        ↓\nMicroservice B (Provider)\n\n<p>Se B muda API sem avisar A → BUG!<br></code></pre></p>\n\n<h3>Solução: Contract Testing</h3>\n\n<pre><code>┌─────────────┐                    ┌─────────────┐\n│  Consumer   │    Contract       │  Provider   │\n│   Test      │ ←──────────────→ │   Test      │\n└─────────────┘                    └─────────────┘\n     ↓                                  ↓\n[Pact Broker] ←──────────────────────────\n</code></pre>\n\n<hr>\n<h2>Pact - Framework de Contract Testing</h2>\n\n<h3>Setup</h3>\n\n<pre><code># Ruby\ngem install pact\n\n<p># Python<br>pip install pact-python</p>\n\n<p># Java<br><br>    au.com.dius.pact<br>    jvm-consumer<br>    4.6.4<br><br></code></pre></p>\n\n<h3>Consumer Test (Python)</h3>\n\n<pre><code># test_consumer.py\nimport pact\n\n<p># Provider URL<br>PACT_MOCK_PROVIDER_URL = \"http://localhost:1234\"</p>\n\n<p># Define consumer and provider<br>consumer = pact.Consumer(\'OrderService\')<br>provider = pact.Provider(\'ProductService\')</p>\n\n<p># Create pact<br>order_service_pact = consumer.has_pact_with(<br>    provider,<br>    pact_dir=\'./pacts\',<br>    log_dir=\'./logs\'<br>)</p>\n\n<p># Test<br>order_service_pact.given(<br>    \'product with id 1 exists\'<br>).upon_receiving(<br>    \'a request for product details\'<br>).with_request(<br>    method=\'GET\',<br>    path=\'/products/1\'<br>).will_respond_with(<br>    status=200,<br>    headers={\'Content-Type\': \'application/json\'},<br>    body={<br>        \'id\': 1,<br>        \'name\': pact.Match.something_like(\'Test Product\'),<br>        \'price\': pact.Match.decimal(99.99),<br>        \'in_stock\': pact.Match.boolean(True)<br>    }<br>)</p>\n\n<p># Verify<br>with order_service_pact:<br>    result = requests.get(f\'{PACT_MOCK_PROVIDER_URL}/products/1\')<br>    assert result.status_code == 200<br>    assert result.json()[\'name\'] == \'Test Product\'<br></code></pre></p>\n\n<h3>Provider Test (Python)</h3>\n\n<pre><code># test_provider.py\nimport pact\nfrom pact import Verifier\n\n<p># Verify against provider<br>verifier = Verifier(<br>    provider=\'ProductService\',<br>    provider_base_url=\'http://localhost:8000\'<br>)</p>\n\n<p># Set up Pact file to verify<br>verifier.provider_states(<br>    \'http://localhost:8000\',<br>    set_up=lambda state: create_test_product() if state == \'product with id 1 exists\' else None,<br>    tear_down=lambda state: delete_test_product() if state == \'product with id 1 exists\' else None<br>)</p>\n\n<p># Verify contracts<br>result = verifier.verify_pacts(<br>    \'./pacts/order_service-product_service.json\',<br>    verbose=True<br>)</p>\n\n<p>assert result == 0, f\"Pact verification failed: {result}\"<br></code></pre></p>\n\n<hr>\n<h2>Pact Broker</h2>\n\n<pre><code># Publish contract\npact-broker publish ./pacts \n  --consumer-app-version=1.0.0 \n  --broker-base-url=https://pact-broker.example.com \n  --broker-token=YOUR_TOKEN\n\n<p># Can I Deploy?<br>pact-broker can-i-deploy <br>  --pacticipant=OrderService <br>  --version=1.0.0 <br>  --to-environment=production<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Contract testing previne breaking changes. As chaves são:<br><ol><li><strong>Consumer-driven</strong> - Cada cliente define necessidades</li><br><li><strong>Pact broker</strong> - Centraliza contratos</li><br><li><strong>Verificação contínua</strong> - CI valida mudanças</li><br><li><strong>Can I Deploy</strong> - Bloca deploys incompatíveis</li></ol></p>', 'Testes de Contrato: Consumer-Driven Contracts', '', 'inherit', 'closed', 'closed', '', '213-revision-v1', '', '', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '', '213', 'http://localhost:8082/ideiasti/?p=440', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('441', '0', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '<p><strong>Meta Description:</strong> Aprenda Testcontainers: containers Docker para testes, databases, message brokers, como criar ambientes reprodutíveis.</p>\n\n<hr>\n<h2>O Que São Testcontainers?</h2>\n\n<p>Testcontainers é uma biblioteca que facilita o uso de containers Docker para testes automatizados. Cada teste consegue seu próprio container isolado.</p>\n\n<h3>Benefícios</h3>\n\n<ul><li><strong>Isolamento</strong> - Cada teste tem seu ambiente</li><ol><li><strong>Reprodutibilidade</strong> - Mesmo ambiente sempre</li>\n<li><strong>Realismo</strong> - Testa contra serviços reais</li>\n<li><strong>Cleanup automático</strong> - Containers são removidos</li></ol></ul>\n\n<hr>\n<h2>Setup</h2>\n\n<pre><code><!-- Java/Maven -->\n\n    org.testcontainers\n    testcontainers\n    1.19.3\n\n\n<p><!-- Python --><br>pip install testcontainers</p>\n\n<p><!-- Go --><br>go get github.com/testcontainers/testcontainers-go</p>\n\n<p><!-- Node.js --><br>npm install @testcontainers<br></code></pre></p>\n\n<hr>\n<h2>Exemplos</h2>\n\n<h3>PostgreSQL (Python)</h3>\n\n<pre><code># test_database.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\nimport psycopg2\n\n<p>@pytest.fixture(scope=\"module\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15-alpine\") as pg:<br>        yield pg</p>\n\n<p>def test_database_connection(postgres):<br>    # Get connection string<br>    connection_url = postgres.get_connection_url()</p>\n\n<p># Connect<br>    conn = psycopg2.connect(connection_url)<br>    cursor = conn.cursor()</p>\n\n<p># Test<br>    cursor.execute(\"SELECT version();\")<br>    version = cursor.fetchone()</p>\n\n<p>assert \"PostgreSQL\" in version[0]</p>\n\n<p>cursor.close()<br>    conn.close()</p>\n\n<p>def test_create_table(postgres):<br>    conn = psycopg2.connect(postgres.get_connection_url())<br>    cursor = conn.cursor()</p>\n\n<p>cursor.execute(\"\"\"<br>        CREATE TABLE users (<br>            id SERIAL PRIMARY KEY,<br>            name VARCHAR(100) NOT NULL,<br>            email VARCHAR(100) UNIQUE NOT NULL<br>        )<br>    \"\"\")<br>    conn.commit()</p>\n\n<p># Insert test data<br>    cursor.execute(\"\"\"<br>        INSERT INTO users (name, email) <br>        VALUES (\'João\', \'joao@example.com\')<br>        RETURNING id<br>    \"\"\")<br>    user_id = cursor.fetchone()[0]</p>\n\n<p># Verify<br>    cursor.execute(\"SELECT * FROM users WHERE id = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s\", (user_id,))<br>    user = cursor.fetchone()</p>\n\n<p>assert user[1] == \"João\"</p>\n\n<p>cursor.close()<br>    conn.close()<br></code></pre></p>\n\n<h3>Redis (Python)</h3>\n\n<pre><code># test_redis.py\nimport pytest\nfrom testcontainers.redis import RedisContainer\nimport redis\n\n<p>@pytest.fixture<br>def redis_container():<br>    with RedisContainer(\"redis:7-alpine\") as redis:<br>        yield redis</p>\n\n<p>def test_redis_basic_operations(redis_container):<br>    client = redis.Redis.from_url(redis_container.get_connection_url())</p>\n\n<p># Set and get<br>    client.set(\"key\", \"value\")<br>    assert client.get(\"key\") == b\"value\"</p>\n\n<p># Expire<br>    client.setex(\"temp\", 60, \"temp_value\")<br>    assert client.get(\"temp\") == b\"temp_value\"</p>\n\n<p># List<br>    client.lpush(\"mylist\", \"a\", \"b\", \"c\")<br>    assert client.lrange(\"mylist\", 0, -1) == [b\'c\', b\'b\', b\'a\']</p>\n\n<p>client.flushall()</p>\n\n<p>def test_redis_pubsub(redis_container):<br>    client = redis.Redis.from_url(redis_container.get_connection_url())</p>\n\n<p># Pub/Sub pattern<br>    pubsub = client.pubsub()<br>    pubsub.subscribe(\"test-channel\")</p>\n\n<p># Give time for subscription<br>    import time<br>    time.sleep(0.5)</p>\n\n<p># Publish message<br>    client.publish(\"test-channel\", \"Hello, World!\")</p>\n\n<p># Receive message<br>    message = pubsub.get_message()<br>    assert message[\"type\"] == \"message\"<br>    assert message[\"data\"] == b\"Hello, World!\"</p>\n\n<p>pubsub.close()<br></code></pre></p>\n\n<h3>MongoDB (Java)</h3>\n\n<pre><code>// MongoDBTest.java\nimport org.testcontainers.containers.MongoDBContainer;\nimport org.junit.jupiter.api.*;\n\n<p>import com.mongodb.client.MongoClients;<br>import com.mongodb.client.MongoCollection;<br>import com.mongodb.client.MongoDatabase;</p>\n\n<p>import static org.junit.jupiter.api.Assertions.*;</p>\n\n<p>@TestInstance(TestInstance.Lifecycle.PER_CLASS)<br>public class MongoDBTest {</p>\n\n<p>MongoDBContainer mongo = new MongoDBContainer(\"mongo:7\");</p>\n\n<p>@BeforeAll<br>    void startContainer() {<br>        mongo.start();<br>    }</p>\n\n<p>@AfterAll<br>    void stopContainer() {<br>        mongo.stop();<br>    }</p>\n\n<p>@Test<br>    void testMongoConnection() {<br>        String connectionString = mongo.getReplicaSetUrl();</p>\n\n<p>try (var client = MongoClients.create(connectionString)) {<br>            MongoDatabase database = client.getDatabase(\"testdb\");<br>            MongoCollection collection = database.getCollection(\"users\");</p>\n\n<p>// Insert document<br>            org.bson.Document user = new org.bson.Document()<br>                .append(\"name\", \"João Silva\")<br>                .append(\"email\", \"joao@example.com\");</p>\n\n<p>collection.insertOne(user);</p>\n\n<p>// Find document<br>            org.bson.Document found = collection.find().first();</p>\n\n<p>assertNotNull(found);<br>            assertEquals(\"João Silva\", found.getString(\"name\"));<br>        }<br>    }<br>}<br></code></pre></p>\n\n<h3>Docker Compose (Python)</h3>\n\n<pre><code># test_integration.py\nimport pytest\nfrom testcontainers.compose import DockerCompose\n\n<p>@pytest.fixture(scope=\"module\")<br>def compose():<br>    with DockerCompose(\"/path/to/project\") as compose:<br>        compose.start()<br>        yield compose<br>        compose.stop()</p>\n\n<p>def test_all_services_running(compose):<br>    # Check if services are healthy<br>    exit_code, output = compose.exec(\"api\", \"curl -f http://localhost:8080/health\")<br>    assert exit_code == 0</p>\n\n<p>exit_code, output = compose.exec(\"db\", \"pg_isready\")<br>    assert exit_code == 0</p>\n\n<p>def test_api_with_database(compose):<br>    # API should be able to connect to database<br>    exit_code, output = compose.exec(<br>        \"api\", <br>        \"python -c \'import psycopg2; print(\"OK\")\'\"<br>    )<br>    assert exit_code == 0<br>    assert \"OK\" in output.decode()<br></code></pre></p>\n\n<hr>\n<h2>Multiple Containers</h2>\n\n<pre><code># test_full_stack.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\nfrom testcontainers.kafka import KafkaContainer\n\n<p>@pytest.fixture(scope=\"module\")<br>def test_environment():<br>    # Start all containers<br>    postgres = PostgresContainer(\"postgres:15\")<br>    redis = RedisContainer(\"redis:7\")<br>    kafka = KafkaContainer()</p>\n\n<p># Start them<br>    pg_url = postgres.start()<br>    redis_url = redis.start()<br>    kafka_bootstrap = kafka.start()</p>\n\n<p>yield {<br>        \'postgres\': pg_url,<br>        \'redis\': redis_url,<br>        \'kafka\': kafka_bootstrap<br>    }</p>\n\n<p># Cleanup<br>    kafka.stop()<br>    redis.stop()<br>    postgres.stop()<br></code></pre></p>\n\n<hr>\n<h2>CI Integration</h2>\n\n<pre><code># GitHub Actions\nname: Tests with Testcontainers\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  test:<br>    runs-on: ubuntu-latest<br>    services:<br>      docker:<br>        image: docker:24.0.5-cli<br>        options: --privileged<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Set up Docker Buildx<br>        uses: docker/setup-buildx-action@v3</p>\n\n<p>- name: Run tests<br>        run: |<br>          docker network create testnet || true<br>          docker compose -f docker-compose.test.yml up -d<br>          docker compose -f docker-compose.test.yml run test<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testcontainers facilita testes com dependências reais. As chaves são:<br><ol><li><strong>Isolamento</strong> - Cada teste com seu ambiente</li><br><li><strong>Realismo</strong> - Testa contra serviços reais</li><br><li><strong>Cleanup</strong> - Containers são removidos após testes</li><br><li><strong>CI</strong> - Funciona em pipelines</li><br><li><strong>Performance</strong> - Mais lento que mocks, mais confiável</li></ol></p>', 'Testcontainers: Ambientes de Teste Isolados com Docker', '', 'inherit', 'closed', 'closed', '', '214-revision-v1', '', '', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '', '214', 'http://localhost:8082/ideiasti/?p=441', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('442', '0', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '<p><strong>Meta Description:</strong> Aprenda security testing: OWASP Top 10, SAST, DAST, penet testers manuais, como integrar segurança ao pipeline de QA.</p>\n\n<hr>\n<h2>Tipos de Security Testing</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo</th><th>Descrição</th><th>Automação</th></tr>\n<tr><td><strong>SAST</strong></td><td>Análise estática de código</td><td>✅ Alta</td></tr>\n<tr><td><strong>DAST</strong></td><td>Teste dinâmico de aplicação</td><td>✅ Alta</td></tr>\n<tr><td><strong>SCA</strong></td><td>Análise de composição de software</td><td>✅ Alta</td></tr>\n<tr><td><strong>IAST</strong></td><td>Teste interativo</td><td>⚠️ Média</td></tr>\n<tr><td><strong>Pentest</strong></td><td>Teste manual de penetração</td><td>❌ Baixa</td></tr>\n</table></figure>\n\n<hr>\n<h2>OWASP Top 10 (2021)</h2>\n\n<h3>A01 - Broken Access Control</h3>\n\n<pre><code># VULNERÁVEL\n@app.route(\'/pedido/\')\ndef get_pedido(id):\n    # Não verifica ownership!\n    return Pedido.query.get(id)\n\n<p># SEGURO<br>@app.route(\'/pedido/\')<br>@login_required<br>def get_pedido(id):<br>    pedido = Pedido.query.filter_by(<br>        id=id, <br>        usuario_id=current_user.id<br>    ).first_or_404()<br>    return pedido<br></code></pre></p>\n\n<h3>A02 - Cryptographic Failures</h3>\n\n<pre><code># VULNERÁVEL\nsenha = \"senha123\"  # Texto puro!\n\n<p># SEGURO<br>from cryptography.fernet import Fernet</p>\n\n<p>key = Fernet.generate_key()  # Armazenar em vault!<br>cipher = Fernet(key)<br>senha_hash = bcrypt.hashpw(senha.encode(), bcrypt.gensalt())<br></code></pre></p>\n\n<h3>A03 - Injection</h3>\n\n<pre><code>-- VULNERÁVEL (SQL Injection)\nquery = f\"SELECT * FROM users WHERE email = \'{email}\'\"\n\n<p>-- SEGURO (Parameterized)<br>cursor.execute(\"SELECT * FROM users WHERE email = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s\", (email,))<br></code></pre></p>\n\n<hr>\n<h2>SAST - Static Application Security Testing</h2>\n\n<h3>SonarQube</h3>\n\n<pre><code># GitHub Actions\n<ul><li>name: SonarCloud Scan</li>\n  uses: SonarSource/sonarcloud-github-action@master\n  env:\n    SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}\n\n<p># sonar-project.properties<br>sonar.projectKey=myproject<br>sonar.sources=src<br>sonar.tests=tests<br>sonar.python.coverage.reportPaths=coverage.xml<br>sonar.security Risks=high,critical<br></code></pre></p>\n\n<h3>Semgrep</h3>\n\n<pre><code># Install\npip install semgrep\n\n<p># Run<br>semgrep --config=auto .</p>\n\n<p># Custom rule<br>rules:<br>  - id: hardcoded-secret<br>    pattern: $SECRET = \"$VALUE\"<br>    message: Hardcoded secret found<br>    severity: ERROR<br>    languages: [python]<br></code></pre></p>\n\n<hr>\n<h2>DAST - Dynamic Application Security Testing</h2>\n\n<h3>OWASP ZAP</h3>\n\n<pre><code># CLI scan\ndocker run -t owasp/zap2docker-stable \n  zap-baseline.py \n  -t https://example.com \n  -J zap-report.json\n\n<p># GitHub Actions<ol><li>name: OWASP ZAP Scan</li><br></ol>  uses: zaproxy/action-baseline@v0.9.0<br>  with:<br>    target: \'https://staging.example.com\'<br>    rules_rules_name: \'api-scan\'<br></code></pre></p>\n\n<hr>\n<h2>SCA - Software Composition Analysis</h2>\n\n<h3>Snyk</h3>\n\n<pre><code># Install\nnpm install -g snyk\n\n<p># Test<br>snyk test</p>\n\n<p># Monitor<br>snyk monitor</p>\n\n<p># GitHub Action<ol><li>name: Snyk Security Scan</li></ol></ul><br>  uses: snyk/actions/node@master<br>  env:<br>    SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Security testing deve ser integrado ao pipeline. As chaves são:<br><ol><li><strong>Automação</strong> - SAST, DAST, SCA no CI/CD</li><br><li><strong>OWASP</strong> - Conheça as vulnerabilidades principais</li><br><li><strong>Pentests</strong> - Regular, para complementar automação</li><br><li><strong>Remediação</strong> - Não é só detectar, é corrigir</li><br><li><strong>Cultura</strong> - Segurança é responsabilidade de todos</li></ol></p>', 'Security Testing: OWASP, Penetration Testing e SAST/DAST', '', 'inherit', 'closed', 'closed', '', '215-revision-v1', '', '', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '', '215', 'http://localhost:8082/ideiasti/?p=442', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('443', '0', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '<p><strong>Meta Description:</strong> Aprenda testes end-to-end: Playwright, Cypress, Selenium, como simular jornadas completas do usuário e garantir que tudo funciona.</p>\n\n<hr>\n<h2>O Que São Testes E2E?</h2>\n\n<p>Testes E2E verificam que o sistema completo funciona, simulando jornadas reais do usuário do início ao fim.</p>\n\n<h3>Quando Usar</h3>\n\n<ul><li>✅ Fluxos críticos (login, checkout)</li><ol><li>✅ Antes de releases</li>\n<li>✅ Smoke tests</li>\n<li>❌ Não para tudo (são lentos)</li>\n</ol>\n<hr>\n<h2>Playwright</h2>\n\n<h3>Setup</h3>\n\n<pre><code>npm install -D @playwright/test\nnpx playwright install\n</code></pre>\n\n<h3>Exemplo</h3>\n\n<pre><code>// tests/e2e/checkout.spec.ts\nimport { test, expect } from \'@playwright/test\';\n\n<p>test.describe(\'Checkout Flow\', () =&gt; {<br>  test.beforeEach(async ({ page }) =&gt; {<br>    await page.goto(\'/\');<br>  });</p>\n\n<p>test(\'complete purchase flow\', async ({ page }) =&gt; {<br>    // 1. Login<br>    await page.click(\'text=Login\');<br>    await page.fill(\'[data-testid=email]\', \'user@test.com\');<br>    await page.fill(\'[data-testid=password]\', \'password123\');<br>    await page.click(\'text=Entrar\');</p>\n\n<p>// 2. Browse products<br>    await page.click(\'text=Produtos\');<br>    await page.click(\'text=Camiseta Azul\');</p>\n\n<p>// 3. Add to cart<br>    await page.click(\'text=Adicionar ao Carrinho\');<br>    await expect(page.locator(\'.cart-badge\')).toHaveText(\'1\');</p>\n\n<p>// 4. Checkout<br>    await page.click(\'text=Finalizar Compra\');<br>    await page.fill(\'[data-testid=address]\', \'Rua Teste, 123\');<br>    await page.click(\'text=Confirmar Pedido\');</p>\n\n<p>// 5. Verify<br>    await expect(page.locator(\'.success-message\')).toBeVisible();<br>    await expect(page.locator(\'.order-id\')).toBeVisible();<br>  });<br>});<br></code></pre></p>\n\n<hr>\n<h2>Cypress</h2>\n\n<h3>Setup</h3>\n\n<pre><code>npm install -D cypress\nnpx cypress open\n</code></pre>\n\n<h3>Exemplo</h3>\n\n<pre><code>// cypress/integration/checkout.spec.js\ndescribe(\'Checkout Flow\', () =&gt; {\n  beforeEach(() =&gt; {\n    cy.visit(\'/\');\n  });\n\n<p>it(\'completes purchase successfully\', () =&gt; {<br>    // Login<br>    cy.get(\'[data-cy=login-button]\').click();<br>    cy.get(\'[data-cy=email-input]\').type(\'user@test.com\');<br>    cy.get(\'[data-cy=password-input]\').type(\'password123\');<br>    cy.get(\'[data-cy=submit-button]\').click();</p>\n\n<p>// Add product<br>    cy.contains(\'Camiseta\').click();<br>    cy.get(\'[data-cy=add-to-cart]\').click();</p>\n\n<p>// Checkout<br>    cy.get(\'[data-cy=cart-icon]\').click();<br>    cy.get(\'[data-cy=checkout-button]\').click();<br>    cy.get(\'[data-cy=address-input]\').type(\'Rua Teste, 123\');<br>    cy.get(\'[data-cy=confirm-button]\').click();</p>\n\n<p>// Verify<br>    cy.contains(\'Pedido realizado com sucesso\').should(\'be.visible\');<br>  });<br>});<br></code></pre></p>\n\n<hr>\n<h2>Page Objects</h2>\n\n<pre><code>// pages/LoginPage.ts\nexport class LoginPage {\n  constructor(private page: Page) {}\n\n<p>async goto() {<br>    await this.page.goto(\'/login\');<br>  }</p>\n\n<p>async login(email: string, password: string) {<br>    await this.page.fill(\'[data-testid=email]\', email);<br>    await this.page.fill(\'[data-testid=password]\', password);<br>    await this.page.click(\'text=Entrar\');<br>  }<br>}</p>\n\n<p>// tests/e2e/checkout.spec.ts<br>test(\'checkout\', async ({ page }) =&gt; {<br>  const loginPage = new LoginPage(page);<br>  const checkoutPage = new CheckoutPage(page);</p>\n\n<p>await loginPage.goto();<br>  await loginPage.login(\'user@test.com\', \'password123\');</p>\n\n<p>await checkoutPage.addProduct(\'Camiseta\');<br>  await checkoutPage.completeCheckout(\'Rua Teste\');</p>\n\n<p>await expect(checkoutPage.successMessage).toBeVisible();<br>});<br></code></pre></p>\n\n<hr>\n<h2>CI Integration</h2>\n\n<pre><code># GitHub Actions<ol><li>name: E2E Tests</li></ol></ul>\n  run: npx playwright test\n  env:\n    CYPRESS_baseUrl: https://staging.example.com\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes E2E simulam o usuário real. As chaves são:<br><ol><li><strong>Focar no crítico</strong> - Não tudo, só fluxos importantes</li><br><li><strong>Page Objects</strong> - DRY, fácil manutenção</li><br><li><strong>Dados de teste</strong> - Setup e teardown</li><br><li><strong>CI</strong> - Executar em pipeline</li><br><li><strong>Debugging</strong> - Screenshots, videos</li></ol></p>', 'Testes E2E: Guiando pelo Usuário', '', 'inherit', 'closed', 'closed', '', '216-revision-v1', '', '', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '', '216', 'http://localhost:8082/ideiasti/?p=443', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('444', '0', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '<p><strong>Meta Description:</strong> Aprenda a definir e acompanhar métricas de QA: cobertura, defeitos, velocity, DORA metrics, como criar dashboards efetivos.</p>\n\n<hr>\n<h2>Por Que Métricas?</h2>\n\n<ul><li><strong>Visibilidade</strong> - Entender estado do projeto</li><ol><li><strong>Tendências</strong> - Evolução ao longo do tempo</li>\n<li><strong>Decisões</strong> - Base para ações</li>\n<li><strong>Accountability</strong> - Responsabilidade clara</li></ol></ul>\n\n<hr>\n<h2>Métricas de Teste</h2>\n\n<h3>Cobertura</h3>\n\n<pre><code>def test_coverage_metrics():\n    return {\n        \"code_coverage\": {\n            \"line\": 85,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n            \"branch\": 78,\n            \"function\": 90\n        },\n        \"requirement_coverage\": 95,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n        \"risk_coverage\": 80,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n        \"test_efficiency\": {\n            \"bugs_found\": 15,\n            \"tests_executed\": 500,\n            \"ratio\": 0.03  # 3 bugs por 100 testes\n        }\n    }\n</code></pre>\n\n<h3>Execution Metrics</h3>\n\n<pre><code>def execution_metrics():\n    return {\n        \"total_tests\": 1000,\n        \"passed\": 950,\n        \"failed\": 30,\n        \"blocked\": 10,\n        \"skipped\": 10,\n        \"pass_rate\": 95,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n        \"flaky_rate\": 2,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n        \"execution_time\": {\n            \"total_minutes\": 45,\n            \"average_per_test_seconds\": 2.7\n        }\n    }\n</code></pre>\n\n<hr>\n<h2>Métricas de Defeitos</h2>\n\n<pre><code>class DefectMetrics:\n    def __init__(self, data):\n        self.data = data\n\n<p>def defect_leakage(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos encontrados em produção\"\"\"<br>        prod = self.data[\'bugs_in_prod\']<br>        total = self.data[\'total_bugs\']<br>        return (prod / total) * 100 if total else 0</p>\n\n<p>def defect_density(self):<br>        \"\"\"Defeitos por 1000 linhas\"\"\"<br>        bugs = self.data[\'total_bugs\']<br>        loc = self.data[\'lines_of_code\']<br>        return (bugs / loc) * 1000</p>\n\n<p>def escape_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos escapados para prod\"\"\"<br>        return self.defect_leakage()</p>\n\n<p>def mtbf(self):<br>        \"\"\"Mean Time Between Failures\"\"\"<br>        return self.data[\'uptime_hours\'] / self.data[\'incidents\']</p>\n\n<p>def mttr(self):<br>        \"\"\"Mean Time To Repair\"\"\"<br>        return sum(r[\'time_to_fix\'] for r in self.data[\'incidents\']) / len(self.data[\'incidents\'])<br></code></pre></p>\n\n<hr>\n<h2>DORA Metrics</h2>\n\n<h3>Deployment Frequency</h3>\n\n<pre><code>def deployment_frequency(days=30):\n    \"\"\"\n    Elite: On-demand ou múltiplas vezes ao dia\n    High: Entre diária e semanal\n    Medium: Entre semanal e mensal\n    Low: Mensal ou menos\n    \"\"\"\n    deploys = get_deployments(days)\n    return {\n        \"count\": len(deploys),\n        \"frequency\": len(deploys) / days,  # por dia\n        \"rating\": \"elite\" if len(deploys) &gt;= days * 2 else \"high\" if len(deploys) &gt;= days else \"medium\"\n    }\n</code></pre>\n\n<h3>Lead Time for Changes</h3>\n\n<pre><code>def lead_time(days=30):\n    \"\"\"\n    Elite:  1 mês\n    \"\"\"\n    changes = get_changes(days)\n    avg_hours = sum(c[\'lead_time_hours\'] for c in changes) / len(changes)\n    return {\n        \"average_hours\": avg_hours,\n        \"p95_hours\": calculate_percentile(changes, 95),\n        \"rating\": \"elite\" if avg_hours &lt; 1 else &quot;high&quot; if avg_hours &lt; 24 else &quot;medium&quot;\n    }\n</code></pre>\n\n<hr>\n<h2>Dashboard</h2>\n\n<pre><code># Grafana Dashboard - QA Metrics\n\n<p>panels:<br>  - title: \"Test Pass Rate\"<br>    type: gauge<br>    targets:<br>      - expr: \"sum(test_passed) / sum(test_total) * 100\"<br>    thresholds:<br>      - value: 90<br>        color: yellow<br>      - value: 95<br>        color: green</p>\n\n<p>- title: \"Code Coverage Trend\"<br>    type: timeseries<br>    targets:<br>      - expr: \"code_coverage_percent\"<br>        legendFormat: \"Coverage {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</p>\n\n<p>- title: \"Defect Leakage\"<br>    type: stat<br>    targets:<br>      - expr: \"defects_in_prod / total_defects * 100\"<br>    unit: percent</p>\n\n<p>- title: \"DORA Metrics\"<br>    type: table<br>    targets:<br>      - expr: \"deployment_frequency\"<br>      - expr: \"lead_time_hours\"<br>      - expr: \"mttr_minutes\"<br>      - expr: \"change_failure_rate\"<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Métricas guiam melhoria. As chaves são:<br><ol><li><strong>Definir KPIs</strong> - Alinhados com objetivos</li><br><li><strong>Automatizar coleta</strong> - CI/CD integration</li><br><li><strong>Visualizar</strong> - Dashboards claros</li><br><li><strong>Analisar tendências</strong> - Não só snapshots</li><br><li><strong>Agir</strong> - Métricas sem ação não valem nada</li></ol></p>', 'Metrics de QA: KPIs e Dashboards para Equipes de Qualidade', '', 'inherit', 'closed', 'closed', '', '217-revision-v1', '', '', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '', '217', 'http://localhost:8082/ideiasti/?p=444', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('445', '0', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '<p><strong>Meta Description:</strong> Aprenda continuous testing: automação completa no pipeline CI/CD, quality gates, shift-left e como implementar testes em cada estágio.</p>\n\n<hr>\n<h2>O Que É Continuous Testing?</h2>\n\n<p>Continuous Testing é a prática de executar testes automaticamente em cada mudança de código, proporcionando feedback rápido e contínuo sobre a qualidade do software.</p>\n\n<h3>Princípios</h3>\n<ol><li><strong>Automação completa</strong> - Sem intervenção manual</li>\n<li><strong>Feedback rápido</strong> - Resultados em minutos</li>\n<li><strong>Shift-Left</strong> - Testar mais cedo</li>\n<li><strong>Quality Gates</strong> - Critérios para avançar</li>\n<li><strong>Cobertura ampla</strong> - Múltiplos tipos de teste</li>\n</ol>\n<hr>\n<h2>Pipeline de Continuous Testing</h2>\n\n<pre><code>Code → Commit → Build → Unit Tests → Integration → E2E → Security → Deploy\n          ↓        ↓        ↓           ↓            ↓       ↓        ↓\n      Pre-commit Hook   Coverage    Contract     Playwright  SAST     Staging\n                       Gate        Tests        Tests     DAST\n</code></pre>\n\n<hr>\n<h2>Quality Gates</h2>\n\n<h3>Definição</h3>\n\n<pre><code># Quality Gates Configuration\nquality_gates:\n  - name: \"Code Coverage\"\n    type: coverage\n    minimum: 80  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n    blocking: true\n\n<p>- name: \"Security Scan\"<br>    type: security<br>    max_critical: 0<br>    max_high: 0<br>    blocking: true</p>\n\n<p>- name: \"Test Pass Rate\"<br>    type: test<br>    minimum: 95  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>    blocking: true</p>\n\n<p>- name: \"Performance\"<br>    type: performance<br>    max_p95_ms: 500<br>    blocking: false</p>\n\n<p>- name: \"Code Review\"<br>    type: approval<br>    required_approvals: 1<br>    blocking: true<br></code></pre></p>\n\n<h3>Implementação</h3>\n\n<pre><code>#!/bin/bash\n# quality-gate.sh\n\n<p>check_coverage() {<br>    COVERAGE=$(cat coverage.xml | grep -oP \'line-covered=\"K[0-9]+\')<br>    TOTAL=$(cat coverage.xml | grep -oP \'line-count=\"K[0-9]+\')<br>    PERCENTAGE=$((COVERAGE * 100 / TOTAL))</p>\n\n<p>if [ $PERCENTAGE -lt 80 ]; then<br>        echo \"❌ Coverage $PERCENTAGE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} below threshold (80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\"<br>        return 1<br>    fi<br>    echo \"✅ Coverage $PERCENTAGE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br>    return 0<br>}</p>\n\n<p>check_security() {<br>    CRITICAL=$(grep -c \"critical\" snyk-report.json)<br>    if [ $CRITICAL -gt 0 ]; then<br>        echo \"❌ $CRITICAL critical vulnerabilities found\"<br>        return 1<br>    fi<br>    echo \"✅ No critical vulnerabilities\"<br>    return 0<br>}</p>\n\n<p>check_tests() {<br>    PASS_RATE=$(python -c \"print($passed / $total * 100)\")<br>    if (( $(echo \"$PASS_RATE &lt; 95&quot; | bc -l) )); then<br>        echo \"❌ Pass rate $PASS_RATE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} below threshold (95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\"<br>        return 1<br>    fi<br>    echo \"✅ Pass rate $PASS_RATE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br>    return 0<br>}</p>\n\n<p># Run all gates<br>check_coverage &amp;&amp; check_security &amp;&amp; check_tests<br>exit $?<br></code></pre></p>\n\n<hr>\n<h2>Shift-Left Testing</h2>\n\n<h3>Traditional vs Shift-Left</h3>\n\n<pre><code>TRADITIONAL:\nRequirements → Design → Development → Testing → Production\n                          ↓\n                    (Late discovery of bugs)\n\n<p>SHIFT-LEFT:<br>Requirements → Testing → Development → Testing → Production<br>     ↓<br>(Early discovery of bugs)<br></code></pre></p>\n\n<h3>Implementação</h3>\n\n<pre><code># .github/workflows/shift-left.yml\nname: Shift-Left Pipeline\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  # Stage 1: Pre-commit (Developer Machine)<br>  pre-commit-checks:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: Pre-commit hooks<br>        run: |<br>          pip install pre-commit<br>          pre-commit run --all-files</p>\n\n<p># Stage 2: Build<br>  build:<br>    needs: pre-commit-checks<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: Build<br>        run: docker build -t app:${{ github.sha }} .</p>\n\n<p># Stage 3: Unit Tests (Fast)<br>  unit-tests:<br>    needs: build<br>    runs-on: ubuntu-latest<br>    steps:<br>      - run: pytest tests/unit -v --cov</p>\n\n<p># Stage 4: Security (SAST)<br>  security-sast:<br>    needs: build<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: SonarCloud<br>        uses: SonarSource/sonarcloud-github-action@master</p>\n\n<p>- name: Semgrep<br>        uses: returntocorp/semgrep-action@v1</p>\n\n<p># Stage 5: Integration Tests<br>  integration-tests:<br>    needs: [unit-tests, security-sast]<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: Run integration tests<br>        run: pytest tests/integration -v</p>\n\n<p># Stage 6: E2E Tests<br>  e2e-tests:<br>    needs: integration-tests<br>    runs-on: ubuntu-latest<br>    if: github.event_name == \'push\'<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: Playwright tests<br>        run: npx playwright test</p>\n\n<p># Stage 7: Deploy to Staging<br>  deploy-staging:<br>    needs: e2e-tests<br>    runs-on: ubuntu-latest<br>    environment: staging<br>    steps:<br>      - deploy to staging<br></code></pre></p>\n\n<hr>\n<h2>Test Selection Strategy</h2>\n\n<pre><code># test_selector.py\nimport subprocess\nfrom typing import List\n\n<p>class TestSelector:<br>    def __init__(self, changed_files):<br>        self.changed_files = changed_files</p>\n\n<p>def select_tests(self) -&gt; List[str]:<br>        tests = set()</p>\n\n<p># Unit tests (always run)<br>        tests.update(self.get_unit_tests())</p>\n\n<p># Integration tests (based on changes)<br>        tests.update(self.get_integration_tests())</p>\n\n<p># E2E tests (only for critical paths or major changes)<br>        if self.has_critical_changes():<br>            tests.update(self.get_critical_e2e_tests())</p>\n\n<p>return list(tests)</p>\n\n<p>def get_unit_tests(self):<br>        # All unit tests<br>        return self.get_tests_matching(\"tests/unit/<em>*/</em>.py\")</p>\n\n<p>def get_integration_tests(self):<br>        tests = set()<br>        for file in self.changed_files:<br>            if \"database\" in file:<br>                tests.add(\"tests/integration/test_database.py\")<br>            if \"api\" in file or \"service\" in file:<br>                tests.add(\"tests/integration/test_api.py\")<br>        return tests</p>\n\n<p>def has_critical_changes(self):<br>        critical_patterns = [\"checkout\", \"payment\", \"auth\", \"core\"]<br>        return any(<br>            any(p in f for p in critical_patterns) <br>            for f in self.changed_files<br>        )</p>\n\n<p>def get_critical_e2e_tests(self):<br>        return [<br>            \"tests/e2e/test_checkout.py\",<br>            \"tests/e2e/test_login.py\",<br>            \"tests/e2e/test_payment.py\"<br>        ]<br></code></pre></p>\n\n<hr>\n<h2>Feedback Loop</h2>\n\n<pre><code># Slack notification\n<ul><li>name: Notify on Failure</li></ul>\n  if: failure()\n  uses: slackapi/slack-github-action@v1\n  with:\n    channel-id: \'qa-alerts\'\n    payload: |\n      {\n        \"text\": \"❌ Build #${GITHUB_RUN_NUMBER} failed\",\n        \"blocks\": [{\n          \"type\": \"section\",\n          \"text\": {\n            \"type\": \"mrkdwn\",\n            \"text\": \"<em>Build Failed</em> :x:n${GITHUB_REPOSITORY}n${GITHUB_RUN_URL}\"\n          }\n        }]\n      }\n</code></pre>\n\n<hr>\n<h2>Métricas de Continuous Testing</h2>\n\n<pre><code>def continuous_testing_metrics():\n    return {\n        \"test_cycle_time\": {\n            \"description\": \"Tempo do commit ao deploy\",\n            \"current\": \"45 min\",\n            \"target\": \"30 min\",\n            \"trend\": \"improving\"\n        },\n        \"test_automation_rate\": {\n            \"description\": \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de testes automatizados\",\n            \"current\": \"85{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\",\n            \"target\": \"90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\n        },\n        \"quality_gate_pass_rate\": {\n            \"description\": \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de builds passando em quality gates\",\n            \"current\": \"92{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\",\n            \"target\": \"95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\n        },\n        \"defect_leakage_rate\": {\n            \"description\": \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos encontrados em produção\",\n            \"current\": \"8{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\",\n            \"target\": \"&lt;5{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}&quot;\n        }\n    }\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Continuous Testing é essencial para DevOps. As chaves são:<br><ol><li><strong>Automação total</strong> - Sem intervenção manual</li><br><li><strong>Feedback rápido</strong> - Minutos, não horas</li><br><li><strong>Quality gates</strong> - Critérios claros</li><br><li><strong>Shift-Left</strong> - Testar o mais cedo possível</li><br><li><strong>Seleção inteligente</strong> - Não rodar tudo sempre</li></ol></p>', 'Continuous Testing: Automação Total no Pipeline', '', 'inherit', 'closed', 'closed', '', '218-revision-v1', '', '', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '', '218', 'http://localhost:8082/ideiasti/?p=445', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('447', '0', '2026-07-06 22:30:05', '2026-07-07 01:30:05', '', '1588cb664d636f50f5168aae2a232541', '', 'inherit', 'open', 'closed', '', '1588cb664d636f50f5168aae2a232541', '', '', '2026-07-06 22:30:05', '2026-07-07 01:30:05', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/1588cb664d636f50f5168aae2a232541.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('448', '0', '2026-07-06 22:41:43', '2026-07-07 01:41:43', '', 'giphy-2', '', 'inherit', 'open', 'closed', '', 'giphy-2', '', '', '2026-07-06 22:41:43', '2026-07-07 01:41:43', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-2.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('449', '0', '2026-07-06 22:41:45', '2026-07-07 01:41:45', '<p><strong>Meta Description:</strong> Conheça todos os tipos de testes de software: funcionais, não-funcionais, unitários, integração, sistema e mais. Guia completo com definições, objetivos e melhores práticas.</p>\n\n<hr>\n<h2>Introdução aos Tipos de Testes de Software</h2>\n\n<p>Os testes de software são uma atividade crítica no ciclo de desenvolvimento de sistemas. Compreender os diferentes tipos de testes e quando aplicá-los é fundamental para garantir a qualidade e confiabilidade das aplicações.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-2.gif\" alt=\"Pirâmide de Testes - Hierarquia de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este guia completo apresenta uma categorização detalhada dos principais tipos de testes de software, suas finalidades, características e quando cada um deve ser utilizado no seu projeto.</p>\n\n<hr>\n<h2>Categorização Geral dos Testes</h2>\n\n<p>Os testes de software podem ser divididos em duas categorias principais:</p>\n\n<h3>1. Testes Funcionais</h3>\n\n<p>Verificam se o software funciona conforme especificado, testando funcionalidades específicas e requisitos do negócio.</p>\n\n<h3>2. Testes Não-Funcionais</h3>\n\n<p>Avaliam características como performance, segurança, usabilidade e confiabilidade, que não estão relacionadas a funcionalidades específicas.</p>\n\n<hr>\n<h2>Testes Funcionais: Garantindo o Comportamento Correto</h2>\n\n<h3>Teste Unitário: A Base de Tudo</h3>\n\n<p>O teste unitário é o tipo mais básico de teste, onde cada unidade de código (geralmente uma função ou método) é testada isoladamente. Esta atividade é realizada durante as etapas de desenvolvimento pelos próprios desenvolvedores.</p>\n\n<h4>Objetivos dos Testes Unitários</h4>\n\n<ul><li><strong>Identificar falhas em componentes individuais</strong> - Detectar problemas cedo</li><ol><li><strong>Garantir que cada função trabalha corretamente</strong> - Validação granular</li>\n<li><strong>Facilitar a detecção precoce de defeitos</strong> - Redução de custos</li>\n<li><strong>Documentar o código</strong> - Testes como especificação executável</li>\n<li><strong>Permitir refactoring seguro</strong> - Confiança ao modificar código</li>\n</ol>\n<h4>Exemplo Prático em Python (pytest)</h4>\n\n<pre><code>def calcular_desconto(valor_original, percentual):\n    \"\"\"Calcula o valor do desconto.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual deve estar entre 0 e 100\")\n    desconto = valor_original * (percentual / 100)\n    return valor_original - desconto\n\n<p>def test_calcular_desconto_10_porcento():<br>    assert calcular_desconto(100, 10) == 90</p>\n\n<p>def test_calcular_desconto_50_porcento():<br>    assert calcular_desconto(200, 50) == 100</p>\n\n<p>def test_calcular_desconto_invalido():<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 150)<br></code></pre></p>\n\n<h4>Frameworks Populares para Testes Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Framework</th><th>Características</th></tr>\n<tr><td>Java</td><td>JUnit 5, TestNG</td><td>Mais popular, extensível</td></tr>\n<tr><td>JavaScript</td><td>Jest, Mocha</td><td>Rápido, Mocking fácil</td></tr>\n<tr><td>Python</td><td>pytest, unittest</td><td>Sintaxe simples, fixtures</td></tr>\n<tr><td>C#</td><td>xUnit, NUnit</td><td>.NET ecosystem</td></tr>\n<tr><td>Go</td><td>testing (stdlib)</td><td>Simples, integrado</td></tr>\n</table></figure>\n\n<h4>Melhores Práticas para Testes Unitários</h4>\n\n<p>✅ <strong>Teste apenas uma coisa de cada vez</strong> - Um assert por teste é ideal  <br>✅ <strong>Nomes descritivos</strong> - <code>test_deve_retornar_erro_quando_usuario_invalido</code>  <br>✅ <strong>Independência</strong> - Testes não devem depender uns dos outros  <br>✅ <strong>Rapidez</strong> - Unit tests devem executar em milissegundos  <br>✅ <strong>Isolamento</strong> - Use mocks para dependências externas</p>\n\n<hr>\n<h3>Teste de Integração: Verificando Conexões</h3>\n\n<p>O teste de integração verifica a comunicação entre diferentes módulos ou componentes do sistema. Este tipo de teste é crucial para garantir que as partes do sistema funcionam corretamente quando combinadas.</p>\n\n<h4>Características Principais</h4>\n<ol><li><strong>Valida interfaces e interações entre componentes</strong> - Fluxo de dados correto</li>\n<li><strong>Identifica problemas de comunicação</strong> - API mismatches, protocolos</li>\n<li><strong>Pode ser realizado de forma incremental ou big-bang</strong> - Duas abordagens</li>\n<li><strong>Testa camadas de persistência</strong> - Bancos de dados, APIs externas</li>\n</ol>\n<h4>Estratégias de Integração</h4>\n\n<p>##### 1. Big-Bang Integration</p>\n\n<p>Todos os componentes são integrados simultaneamente e testados juntos.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Simples de implementar</li><br><li>Bom para sistemas pequenos</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Difícil localização de erros</li><br><li>Todos os módulos devem estar prontos</li><br></ol><br>##### 2. Incremental Integration (Bottom-Up)</p>\n\n<p>Começa pelos módulos mais baixos e集成 progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Defeitos fáceis de isolar</li><br><li>Feedback contínuo</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode ter módulos de alto nível sem testes até o final</li><br></ol><br>##### 3. Incremental Integration (Top-Down)</p>\n\n<p>Começa pelos módulos de mais alto nível e desce progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Interface do usuário testada primeiro</li><br><li>Protótipo funcional rápido</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Módulos de baixo nível simulados (stubs)</li><br></ol><br><h4>Exemplo de Teste de Integração (REST API)</h4></p>\n\n<pre><code>import requests\nimport pytest\n\n<p>class TestUserAPI:<br>    BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>def test_criar_usuario(self):<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"senha123\"<br>        }<br>        response = requests.post(f\"{self.BASE_URL}/usuarios\", json=payload)</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data</p>\n\n<p>def test_listar_usuarios(self):<br>        response = requests.get(f\"{self.BASE_URL}/usuarios\")</p>\n\n<p>assert response.status_code == 200<br>        assert isinstance(response.json(), list)<br></code></pre></p>\n\n<hr>\n<h3>Teste de Sistema: Visão Holística</h3>\n\n<p>O teste de sistema avalia o software como um todo, verificando se todos os componentes funcionam juntos para atender aos requisitos definidos.</p>\n\n<h4>O Que é Testado no Nível de Sistema?</h4>\n<ol><li><strong>Integração entre todos os módulos</strong></li>\n<li><strong>Fluxos de negócio completos</strong></li>\n<li><strong>Conformidade com requisitos funcionais</strong></li>\n<li><strong>Interface com sistemas externos</strong></li>\n<li><strong>Performance do sistema integrado</strong></li>\n<li><strong>Segurança end-to-end</strong></li>\n</ol>\n<h4>Exemplo: Fluxo de E-commerce</h4>\n\n<pre><code>Usuário → Login → Navegação → Carrinho → Checkout → Pagamento → Confirmação\n    ↓         ↓          ↓           ↓           ↓            ↓            ↓\n Cadastro   Session   Produtos    Estoque     Frete        Stripe     E-mail\n   ↕          ↕         ↕          ↕          ↕            ↕          ↕\n  DB        Redis     DB/API     DB         Correios      API       SMTP\n</code></pre>\n\n<p>Cada seta representa um ponto de integração que deve ser testado no nível de sistema.</p>\n\n<hr>\n<h3>Teste de Aceitação: Validando com o Cliente</h3>\n\n<p>O teste de aceitação determina se um produto ou sistema atende às expectativas e requisitos do cliente. Este é frequentemente o último nível de teste antes da entrega正式.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto certo?\"</strong></p>\n\n<h4>Tipos de Teste de Aceitação</h4>\n\n<p>##### 1. Teste de Aceitação do Usuário (UAT)</p>\n\n<p>Usuários finais testam o sistema em um ambiente semelhante ao de produção.</p>\n\n<p>##### 2. Teste de Aceitação Operacional (OAT)</p>\n\n<p>Equipe de operações validabackup, recuperação, relatórios.</p>\n\n<p>##### 3. Teste de Aceitação Contratual</p>\n\n<p>Verifica se o sistema atende aos critérios contratuais.</p>\n\n<h4>Características do UAT</h4>\n<ol><li>Geralmente envolve cooperação ou feedback do cliente</li>\n<li>Atividade de validação com dados reais</li>\n<li>Foco na usabilidade e fluxo de negócio</li>\n<li>Pode revelar requisitos mal entendidos</li>\n<li>Último checkpoint antes do go-live</li>\n</ol>\n<hr>\n<h3>Teste Funcional: Verificando Funcionalidades</h3>\n\n<p>O teste funcional determina se um recurso ou sistema funciona corretamente sem problemas. Verifica o sistema em diferentes níveis para garantir que todos os cenários são cobertos.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto da forma certa?\"</strong></p>\n\n<h4>Técnicas de Teste Funcional</h4>\n\n<p>##### 1. Teste Baseado em Requisitos<br><ol><li>Cada requisito tem casos de teste correspondentes</li><br><li>Rastreabilidade entre requisitos e testes</li><br><li>Cobertura completa</li><br></ol><br>##### 2. Teste Baseado em Casos de Uso<br><ol><li>Cenários de usuário documentados</li><br><li>Fluxos principais e alternativos</li><br><li>Pré-condições e pós-condições</li><br></ol><br>##### 3. Teste de Tabela de Decisão<br><ol><li>Combinações de condições e ações</li><br><li>Útil para regras de negócio complexas</li><br></ol><br>##### 4. Teste de Transição de Estado<br><ol><li>Mudanças de estado do sistema</li><br><li>Diagramas de estado</li><br></ol><br><hr><br><h2>Testes Não-Funcionais: Avaliando Qualidade Oculta</h2></p>\n\n<h3>Teste de Desempenho: Rapidez e Estabilidade</h3>\n\n<figure><img src=\"https://media.giphy.com/media/l0Iy69RBwNTRF0MXi/giphy.gif\" alt=\"Performance Testing - Testes de Desempenho\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de desempenho avalia a velocidade, responsividade e estabilidade do sistema sob carga de trabalho. É crítico para garantir que a aplicação atende aos SLAs (Service Level Agreements).</p>\n\n<h4>Subtipo 1: Teste de Carga (Load Testing)</h4>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas.</p>\n\n<p><strong>Métricas Coletadas:</strong><ol><li>Tempo de resposta (média, p95, p99)</li><br><li>Throughput (requisições por segundo)</li><br><li>Utilização de recursos (CPU, memória, disco)</li><br><li>Taxa de erros</li><br></ol><br><strong>Ferramentas Populares:</strong><ol><li>JMeter</li><br><li>Gatling</li><br><li>k6</li><br><li>Locust</li><br></ol><br><h4>Subtipo 2: Teste de Estresse (Stress Testing)</h4></p>\n\n<p>Avalia os limites do sistema além da capacidade normal para identificar o ponto de quebra.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar capacidade máxima</li><br><li>Verificar comportamento sob overload</li><br><li>Medir tempo de recuperação</li><br><li>Validar failovers</li><br></ol><br><h4>Subtipo 3: Teste de Resistência (Soak Testing)</h4></p>\n\n<p>Executa o sistema sob carga por períodos prolongados para identificar degradação gradual.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Conexões não fechadas</li><br><li>Acúmulo de logs</li><br><li>Degradação de performance</li><br></ol><br><h4>Subtipo 4: Teste de Pico (Spike Testing)</h4></p>\n\n<p>Avalia reações do sistema a picos súbitos de carga.</p>\n\n<p><strong>Cenário Exemplo:</strong><br><pre><code>Carga normal: 1000 usuários<br>Pico: 5000 usuários em 10 segundos<br>Recovery: Voltar para 1000 usuários<br></code></pre></p>\n\n<h4>Ferramentas de Teste de Desempenho</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>JMeter</strong></td><td>Open Source</td><td>Java</td><td>Enterprise, complexo</td></tr>\n<tr><td><strong>Gatling</strong></td><td>Open Source</td><td>Scala</td><td>DevOps, CI/CD</td></tr>\n<tr><td><strong>k6</strong></td><td>Open Source</td><td>JavaScript</td><td>Moderno, extensível</td></tr>\n<tr><td><strong>Locust</strong></td><td>Open Source</td><td>Python</td><td>Python teams</td></tr>\n<tr><td><strong>LoadRunner</strong></td><td>Comercial</td><td>Various</td><td>Enterprise</td></tr>\n</table></figure>\n\n<h4>Exemplo de Teste de Carga com k6</h4>\n\n<pre><code>// script.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },  // Ramp-up<br>    { duration: \'5m\', target: 100 },  // Steady state<br>    { duration: \'2m\', target: 200 },  // Spike<br>    { duration: \'5m\', target: 200 },  // Steady state<br>    { duration: \'2m\', target: 0 },    // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // Menos de 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/produtos\');<br>  check(res, {<br>    \'status é 200\': (r) =&gt; r.status === 200,<br>    \'tempo  r.timings.duration &lt; 500,<br>  });<br>  sleep(1);<br>}<br></code></pre></p>\n\n<hr>\n<h3>Teste de Segurança: Protegendo Dados e Sistemas</h3>\n\n<figure><img src=\"https://media.giphy.com/media/1qfDU4MJv3jWu34hEx/giphy.gif\" alt=\"Security Testing - Escudo de Segurança\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de segurança identifica vulnerabilidades e garante proteção de dados. Em um mundo cada vez mais digital, a segurança é prioridade.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n\n<p>##### 1. Teste de Penetração (Pen Test)</p>\n\n<p>Simula ataques para identificar vulnerabilidades antes que hackers maliciosos o façam.</p>\n\n<p><strong>Metodologias:</strong><ol><li>OWASP Testing Guide</li><br><li>PTES (Penetration Testing Execution Standard)</li><br><li>NIST SP 800-115</li><br></ol><br><strong>Tipos de Pentest:</strong><ol><li><strong>Black Box:</strong> Sem conhecimento prévio</li><br><li><strong>White Box:</strong> Código e documentação</li><br><li><strong>Gray Box:</strong> Conhecimento parcial</li><br></ol><br>##### 2. Varredura de Vulnerabilidade</p>\n\n<p>Identifica pontos fracos conhecidos através de scanning automatizado.</p>\n\n<p><strong>Ferramentas:</strong><ol><li>Nessus</li><br><li>OpenVAS</li><br><li>Qualys</li><br><li>Nexpose</li><br></ol><br>##### 3. Teste de Firewall e WAF</p>\n\n<p>Verifica configurações de segurança de firewalls e Web Application Firewalls.</p>\n\n<p><strong>O que testar:</strong><ol><li>Regras de firewall</li><br><li>Block de IPs maliciosos</li><br><li>Detecção de SQL Injection</li><br><li>Proteção XSS</li><br></ol><br>##### 4. Análise de Código Estático (SAST)</p>\n\n<p>Detecta vulnerabilidades no código-fonte sem executá-lo.</p>\n\n<p><strong>Ferramentas SAST:</strong><ol><li>SonarQube</li><br><li>Checkmarx</li><br><li>Fortify</li><br><li>Snyk Code</li><br></ol><br>##### 5. Análise de Componentes (SCA)</p>\n\n<p>Identifica vulnerabilidades em bibliotecas e dependências.</p>\n\n<p><strong>Ferramentas SCA:</strong><ol><li>Snyk</li><br><li>OWASP Dependency-Check</li><br><li>WhiteSource</li><br><li>Dependabot</li><br></ol><br><h4>OWASP Top 10: Vulnerabilidades Mais Comuns</h4><br><ol><li><strong>A01 - Broken Access Control</strong></li><br><li><strong>A02 - Cryptographic Failures</strong></li><br><li><strong>A03 - Injection</strong></li><br><li><strong>A04 - Insecure Design</strong></li><br><li><strong>A05 - Security Misconfiguration</strong></li><br><li><strong>A06 - Vulnerable Components</strong></li><br><li><strong>A07 - Authentication Failures</strong></li><br><li><strong>A08 - Software and Data Integrity Failures</strong></li><br><li><strong>A09 - Security Logging Failures</strong></li><br><li><strong>A10 - SSRF (Server-Side Request Forgery)</strong></li><br></ol><br><hr><br><h3>Teste de Usabilidade: Experiência do Usuário</h3></p>\n\n<p>Avalia a facilidade de uso e a experiência do usuário com o sistema. O teste de usabilidade é essencial para garantir que os usuários consigam realizar suas tarefas de forma eficiente.</p>\n\n<h4>Critérios de Usabilidade</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Critério</th><th>Definição</th><th>Métrica</th></tr>\n<tr><td><strong>Eficácia</strong></td><td>Usuário consegue completar tarefa?</td><td>Taxa de sucesso</td></tr>\n<tr><td><strong>Eficiência</strong></td><td>Quanto tempo leva?</td><td>Tempo de tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Usuário gostou?</td><td>Questionários SUS</td></tr>\n<tr><td><strong>Aprendizagem</strong></td><td>Quanto tempo para aprender?</td><td>Tempo até proficiência</td></tr>\n<tr><td><strong>Memorização</strong></td><td>Lembra como usar?</td><td>Retenção após pausa</td></tr>\n</table></figure>\n\n<h4>Métodos de Teste de Usabilidade</h4>\n<ol><li><strong>Testes com Usuários</strong> - Sessões gravadas com participantes</li>\n<li><strong>Análise Heurística</strong> - Avaliação por especialistas</li>\n<li><strong>Questionários</strong> - SUS, SEQ, NPS</li>\n<li><strong>Eye Tracking</strong> - Rastreamento ocular</li>\n<li><strong>Análise de Tarefas</strong> - Tempos e erros</li>\n</ol>\n<h4>Frameworks de Avaliação</h4>\n<ol><li><strong>Nielsen\'s Heurísticas</strong> (10 princípios)</li>\n<li><strong>ISO 9241-11</strong> (Usabilidade)</li>\n<li><strong>WCAG 2.1</strong> (Acessibilidade)</li>\n</ol>\n<hr>\n<h3>Teste de Compatibilidade: Funciona em Todo Lugar?</h3>\n\n<p>Verifica se o software funciona em diferentes ambientes, navegadores e dispositivos.</p>\n\n<h4>Tipos de Teste de Compatibilidade</h4>\n\n<p>##### 1. Teste de Navegador (Cross-Browser)<br><ol><li>Chrome, Firefox, Safari, Edge</li><br><li>Diferentes versões</li><br><li>Modos de compatibilidade</li><br></ol><br>##### 2. Teste Mobile<br><ol><li>iOS (iPhone, iPad)</li><br><li>Android (diferentes fabricantes)</li><br><li>Diferentes tamanhos de tela</li><br><li>Diferentes versões de OS</li><br></ol><br>##### 3. Teste de Sistema Operacional<br><ol><li>Windows 10, 11</li><br><li>macOS (versões diferentes)</li><br><li>Linux (distribuições populares)</li><br></ol><br>##### 4. Teste de Hardware<br><ol><li>Diferentes processadores</li><br><li>Diferentes quantidades de RAM</li><br><li>Diferentes resoluções de tela</li><br></ol><br><h4>Ferramentas de Teste Cross-Browser</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Cobertura</th><th>Preço</th></tr>\n<tr><td>BrowserStack</td><td>3000+ dispositivos</td><td>$29+/mês</td></tr>\n<tr><td>Sauce Labs</td><td>1000+ dispositivos</td><td>$39+/mês</td></tr>\n<tr><td>LambdaTest</td><td>3000+ dispositivos</td><td>$15+/mês</td></tr>\n<tr><td>CrossBrowserTesting</td><td>1500+ dispositivos</td><td>$29+/mês</td></tr>\n</table></figure>\n\n<hr>\n<h3>Teste de Recuperação: Resistência a Falhas</h3>\n\n<p>Avalia a capacidade do sistema de se recuperar de falhas e disasters. É crucial para sistemas críticos que não podem ficar fora do ar.</p>\n\n<h4>Cenários de Teste</h4>\n<ol><li><strong>Falha de Hardware</strong></li>\n</ol>   - Perda de disco\n   - Falha de memória\n   - Queda de servidor\n<ol><li><strong>Falha de Software</strong></li>\n</ol>   - Crash de aplicação\n   - Deadlock\n   - Exceções não tratadas\n<ol><li><strong>Falha de Rede</strong></li>\n</ol>   - Perda de conectividade\n   - Alta latência\n   - Timeout\n<ol><li><strong>Desastres</strong></li>\n</ol>   - Perda de datacenter\n   - Corrupção de dados\n   - Ataques DDoS\n\n<h4>Métricas de Recuperação</h4>\n<ol><li><strong>RTO (Recovery Time Objective):</strong> Tempo máximo para recuperação</li>\n<li><strong>RPO (Recovery Point Objective):</strong> Perda máxima de dados aceitável</li>\n<li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li>\n<li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li>\n</ol>\n<hr>\n<h2>Testes de Regressão: Mantendo a Qualidade</h2>\n\n<p>Executados sempre que o código é modificado para garantir que alterações não introduzam novos defeitos. Este é um dos tipos de teste mais importantes e frequentemente executados.</p>\n\n<h3>Quando Executar Testes de Regressão</h3>\n\n<p>✅ Após cada release de software  <br>✅ Após correção de bugs  <br>✅ Após atualizações de dependências  <br>✅ Após refactoring de código  <br>✅ Antes do deploy de produção</p>\n\n<h3>Estratégias de Testes de Regressão</h3>\n\n<h4>1. Regressão Completa</h4>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura total</li><br><li>Alta confiança</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Tempo longo</li><br><li>Custo elevado</li><br></ol><br><h4>2. Regressão Seletiva</h4></p>\n\n<p>Seleciona testes relevantes baseados em mudanças.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Mais rápido</li><br><li>Mais econômico</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode perder cobertura</li><br></ol><br><h4>3. Regressão Prioritária</h4></p>\n\n<p>Executa testes por prioridade (críticos &gt; altos &gt; médios &gt; baixos).</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura do crítico rápido</li><br><li>Decisões baseadas em risco</li><br></ol><br><h3>Automação de Testes de Regressão</h3></p>\n\n<p>A automação é essencial para testes de regressão eficazes:</p>\n\n<p><strong>Benefícios:</strong><ol><li>Execução frequente</li><br><li>Resultados consistentes</li><br><li>Rapidez</li><br><li>Cobertura ampla</li><br></ol><br><strong>Ferramentas Recomendadas:</strong><ol><li>Selenium WebDriver</li><br><li>Playwright</li><br><li>Cypress</li><br><li>Appium (mobile)</li><br><li>RestAssured (API)</li><br></ol><br><hr><br><h2>Pirâmide de Testes: Arquitetura Ideal</h2></p>\n\n<p>A pirâmide de testes é um conceito fundamental que guia a distribuição dos tipos de teste:</p>\n\n<pre><code>                    /\n                   /  \n                  / E2E        ← Poucos testes E2E (lentos, caros)\n                 /      \n                /Integração   ← Alguns testes de integração\n               /            \n              /  Unitários     ← Muitos testes unitários (rápidos, baratos)\n             /________________\n</code></pre>\n\n<h3>Proporções Ideais</h3>\n<ol><li><strong>Unitários:</strong> 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>Integração:</strong> 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>E2E:</strong> 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Compreender os diferentes tipos de testes de software é fundamental para construir uma estratégia de QA eficaz. Cada tipo de teste tem seu propósito específico e deve ser aplicado no momento adequado do ciclo de desenvolvimento.</p>\n\n<p><strong>Resumo dos Tipos de Testes:</strong></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Categoria</th><th>Tipo</th><th>Quando Usar</th><th>Objetivo</th></tr>\n<tr><td><strong>Funcional</strong></td><td>Unitário</td><td>Desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Integração</td><td>Pós-unitário</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Sistema</td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Aceitação</td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Performance</td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Segurança</td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Usabilidade</td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n</table></figure>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem todo projeto precisa de todos os tipos</li><br><li><strong>Priorize</strong> - Comece com unitários e integração</li><br><li><strong>Automatize</strong> - Regressão deve ser automática</li><br><li><strong>Meça</strong> - Cobertura, tempo, defeitos encontrados</li><br><li><strong>Melhore</strong> - Itere constantemente</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre Tipos de Testes</h3></p>\n\n<p><strong>P: Quantos tipos de testes existem?</strong>  <br>R: Existem dozens de tipos de testes classificados de diferentes formas. Os principais são funcionais e não-funcionais, cada um com subtipos específicos.</p>\n\n<p><strong>P: Qual a diferença entre teste de sistema e teste de aceitação?</strong>  <br>R: Teste de sistema verifica se o sistema atende aos requisitos técnicos. Teste de aceitação verifica se o sistema atende às expectativas do usuário/cliente.</p>\n\n<p><strong>P: Testes manuais podem ser substituídos por automatizados?</strong>  <br>R: Não completamente. Testes manuais são essenciais para exploratory testing, UX e cenários complexos. A automação complementa, não substitui.</p>\n\n<p><strong>P: Quando devo começar a testar?</strong>  <br>R: O mais cedo possível! O conceito de Shift-Left recomenda testes desde as primeiras fases do desenvolvimento.</p>\n\n<p><strong>P: Qual a ordem ideal de execução dos testes?</strong>  <br>R: Unitários → Integração → Sistema → Aceitação. Cada nível depende do anterior.</p>\n\n<hr>\n<em>Fonte: Selenium.dev, Atlassian, Vericode, ISTQB, OWASP</em>', 'Tipos de Testes de Software: Guia Completo com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '179-revision-v1', '', '', '2026-07-06 22:41:45', '2026-07-07 01:41:45', '', '179', 'http://localhost:8082/ideiasti/?p=449', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('450', '0', '2026-07-06 22:41:49', '2026-07-07 01:41:49', '', 'giphy-3', '', 'inherit', 'open', 'closed', '', 'giphy-3', '', '', '2026-07-06 22:41:49', '2026-07-07 01:41:49', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-3.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('451', '0', '2026-07-06 22:41:50', '2026-07-07 01:41:50', '<p><strong>Meta Description:</strong> Descubra como a Inteligência Artificial está revolucionando a QA: automação inteligente, geração de testes, detecção de anomalias e manutenção preditiva. Guia completo para profissionais.</p>\n\n<hr>\n<h2>Estado Atual da IA em QA</h2>\n\n<p>O <strong>World Quality Report 2025</strong> revela dados impressionantes: quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão ativamente buscando GenAI</strong> em práticas de Quality Engineering (QE), mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} alcançaram implementação em escala empresarial.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-3.gif\" alt=\"AI Brain - Inteligência Artificial em QA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Esta lacuna entre interesse e implementação representa uma oportunidade significativa para profissionais e organizações que souberem aproveitar efetivamente essas tecnologias.</p>\n\n<hr>\n<h2>Por Que a Adoção de IA em QA Está Crescendo?</h2>\n\n<h3>Drivers de Adoção</h3>\n<ol><li><strong>Volume de testes crescente</strong> - Sistemas mais complexos exigem mais testes</li>\n<li><strong>Pressure de velocidade</strong> - CI/CD demanda execuções mais rápidas</li>\n<li><strong>Escassez de profissionais</strong> - Demanda supera oferta de testadores</li>\n<li><strong>Qualidade em produção</strong> - Necessidade de monitoramento contínuo</li>\n<li><strong>Custos crescentes</strong> - Automação inteligente reduz despesas</li>\n</ol>\n<h3>Benefícios Comprovados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Impacto da IA</th></tr>\n<tr><td>Redução de tempo de teste</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de custos de QA</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Melhoria em cobertura</td><td>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Detecção precoce de bugs</td><td>3-5x mais cedo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Desafios de Adoção de IA em QA</h2>\n\n<h3>1. Desalinhamento Estratégico</h3>\n\n<p>Existe um hiato crescente entre o interesse organizacional em GenAI e a prontidão real para adoção efetiva dentro de QE. O caminho da experimentação para implementação é mais complexo do que o antecipado.</p>\n\n<h4>Sinais de Desalinhamento</h4>\n\n<ul><li>GenAI vista como \"solução mágica\" sem estratégia clara</li><ol><li>Falta de alinhamento entre TI e negócios</li>\n<li>Expectativas irreais sobre capacidades</li>\n<li>Subestimação de esforço de integração</li>\n</ol>\n<h3>2. Complexidade de Implementação</h3>\n\n<p>A implementação de IA em QA requer alinhamento entre inovação operacional e oversight estratégico. Desafios incluem:</p>\n\n<h4>Desafios Técnicos</h4>\n<ol><li>Integração com sistemas legados</li>\n<li>Qualidade dos dados de treinamento</li>\n<li>Escolha de modelos adequados</li>\n<li>Manutenção de modelos em produção</li>\n</ol>\n<h4>Desafios Organizacionais</h4>\n<ol><li>Resistência cultural</li>\n<li>Falta de competências</li>\n<li>Processos não adaptados</li>\n<li>Governança de IA</li>\n</ol>\n<h3>3. Questões Éticas e de Governança</h3>\n<ol><li>Viés em modelos de IA</li>\n<li>Transparência nas decisões</li>\n<li>Responsabilidade por falhas</li>\n<li>Conformidade regulatória</li>\n</ol>\n<hr>\n<h2>Aplicações de IA em QA: Casos de Uso Detalhados</h2>\n\n<h3>1. Geração Automatizada de Testes</h3>\n\n<p>IA pode gerar casos de teste automaticamente baseados em requisitos e código. Esta é uma das aplicações mais promissoras.</p>\n\n<figure><img src=\"https://media.giphy.com/media/VbZ0cWw6cVPMM/giphy.gif\" alt=\"Automação de Testes com IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Requisitos → Análise de NLP → Cenários de Teste → Casos de Teste\n    ↓                                                        ↓\n Código → Análise Estática → Cobertura → Testes Sugeridos\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de unit tests</td><td>Diffblue</td></tr>\n<tr><td><strong>Testim</strong></td><td>Testes E2E com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>Automação sem código com IA</td><td>Avo Automation</td></tr>\n</table></figure>\n\n<h4>Exemplo: Geração de Testes com GenAI</h4>\n\n<pre><code># Exemplo conceitual de como IA pode gerar testes\nimport openai\n\n<p>def gerar_testes_para_requisito(requisito):<br>    prompt = f\"\"\"<br>    Gere casos de teste para o seguinte requisito:</p>\n\n<p>Requisito: {requisito}</p>\n\n<p>Formato de saída (JSON):<br>    {{<br>        \"casos_de_teste\": [<br>            {{<br>                \"id\": \"CT-001\",<br>                \"titulo\": \"...\",<br>                \"pre_condicoes\": [...],<br>                \"passos\": [...],<br>                \"dados_teste\": {{...}},<br>                \"resultado_esperado\": \"...\"<br>            }}<br>        ]<br>    }}<br>    \"\"\"</p>\n\n<p>response = openai.chat.completions.create(<br>        model=\"gpt-4\",<br>        messages=[{\"role\": \"user\", \"content\": prompt}]<br>    )</p>\n\n<p>return json.loads(response.choices[0].message.content)<br></code></pre></p>\n\n<h3>2. Detecção de Anomalias</h3>\n\n<p>Algoritmos de machine learning identificam padrões incomuns que indicam defeitos, revolucionando o monitoramento de qualidade.</p>\n\n<h4>Técnicas Utilizadas</h4>\n\n<p>##### Análise de Séries Temporais<br><ol><li>Identificação de anomalias em métricas de performance</li><br><li>Detecção de degradação gradual</li><br><li>Alertas proativos sobre problemas</li><br></ol><br>##### Clustering<br><ol><li>Agrupamento de testes similares</li><br><li>Identificação de testes atípicos</li><br><li>Detecção de padrões de falha</li><br></ol><br>##### Redes Neurais<br><ol><li>Detecção de padrões complexos</li><br><li>Aprendizado de comportamentos normais</li><br><li>Previsão de falhas</li><br></ol><br><h4>Ferramentas de Detecção de Anomalias</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Aplicação</th></tr>\n<tr><td><strong>Elastic APM</strong></td><td>APM</td><td>Detecção de anomalias em produção</td></tr>\n<tr><td><strong>Datadog</strong></td><td>Monitoring</td><td>ML para métricas</td></tr>\n<tr><td><strong>New Relic</strong></td><td>APM</td><td>Detecção inteligente</td></tr>\n<tr><td><strong>Grafana + Loki</strong></td><td>Logging</td><td>Análise de logs com ML</td></tr>\n</table></figure>\n\n<h3>3. Manutenção Inteligente de Testes</h3>\n\n<p>IA ajuda a identificar e remover testes obsoletos ou flaky, mantendo a suite de testes saudável.</p>\n\n<h4>Problemas que a IA Resolve</h4>\n\n<p><strong>Testes Flaky (Instáveis)</strong><br><ol><li>Identificação de padrões que causam instabilidade</li><br><li>Predição de quais testes podem falhar</li><br><li>Sugestões de correções</li><br><li>Quarentena automática</li><br></ol><br><strong>Testes Obsoletos</strong><br><ol><li>Detecção de funcionalidades removidas</li><br><li>Identificação de código não coberto</li><br><li>Sugestões de remoção segura</li><br></ol><br><h4>Exemplo de Detecção de Testes Flaky</h4></p>\n\n<pre><code># Sistema simplificado de detecção de testes flaky\nclass FlakyTestDetector:\n    def __init__(self):\n        self.test_history = {}\n        self.ml_model = load_trained_model()\n\n<p>def analyze_test(self, test_name, execution_history):<br>        features = self.extract_features(execution_history)<br>        flaky_probability = self.ml_model.predict_proba([features])[0]</p>\n\n<p>if flaky_probability &gt; 0.7:<br>            return {<br>                \"test\": test_name,<br>                \"flaky_probability\": flaky_probability,<br>                \"recommendation\": \"QUARANTINE\",<br>                \"reasons\": self.explain_prediction(features)<br>            }<br>        return {\"test\": test_name, \"flaky_probability\": flaky_probability}</p>\n\n<p>def extract_features(self, history):<br>        return [<br>            history.success_rate,<br>            history.avg_duration,<br>            history.recent_failures,<br>            history.environment_changes,<br>            history.dependency_changes<br>        ]<br></code></pre></p>\n\n<h3>4. Análise de Código Estático com IA</h3>\n\n<p>Identifica potenciais problemas de qualidade antes da execução, usando análise semântica avançada.</p>\n\n<h4>Capacidades Avançadas</h4>\n<ol><li><strong>Detecção de vulnerabilidades</strong> - OWASP Top 10</li>\n<li><strong>Análise de dependências</strong> - Bibliotecas desatualizadas</li>\n<li><strong>Code smells</strong> - Padrões problemáticos</li>\n<li><strong>Débito técnico</strong> - Métricas de qualidade</li>\n</ol>\n<h4>Ferramentas com IA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Capacidades IA</th><th>Integração</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Débito técnico, code smells</td><td>CI/CD</td></tr>\n<tr><td><strong>Snyk</strong></td><td>Vulnerabilidades, licenças</td><td>IDE, CI</td></tr>\n<tr><td><strong>CodeClimate</strong></td><td>Quality, maintainability</td><td>GitHub</td></tr>\n<tr><td><strong>DeepSource</strong></td><td>Análise estática com ML</td><td>Git</td></tr>\n</table></figure>\n\n<h3>5. Testes Visuais Automatizados</h3>\n\n<p>Comparação de interfaces visuais usando visão computacional para detectar regressões.</p>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Página Capturada → Modelo de Visão Computacional → Comparação com Baseline\n     ↓                          ↓                                    ↓\n  Screenshots           Detecção de Elementos           Diff Visual\n                                            ↓\n                                    Alertas de Regressão\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tecnologia</th><th>Diferencial</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Visual AI</td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de precisão</td></tr>\n<tr><td><strong> Percy</strong></td><td>Visual testing</td><td>Integração simples</td></tr>\n<tr><td><strong>Chromatic</strong></td><td>Visual regression</td><td>Para Storybook</td></tr>\n<tr><td><strong>Lost Pixel</strong></td><td>Open source</td><td>Self-hosted</td></tr>\n</table></figure>\n\n<h3>6. Oráculos de Teste Baseados em IA</h3>\n\n<p>Validação de resultados usando modelos treinados para determinar se o comportamento está correto.</p>\n\n<h4>Tipos de Oráculos</h4>\n<ol><li><strong>Oráculo de Imagem</strong> - Validação visual de UI</li>\n<li><strong>Oráculo de Texto</strong> - Análise de conteúdo</li>\n<li><strong>Oráculo de Comportamento</strong> - Detecção de anomalias</li>\n<li><strong>Oráculo de Dados</strong> - Validação de datasets</li>\n</ol>\n<hr>\n<h2>Ferramentas de IA para QA: Comparativo</h2>\n\n<h3>Plataformas Completas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Testim</strong></td><td>Automação inteligente E2E</td><td>$600+/mês</td><td>Equipes enterprise</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Automação com ML</td><td>Sob consulta</td><td>Escala enterprise</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>$500+/mês</td><td>CI/CD integrado</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>No-code com IA</td><td>Sob consulta</td><td>Enterprise</td></tr>\n<tr><td><strong>Perfecto</strong></td><td>Testes mobile/web com IA</td><td>Sob consulta</td><td>Mobile testing</td></tr>\n</table></figure>\n\n<h3>Ferramentas Especializadas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais</td><td>$100+/mês</td><td>UI testing</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Unit tests</td><td>$299/assinante</td><td>Dev teams</td></tr>\n<tr><td><strong>Snyk</strong></td><td>SCA</td><td>Grátis + Pro</td><td>Developers</td></tr>\n<tr><td><strong>SonarCloud</strong></td><td>SAST</td><td>Grátis + Pro</td><td>CI/CD</td></tr>\n</table></figure>\n\n<h3>Ferramentas Emerging (2025-2026)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Status</th></tr>\n<tr><td><strong>CodiumAI</strong></td><td>Testes gerados automaticamente</td><td>Beta</td></tr>\n<tr><td><strong>Mutable AI</strong></td><td>Code review + tests</td><td>Beta</td></tr>\n<tr><td><strong>Dagger</strong></td><td>CI/CD programável</td><td>GA</td></tr>\n<tr><td><strong>Trunk</strong></td><td>Linting inteligente</td><td>GA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando IA em QA: Roadmap Prático</h2>\n\n<h3>Fase 1: Avaliação e Planejamento (1-2 meses)</h3>\n\n<h4>Checklist de Avaliação</h4>\n<ol><li>[ ] Mapeamento de processos atuais de QA</li>\n<li>[ ] Identificação de pontos de dor</li>\n<li>[ ] Análise de ROI potencial</li>\n<li>[ ] Avaliação de maturidade tecnológica</li>\n<li>[ ] Levantamento de stakeholders</li>\n</ol>\n<h4>Métricas de Baseline</h4>\n\n<p>Antes de implementar, estabeleça métricas de referência:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Ferramenta</th></tr>\n<tr><td>Tempo de teste</td><td>Duração de suite</td><td>CI/CD logs</td></tr>\n<tr><td>Cobertura de teste</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>Coverage tools</td></tr>\n<tr><td>Taxa de defeitos</td><td>Bugs em produção</td><td>Bug tracker</td></tr>\n<tr><td>Testes flaky</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas instáveis</td><td>CI/CD</td></tr>\n<tr><td>Custo de QA</td><td>$/teste executado</td><td>Financeiro</td></tr>\n</table></figure>\n\n<h3>Fase 2: Pilot (2-3 meses)</h3>\n\n<h4>Escolha do Piloto</h4>\n\n<p>Selecione um projeto ou área com:<br><ol><li>✅ Escopo controlado</li><br><li>✅ Equipe aberta a inovação</li><br><li>✅ Processos definidos</li><br><li>✅ Métricas disponíveis</li><br></ol><br><h4>Pilotos Recomendados</h4><br><ol><li><strong>Geração de unit tests</strong> - Diffblue, CodiumAI</li><br><li><strong>Testes visuais</strong> - Applitools</li><br><li><strong>Detecção de flaky tests</strong> - Ferramentas de CI</li><br><li><strong>Análise estática</strong> - SonarQube, Snyk</li><br></ol><br><h3>Fase 3: Expansão (3-6 meses)</h3></p>\n\n<h4>Escalar Sucesso</h4>\n<ol><li>Documente aprendizados</li>\n<li>Treine outras equipes</li>\n<li>Padronize processos</li>\n<li>Melhore integrações</li>\n</ol>\n<h4>KPIs de Sucesso</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Meta (6 meses)</th></tr>\n<tr><td>Redução de tempo de teste</td><td>30-40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Aumento de cobertura</td><td>20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de defeitos em prod</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>ROI positivo</td><td>Sim</td></tr>\n</table></figure>\n\n<h3>Fase 4: Maturidade (6-12 meses)</h3>\n\n<h4>Implementação Enterprise</h4>\n<ol><li>Integração completa com CI/CD</li>\n<li>IA em produção (monitoramento)</li>\n<li>Maintenance automatizado</li>\n<li>Reporting avançado</li>\n</ol>\n<hr>\n<h2>Futuro da IA em QA: Tendências 2026-2028</h2>\n\n<h3>1. Testes Autônomos</h3>\n\n<p>Sistemas que automaticamente:<br><ol><li>Geram testes baseados em requisitos</li><br><li>Executam testes continuamente</li><br><li>Detectam e reportam falhas</li><br><li>Propõem correções</li><br></ol><br><h3>2. Manutenção Preditiva</h3></p>\n\n<p>IA que prevê:<br><ol><li>Quando testes vão falhar</li><br><li>Quando código precisa de mais testes</li><br><li>Quando componentes estão em risco</li><br><li>Quando fazer refactoring</li><br></ol><br><h3>3. GenAI Nativa em QA</h3></p>\n\n<p>Modelos treinados especificamente para:<br><ol><li>Entender código e testes</li><br><li>Gerar código de teste</li><br><li>Analisar requisitos</li><br><li>Documentar testes</li><br></ol><br><h3>4. Testes em Produção com IA</h3></p>\n\n<p>Monitoramento inteligente:<br><ol><li>Detecção de anomalias em produção</li><br><li>Geração automática de testes de regressão</li><br><li>Validação de deployments</li><br><li>Root cause analysis</li><br></ol><br><hr><br><h2>Considerações Éticas e Best Practices</h2></p>\n\n<h3>Governança de IA em QA</h3>\n\n<h4>Princípios</h4>\n<ol><li><strong>Transparência</strong> - Documente como a IA toma decisões</li>\n<li><strong>Responsabilidade</strong> - Humanos mantêm responsabilidade final</li>\n<li><strong>Fairness</strong> - Evite viés em modelos</li>\n<li><strong>Privacidade</strong> - Proteja dados sensíveis</li>\n<li><strong>Segurança</strong> - Proteja modelos contra ataques</li>\n</ol>\n<h4>Checklist de Governança</h4>\n<ol><li>[ ] Política de uso de IA em QA documentada</li>\n<li>[ ] Processos de revisão de decisões de IA</li>\n<li>[ ] Documentação de modelos utilizados</li>\n<li>[ ] Plano de contingência para falhas de IA</li>\n<li>[ ] Treinamento de equipe em uso responsável</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A IA está transformando fundamentalmente a QA, oferecendo oportunidades sem precedentes para aumentar eficiência, cobertura e qualidade. Embora a adoção em escala ainda seja um desafio, organizações que investem estrategicamente em IA para QA estão obtendo vantagens competitivas significativas.</p>\n\n<p><strong>Resumo dos Principais Aprendizados:</strong></p>\n\n<p>✅ IA pode reduzir tempo de teste em 40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}  <br>✅ GenAI está sendo buscada por 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações, mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram em escala  <br>✅ Ferramentas como Playwright, Applitools e Testim estão liderando a adoção  <br>✅ Implementação requer estratégia, não apenas ferramentas  <br>✅ Futuro aponta para testes autônomos e manutenção preditiva</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem toda organização precisa de todas as capacidades</li><br><li><strong>Comece pequeno</strong> - Pilotos controlados são mais eficazes</li><br><li><strong>Meça resultados</strong> - Métricas são essenciais</li><br><li><strong>Treine sua equipe</strong> - Competências em IA são necessárias</li><br><li><strong>Governarize</strong> - Adote práticas éticas desde o início</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre IA em QA</h3></p>\n\n<p><strong>P: A IA vai substituir testadores humanos?</strong>  <br>R: Não. A IA complementa o trabalho humano, permitindo que testadores foquem em atividades estratégicas, exploratory testing e design de testes.</p>\n\n<p><strong>P: Qual é o ROI da implementação de IA em QA?</strong>  <br>R: O ROI típico é de 200-500{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em 12-18 meses, considerando redução de tempo de teste, aumento de cobertura e redução de defeitos em produção.</p>\n\n<p><strong>P: Preciso de especialistas em dados para implementar IA em QA?</strong>  <br>R: Não necessariamente. Muitas ferramentas são \"plug-and-play\" e não requerem conhecimento de ML. No entanto, para implementações avançadas, especialistas são úteis.</p>\n\n<p><strong>P: Quais são os principais riscos do uso de IA em QA?</strong>  <br>R: Os principais riscos incluem: dependência excessiva, viés em modelos, falta de transparência e custos inesperados de manutenção.</p>\n\n<p><strong>P: Quando devo começar a usar IA em QA?</strong>  <br>R: Se você tem mais de 100 testes automatizados ou gastando mais de 20 horas/semana em QA, é um bom momento para avaliar ferramentas de IA.</p>\n\n<hr>\n<em>Fonte: World Quality Report 2025, Software Testing Magazine, Gartner Research, IEEE Software</em>', 'Inteligência Artificial em Quality Assurance: Guia Completo para 2025-2026', '', 'inherit', 'closed', 'closed', '', '181-revision-v1', '', '', '2026-07-06 22:41:50', '2026-07-07 01:41:50', '', '181', 'http://localhost:8082/ideiasti/?p=451', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('452', '0', '2026-07-06 22:55:46', '2026-07-07 01:55:46', '<h2>Introdução</h2>\n\n<p>O <strong>Blog QA Brasil</strong> valoriza sua privacidade. Esta Política de Privacidade descreve como coletamos, usamos, armazenamos e protegemos seus dados pessoais quando você utiliza nosso site, em conformidade com a <strong>Lei Geral de Proteção de Dados (LGPD - Lei nº 13.709/2018)</strong>.</p>\n\n<p>Última atualização: Julho de 2026</p>\n\n<hr>\n<h2>1. Dados que Coletamos</h2>\n\n<h3>1.1 Dados Fornecidos por Você</h3>\n\n<ul><li><strong>Comentários</strong> — Nome, e-mail e conteúdo do comentário</li><ol><li><strong>Newsletter</strong> — Nome e e-mail</li>\n<li><strong>Contato</strong> — Informações enviadas via formulários</li>\n<li><strong>Inscrições</strong> — Dados fornecidos ao se cadastrar em recursos</li>\n</ol>\n<h3>1.2 Dados Coletados Automaticamente</h3>\n<ol><li><strong>Cookies</strong> — Preferências de navegação e consentimento</li>\n<li><strong>Analytics</strong> — Páginas visitadas, tempo de navegação, origem do tráfego</li>\n<li><strong>Endereço IP</strong> — Coletado anonimamente para segurança e analytics</li>\n<li><strong>Navegador e dispositivo</strong> — Informações técnicas sobre sua visita</li>\n</ol>\n<hr>\n<h2>2. Como Usamos Seus Dados</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Finalidade</th><th>Base Legal (LGPD)</th></tr>\n<tr><td>Publicar comentários</td><td>Consentimento</td></tr>\n<tr><td>Enviar newsletter</td><td>Consentimento</td></tr>\n<tr><td>Melhorar o conteúdo</td><td>Interesse legítimo</td></tr>\n<tr><td>Segurança do site</td><td>Interesse legítimo</td></tr>\n<tr><td>Cumprir obrigações legais</td><td>Obrigação legal</td></tr>\n</table></figure>\n\n<hr>\n<h2>3. Cookies</h2>\n\n<h3>3.1 O Que São Cookies</h3>\n\n<p>Cookies são pequenos arquivos armazenados no seu navegador que nos ajudam a melhorar sua experiência de navegação.</p>\n\n<h3>3.2 Tipos de Cookies</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo</th><th>Finalidade</th><th>Armazenamento</th></tr>\n<tr><td><strong>Essenciais</strong></td><td>Funcionamento básico do site</td><td>Sessão</td></tr>\n<tr><td><strong>Funcionais</strong></td><td>Preferências do usuário</td><td>1 ano</td></tr>\n<tr><td><strong>Analíticos</strong></td><td>Métricas de uso</td><td>2 anos</td></tr>\n<tr><td><strong>Marketing</strong></td><td>Conteúdo relevante</td><td>2 anos</td></tr>\n</table></figure>\n\n<h3>3.3 Gerenciamento</h3>\n\n<p>Você pode controlar os cookies através das configurações do seu navegador ou através do nosso painel de preferências disponível no site.</p>\n\n<hr>\n<h2>4. Compartilhamento de Dados</h2>\n\n<h3>4.1 Com Quem Compartilhamos</h3>\n<ol><li><strong>Google Analytics</strong> — Métricas de audiência (anonimizadas)</li>\n<li><strong>Provedor de E-mail</strong> — Newsletter (apenas e-mail)</li>\n<li><strong>Autoridades legais</strong> — Quando exigido por lei</li>\n</ol>\n<h3>4.2 Compromisso</h3>\n\n<p><strong>Não vendemos</strong> seus dados pessoais para terceiros. <strong>Não compartilhamos</strong> dados além do necessário para os serviços descritos.</p>\n\n<hr>\n<h2>5. Seus Direitos (LGPD)</h2>\n\n<p>De acordo com a LGPD, você tem direito a:<br><ol><li><strong>Confirmação</strong> da existência de tratamento de dados</li><br><li><strong>Acesso</strong> aos seus dados pessoais</li><br><li><strong>Correção</strong> de dados incompletos ou incorretos</li><br><li><strong>Exclusão</strong> de dados tratados com consentimento</li><br><li><strong>Portabilidade</strong> dos dados</li><br><li><strong>Revogação</strong> do consentimento a qualquer momento</li><br></ol><br>Para exercer seus direitos, entre em contato pelo e-mail abaixo.</p>\n\n<hr>\n<h2>6. Armazenamento e Segurança</h2>\n\n<h3>6.1 Medidas de Segurança</h3>\n<ol><li>Criptografia SSL/TLS nas comunicações</li>\n<li>Acesso restrito a dados pessoais</li>\n<li>Revisões periódicas de segurança</li></ol></ul>\n\n<h3>6.2 Período de Armazenamento</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo de Dado</th><th>Período</th></tr>\n<tr><td>Comentários</td><td>Indeterminado (até solicitação de exclusão)</td></tr>\n<tr><td>Newsletter</td><td>Até descadastro</td></tr>\n<tr><td>Analytics</td><td>Anonimizado após 24 meses</td></tr>\n<tr><td>Logs de servidor</td><td>6 meses</td></tr>\n</table></figure>\n\n<hr>\n<h2>7. Direitos de Imagem</h2>\n\n<h3>7.1 Imagens do Site</h3>\n\n<p>Utilizamos imagens de fontes como <strong>Unsplash, Giphy e Pexels</strong> sob licenças permissivas. Quando aplicável, creditamos os autores.</p>\n\n<h3>7.2 Conteúdo do Usuário</h3>\n\n<p>Ao enviar comentários com imagens ou links, você é responsável pelo conteúdo enviado.</p>\n\n<hr>\n<h2>8. Alterações nesta Política</h2>\n\n<p>Reservamo-nos o direito de atualizar esta política a qualquer momento:<br><ol><li>Publicaremos a versão atualizada nesta página</li><br><li>Atualizaremos a data de \"Última atualização\"</li><br><li>Mudanças significativas serão notificadas via newsletter (quando aplicável)</li><br></ol><br><hr><br><h2>9. Contato</h2></p>\n\n<p>Para questões sobre privacidade e proteção de dados:</p>\n\n<p><strong>Blog Ideiasti</strong><br>E-mail: pcyasuic@outlook.com</p>\n\n<hr>\n<em>Esta Política de Privacidade foi elaborada em conformidade com a Lei Geral de Proteção de Dados (LGPD - Lei nº 13.709/2018).</em>', 'Política de Privacidade', '', 'publish', 'closed', 'closed', '', 'politica-de-privacidade', '', '', '2026-07-06 22:55:46', '2026-07-07 01:55:46', '', '0', 'http://localhost:8082/ideiasti/politica-de-privacidade/', '0', 'page', '', '0');
INSERT INTO `wp_posts` VALUES ('453', '0', '2026-07-06 22:51:34', '2026-07-07 01:51:34', '', 'giphy-4', '', 'inherit', 'open', 'closed', '', 'giphy-4', '', '', '2026-07-06 22:51:34', '2026-07-07 01:51:34', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-4.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('454', '0', '2026-07-06 22:51:37', '2026-07-07 01:51:37', '<p><strong>Meta Description:</strong> Conheça todos os tipos de testes de software: funcionais, não-funcionais, unitários, integração, sistema e mais. Guia completo com definições, objetivos e melhores práticas.</p>\n\n<hr>\n<h2>Introdução aos Tipos de Testes de Software</h2>\n\n<p>Os testes de software são uma atividade crítica no ciclo de desenvolvimento de sistemas. Compreender os diferentes tipos de testes e quando aplicá-los é fundamental para garantir a qualidade e confiabilidade das aplicações.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-4.gif\" alt=\"Pirâmide de Testes - Hierarquia de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este guia completo apresenta uma categorização detalhada dos principais tipos de testes de software, suas finalidades, características e quando cada um deve ser utilizado no seu projeto.</p>\n\n<hr>\n<h2>Categorização Geral dos Testes</h2>\n\n<p>Os testes de software podem ser divididos em duas categorias principais:</p>\n\n<h3>1. Testes Funcionais</h3>\n\n<p>Verificam se o software funciona conforme especificado, testando funcionalidades específicas e requisitos do negócio.</p>\n\n<h3>2. Testes Não-Funcionais</h3>\n\n<p>Avaliam características como performance, segurança, usabilidade e confiabilidade, que não estão relacionadas a funcionalidades específicas.</p>\n\n<hr>\n<h2>Testes Funcionais: Garantindo o Comportamento Correto</h2>\n\n<h3>Teste Unitário: A Base de Tudo</h3>\n\n<p>O teste unitário é o tipo mais básico de teste, onde cada unidade de código (geralmente uma função ou método) é testada isoladamente. Esta atividade é realizada durante as etapas de desenvolvimento pelos próprios desenvolvedores.</p>\n\n<h4>Objetivos dos Testes Unitários</h4>\n\n<ul><li><strong>Identificar falhas em componentes individuais</strong> - Detectar problemas cedo</li><ol><li><strong>Garantir que cada função trabalha corretamente</strong> - Validação granular</li>\n<li><strong>Facilitar a detecção precoce de defeitos</strong> - Redução de custos</li>\n<li><strong>Documentar o código</strong> - Testes como especificação executável</li>\n<li><strong>Permitir refactoring seguro</strong> - Confiança ao modificar código</li>\n</ol>\n<h4>Exemplo Prático em Python (pytest)</h4>\n\n<pre><code>def calcular_desconto(valor_original, percentual):\n    \"\"\"Calcula o valor do desconto.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual deve estar entre 0 e 100\")\n    desconto = valor_original * (percentual / 100)\n    return valor_original - desconto\n\n<p>def test_calcular_desconto_10_porcento():<br>    assert calcular_desconto(100, 10) == 90</p>\n\n<p>def test_calcular_desconto_50_porcento():<br>    assert calcular_desconto(200, 50) == 100</p>\n\n<p>def test_calcular_desconto_invalido():<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 150)<br></code></pre></p>\n\n<h4>Frameworks Populares para Testes Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Framework</th><th>Características</th></tr>\n<tr><td>Java</td><td>JUnit 5, TestNG</td><td>Mais popular, extensível</td></tr>\n<tr><td>JavaScript</td><td>Jest, Mocha</td><td>Rápido, Mocking fácil</td></tr>\n<tr><td>Python</td><td>pytest, unittest</td><td>Sintaxe simples, fixtures</td></tr>\n<tr><td>C#</td><td>xUnit, NUnit</td><td>.NET ecosystem</td></tr>\n<tr><td>Go</td><td>testing (stdlib)</td><td>Simples, integrado</td></tr>\n</table></figure>\n\n<h4>Melhores Práticas para Testes Unitários</h4>\n\n<p>✅ <strong>Teste apenas uma coisa de cada vez</strong> - Um assert por teste é ideal  <br>✅ <strong>Nomes descritivos</strong> - <code>test_deve_retornar_erro_quando_usuario_invalido</code>  <br>✅ <strong>Independência</strong> - Testes não devem depender uns dos outros  <br>✅ <strong>Rapidez</strong> - Unit tests devem executar em milissegundos  <br>✅ <strong>Isolamento</strong> - Use mocks para dependências externas</p>\n\n<hr>\n<h3>Teste de Integração: Verificando Conexões</h3>\n\n<p>O teste de integração verifica a comunicação entre diferentes módulos ou componentes do sistema. Este tipo de teste é crucial para garantir que as partes do sistema funcionam corretamente quando combinadas.</p>\n\n<h4>Características Principais</h4>\n<ol><li><strong>Valida interfaces e interações entre componentes</strong> - Fluxo de dados correto</li>\n<li><strong>Identifica problemas de comunicação</strong> - API mismatches, protocolos</li>\n<li><strong>Pode ser realizado de forma incremental ou big-bang</strong> - Duas abordagens</li>\n<li><strong>Testa camadas de persistência</strong> - Bancos de dados, APIs externas</li>\n</ol>\n<h4>Estratégias de Integração</h4>\n\n<p>##### 1. Big-Bang Integration</p>\n\n<p>Todos os componentes são integrados simultaneamente e testados juntos.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Simples de implementar</li><br><li>Bom para sistemas pequenos</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Difícil localização de erros</li><br><li>Todos os módulos devem estar prontos</li><br></ol><br>##### 2. Incremental Integration (Bottom-Up)</p>\n\n<p>Começa pelos módulos mais baixos e集成 progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Defeitos fáceis de isolar</li><br><li>Feedback contínuo</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode ter módulos de alto nível sem testes até o final</li><br></ol><br>##### 3. Incremental Integration (Top-Down)</p>\n\n<p>Começa pelos módulos de mais alto nível e desce progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Interface do usuário testada primeiro</li><br><li>Protótipo funcional rápido</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Módulos de baixo nível simulados (stubs)</li><br></ol><br><h4>Exemplo de Teste de Integração (REST API)</h4></p>\n\n<pre><code>import requests\nimport pytest\n\n<p>class TestUserAPI:<br>    BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>def test_criar_usuario(self):<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"senha123\"<br>        }<br>        response = requests.post(f\"{self.BASE_URL}/usuarios\", json=payload)</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data</p>\n\n<p>def test_listar_usuarios(self):<br>        response = requests.get(f\"{self.BASE_URL}/usuarios\")</p>\n\n<p>assert response.status_code == 200<br>        assert isinstance(response.json(), list)<br></code></pre></p>\n\n<hr>\n<h3>Teste de Sistema: Visão Holística</h3>\n\n<p>O teste de sistema avalia o software como um todo, verificando se todos os componentes funcionam juntos para atender aos requisitos definidos.</p>\n\n<h4>O Que é Testado no Nível de Sistema?</h4>\n<ol><li><strong>Integração entre todos os módulos</strong></li>\n<li><strong>Fluxos de negócio completos</strong></li>\n<li><strong>Conformidade com requisitos funcionais</strong></li>\n<li><strong>Interface com sistemas externos</strong></li>\n<li><strong>Performance do sistema integrado</strong></li>\n<li><strong>Segurança end-to-end</strong></li>\n</ol>\n<h4>Exemplo: Fluxo de E-commerce</h4>\n\n<pre><code>Usuário → Login → Navegação → Carrinho → Checkout → Pagamento → Confirmação\n    ↓         ↓          ↓           ↓           ↓            ↓            ↓\n Cadastro   Session   Produtos    Estoque     Frete        Stripe     E-mail\n   ↕          ↕         ↕          ↕          ↕            ↕          ↕\n  DB        Redis     DB/API     DB         Correios      API       SMTP\n</code></pre>\n\n<p>Cada seta representa um ponto de integração que deve ser testado no nível de sistema.</p>\n\n<hr>\n<h3>Teste de Aceitação: Validando com o Cliente</h3>\n\n<p>O teste de aceitação determina se um produto ou sistema atende às expectativas e requisitos do cliente. Este é frequentemente o último nível de teste antes da entrega正式.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto certo?\"</strong></p>\n\n<h4>Tipos de Teste de Aceitação</h4>\n\n<p>##### 1. Teste de Aceitação do Usuário (UAT)</p>\n\n<p>Usuários finais testam o sistema em um ambiente semelhante ao de produção.</p>\n\n<p>##### 2. Teste de Aceitação Operacional (OAT)</p>\n\n<p>Equipe de operações validabackup, recuperação, relatórios.</p>\n\n<p>##### 3. Teste de Aceitação Contratual</p>\n\n<p>Verifica se o sistema atende aos critérios contratuais.</p>\n\n<h4>Características do UAT</h4>\n<ol><li>Geralmente envolve cooperação ou feedback do cliente</li>\n<li>Atividade de validação com dados reais</li>\n<li>Foco na usabilidade e fluxo de negócio</li>\n<li>Pode revelar requisitos mal entendidos</li>\n<li>Último checkpoint antes do go-live</li>\n</ol>\n<hr>\n<h3>Teste Funcional: Verificando Funcionalidades</h3>\n\n<p>O teste funcional determina se um recurso ou sistema funciona corretamente sem problemas. Verifica o sistema em diferentes níveis para garantir que todos os cenários são cobertos.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto da forma certa?\"</strong></p>\n\n<h4>Técnicas de Teste Funcional</h4>\n\n<p>##### 1. Teste Baseado em Requisitos<br><ol><li>Cada requisito tem casos de teste correspondentes</li><br><li>Rastreabilidade entre requisitos e testes</li><br><li>Cobertura completa</li><br></ol><br>##### 2. Teste Baseado em Casos de Uso<br><ol><li>Cenários de usuário documentados</li><br><li>Fluxos principais e alternativos</li><br><li>Pré-condições e pós-condições</li><br></ol><br>##### 3. Teste de Tabela de Decisão<br><ol><li>Combinações de condições e ações</li><br><li>Útil para regras de negócio complexas</li><br></ol><br>##### 4. Teste de Transição de Estado<br><ol><li>Mudanças de estado do sistema</li><br><li>Diagramas de estado</li><br></ol><br><hr><br><h2>Testes Não-Funcionais: Avaliando Qualidade Oculta</h2></p>\n\n<h3>Teste de Desempenho: Rapidez e Estabilidade</h3>\n\n<figure><img src=\"https://media.giphy.com/media/l0Iy69RBwNTRF0MXi/giphy.gif\" alt=\"Performance Testing - Testes de Desempenho\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de desempenho avalia a velocidade, responsividade e estabilidade do sistema sob carga de trabalho. É crítico para garantir que a aplicação atende aos SLAs (Service Level Agreements).</p>\n\n<h4>Subtipo 1: Teste de Carga (Load Testing)</h4>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas.</p>\n\n<p><strong>Métricas Coletadas:</strong><ol><li>Tempo de resposta (média, p95, p99)</li><br><li>Throughput (requisições por segundo)</li><br><li>Utilização de recursos (CPU, memória, disco)</li><br><li>Taxa de erros</li><br></ol><br><strong>Ferramentas Populares:</strong><ol><li>JMeter</li><br><li>Gatling</li><br><li>k6</li><br><li>Locust</li><br></ol><br><h4>Subtipo 2: Teste de Estresse (Stress Testing)</h4></p>\n\n<p>Avalia os limites do sistema além da capacidade normal para identificar o ponto de quebra.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar capacidade máxima</li><br><li>Verificar comportamento sob overload</li><br><li>Medir tempo de recuperação</li><br><li>Validar failovers</li><br></ol><br><h4>Subtipo 3: Teste de Resistência (Soak Testing)</h4></p>\n\n<p>Executa o sistema sob carga por períodos prolongados para identificar degradação gradual.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Conexões não fechadas</li><br><li>Acúmulo de logs</li><br><li>Degradação de performance</li><br></ol><br><h4>Subtipo 4: Teste de Pico (Spike Testing)</h4></p>\n\n<p>Avalia reações do sistema a picos súbitos de carga.</p>\n\n<p><strong>Cenário Exemplo:</strong><br><pre><code>Carga normal: 1000 usuários<br>Pico: 5000 usuários em 10 segundos<br>Recovery: Voltar para 1000 usuários<br></code></pre></p>\n\n<h4>Ferramentas de Teste de Desempenho</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>JMeter</strong></td><td>Open Source</td><td>Java</td><td>Enterprise, complexo</td></tr>\n<tr><td><strong>Gatling</strong></td><td>Open Source</td><td>Scala</td><td>DevOps, CI/CD</td></tr>\n<tr><td><strong>k6</strong></td><td>Open Source</td><td>JavaScript</td><td>Moderno, extensível</td></tr>\n<tr><td><strong>Locust</strong></td><td>Open Source</td><td>Python</td><td>Python teams</td></tr>\n<tr><td><strong>LoadRunner</strong></td><td>Comercial</td><td>Various</td><td>Enterprise</td></tr>\n</table></figure>\n\n<h4>Exemplo de Teste de Carga com k6</h4>\n\n<pre><code>// script.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },  // Ramp-up<br>    { duration: \'5m\', target: 100 },  // Steady state<br>    { duration: \'2m\', target: 200 },  // Spike<br>    { duration: \'5m\', target: 200 },  // Steady state<br>    { duration: \'2m\', target: 0 },    // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // Menos de 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/produtos\');<br>  check(res, {<br>    \'status é 200\': (r) =&gt; r.status === 200,<br>    \'tempo  r.timings.duration &lt; 500,<br>  });<br>  sleep(1);<br>}<br></code></pre></p>\n\n<hr>\n<h3>Teste de Segurança: Protegendo Dados e Sistemas</h3>\n\n<figure><img src=\"https://media.giphy.com/media/1qfDU4MJv3jWu34hEx/giphy.gif\" alt=\"Security Testing - Escudo de Segurança\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de segurança identifica vulnerabilidades e garante proteção de dados. Em um mundo cada vez mais digital, a segurança é prioridade.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n\n<p>##### 1. Teste de Penetração (Pen Test)</p>\n\n<p>Simula ataques para identificar vulnerabilidades antes que hackers maliciosos o façam.</p>\n\n<p><strong>Metodologias:</strong><ol><li>OWASP Testing Guide</li><br><li>PTES (Penetration Testing Execution Standard)</li><br><li>NIST SP 800-115</li><br></ol><br><strong>Tipos de Pentest:</strong><ol><li><strong>Black Box:</strong> Sem conhecimento prévio</li><br><li><strong>White Box:</strong> Código e documentação</li><br><li><strong>Gray Box:</strong> Conhecimento parcial</li><br></ol><br>##### 2. Varredura de Vulnerabilidade</p>\n\n<p>Identifica pontos fracos conhecidos através de scanning automatizado.</p>\n\n<p><strong>Ferramentas:</strong><ol><li>Nessus</li><br><li>OpenVAS</li><br><li>Qualys</li><br><li>Nexpose</li><br></ol><br>##### 3. Teste de Firewall e WAF</p>\n\n<p>Verifica configurações de segurança de firewalls e Web Application Firewalls.</p>\n\n<p><strong>O que testar:</strong><ol><li>Regras de firewall</li><br><li>Block de IPs maliciosos</li><br><li>Detecção de SQL Injection</li><br><li>Proteção XSS</li><br></ol><br>##### 4. Análise de Código Estático (SAST)</p>\n\n<p>Detecta vulnerabilidades no código-fonte sem executá-lo.</p>\n\n<p><strong>Ferramentas SAST:</strong><ol><li>SonarQube</li><br><li>Checkmarx</li><br><li>Fortify</li><br><li>Snyk Code</li><br></ol><br>##### 5. Análise de Componentes (SCA)</p>\n\n<p>Identifica vulnerabilidades em bibliotecas e dependências.</p>\n\n<p><strong>Ferramentas SCA:</strong><ol><li>Snyk</li><br><li>OWASP Dependency-Check</li><br><li>WhiteSource</li><br><li>Dependabot</li><br></ol><br><h4>OWASP Top 10: Vulnerabilidades Mais Comuns</h4><br><ol><li><strong>A01 - Broken Access Control</strong></li><br><li><strong>A02 - Cryptographic Failures</strong></li><br><li><strong>A03 - Injection</strong></li><br><li><strong>A04 - Insecure Design</strong></li><br><li><strong>A05 - Security Misconfiguration</strong></li><br><li><strong>A06 - Vulnerable Components</strong></li><br><li><strong>A07 - Authentication Failures</strong></li><br><li><strong>A08 - Software and Data Integrity Failures</strong></li><br><li><strong>A09 - Security Logging Failures</strong></li><br><li><strong>A10 - SSRF (Server-Side Request Forgery)</strong></li><br></ol><br><hr><br><h3>Teste de Usabilidade: Experiência do Usuário</h3></p>\n\n<p>Avalia a facilidade de uso e a experiência do usuário com o sistema. O teste de usabilidade é essencial para garantir que os usuários consigam realizar suas tarefas de forma eficiente.</p>\n\n<h4>Critérios de Usabilidade</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Critério</th><th>Definição</th><th>Métrica</th></tr>\n<tr><td><strong>Eficácia</strong></td><td>Usuário consegue completar tarefa?</td><td>Taxa de sucesso</td></tr>\n<tr><td><strong>Eficiência</strong></td><td>Quanto tempo leva?</td><td>Tempo de tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Usuário gostou?</td><td>Questionários SUS</td></tr>\n<tr><td><strong>Aprendizagem</strong></td><td>Quanto tempo para aprender?</td><td>Tempo até proficiência</td></tr>\n<tr><td><strong>Memorização</strong></td><td>Lembra como usar?</td><td>Retenção após pausa</td></tr>\n</table></figure>\n\n<h4>Métodos de Teste de Usabilidade</h4>\n<ol><li><strong>Testes com Usuários</strong> - Sessões gravadas com participantes</li>\n<li><strong>Análise Heurística</strong> - Avaliação por especialistas</li>\n<li><strong>Questionários</strong> - SUS, SEQ, NPS</li>\n<li><strong>Eye Tracking</strong> - Rastreamento ocular</li>\n<li><strong>Análise de Tarefas</strong> - Tempos e erros</li>\n</ol>\n<h4>Frameworks de Avaliação</h4>\n<ol><li><strong>Nielsen\'s Heurísticas</strong> (10 princípios)</li>\n<li><strong>ISO 9241-11</strong> (Usabilidade)</li>\n<li><strong>WCAG 2.1</strong> (Acessibilidade)</li>\n</ol>\n<hr>\n<h3>Teste de Compatibilidade: Funciona em Todo Lugar?</h3>\n\n<p>Verifica se o software funciona em diferentes ambientes, navegadores e dispositivos.</p>\n\n<h4>Tipos de Teste de Compatibilidade</h4>\n\n<p>##### 1. Teste de Navegador (Cross-Browser)<br><ol><li>Chrome, Firefox, Safari, Edge</li><br><li>Diferentes versões</li><br><li>Modos de compatibilidade</li><br></ol><br>##### 2. Teste Mobile<br><ol><li>iOS (iPhone, iPad)</li><br><li>Android (diferentes fabricantes)</li><br><li>Diferentes tamanhos de tela</li><br><li>Diferentes versões de OS</li><br></ol><br>##### 3. Teste de Sistema Operacional<br><ol><li>Windows 10, 11</li><br><li>macOS (versões diferentes)</li><br><li>Linux (distribuições populares)</li><br></ol><br>##### 4. Teste de Hardware<br><ol><li>Diferentes processadores</li><br><li>Diferentes quantidades de RAM</li><br><li>Diferentes resoluções de tela</li><br></ol><br><h4>Ferramentas de Teste Cross-Browser</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Cobertura</th><th>Preço</th></tr>\n<tr><td>BrowserStack</td><td>3000+ dispositivos</td><td>$29+/mês</td></tr>\n<tr><td>Sauce Labs</td><td>1000+ dispositivos</td><td>$39+/mês</td></tr>\n<tr><td>LambdaTest</td><td>3000+ dispositivos</td><td>$15+/mês</td></tr>\n<tr><td>CrossBrowserTesting</td><td>1500+ dispositivos</td><td>$29+/mês</td></tr>\n</table></figure>\n\n<hr>\n<h3>Teste de Recuperação: Resistência a Falhas</h3>\n\n<p>Avalia a capacidade do sistema de se recuperar de falhas e disasters. É crucial para sistemas críticos que não podem ficar fora do ar.</p>\n\n<h4>Cenários de Teste</h4>\n<ol><li><strong>Falha de Hardware</strong></li>\n</ol>   - Perda de disco\n   - Falha de memória\n   - Queda de servidor\n<ol><li><strong>Falha de Software</strong></li>\n</ol>   - Crash de aplicação\n   - Deadlock\n   - Exceções não tratadas\n<ol><li><strong>Falha de Rede</strong></li>\n</ol>   - Perda de conectividade\n   - Alta latência\n   - Timeout\n<ol><li><strong>Desastres</strong></li>\n</ol>   - Perda de datacenter\n   - Corrupção de dados\n   - Ataques DDoS\n\n<h4>Métricas de Recuperação</h4>\n<ol><li><strong>RTO (Recovery Time Objective):</strong> Tempo máximo para recuperação</li>\n<li><strong>RPO (Recovery Point Objective):</strong> Perda máxima de dados aceitável</li>\n<li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li>\n<li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li>\n</ol>\n<hr>\n<h2>Testes de Regressão: Mantendo a Qualidade</h2>\n\n<p>Executados sempre que o código é modificado para garantir que alterações não introduzam novos defeitos. Este é um dos tipos de teste mais importantes e frequentemente executados.</p>\n\n<h3>Quando Executar Testes de Regressão</h3>\n\n<p>✅ Após cada release de software  <br>✅ Após correção de bugs  <br>✅ Após atualizações de dependências  <br>✅ Após refactoring de código  <br>✅ Antes do deploy de produção</p>\n\n<h3>Estratégias de Testes de Regressão</h3>\n\n<h4>1. Regressão Completa</h4>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura total</li><br><li>Alta confiança</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Tempo longo</li><br><li>Custo elevado</li><br></ol><br><h4>2. Regressão Seletiva</h4></p>\n\n<p>Seleciona testes relevantes baseados em mudanças.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Mais rápido</li><br><li>Mais econômico</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode perder cobertura</li><br></ol><br><h4>3. Regressão Prioritária</h4></p>\n\n<p>Executa testes por prioridade (críticos &gt; altos &gt; médios &gt; baixos).</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura do crítico rápido</li><br><li>Decisões baseadas em risco</li><br></ol><br><h3>Automação de Testes de Regressão</h3></p>\n\n<p>A automação é essencial para testes de regressão eficazes:</p>\n\n<p><strong>Benefícios:</strong><ol><li>Execução frequente</li><br><li>Resultados consistentes</li><br><li>Rapidez</li><br><li>Cobertura ampla</li><br></ol><br><strong>Ferramentas Recomendadas:</strong><ol><li>Selenium WebDriver</li><br><li>Playwright</li><br><li>Cypress</li><br><li>Appium (mobile)</li><br><li>RestAssured (API)</li><br></ol><br><hr><br><h2>Pirâmide de Testes: Arquitetura Ideal</h2></p>\n\n<p>A pirâmide de testes é um conceito fundamental que guia a distribuição dos tipos de teste:</p>\n\n<pre><code>                    /\n                   /  \n                  / E2E        ← Poucos testes E2E (lentos, caros)\n                 /      \n                /Integração   ← Alguns testes de integração\n               /            \n              /  Unitários     ← Muitos testes unitários (rápidos, baratos)\n             /________________\n</code></pre>\n\n<h3>Proporções Ideais</h3>\n<ol><li><strong>Unitários:</strong> 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>Integração:</strong> 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>E2E:</strong> 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Compreender os diferentes tipos de testes de software é fundamental para construir uma estratégia de QA eficaz. Cada tipo de teste tem seu propósito específico e deve ser aplicado no momento adequado do ciclo de desenvolvimento.</p>\n\n<p><strong>Resumo dos Tipos de Testes:</strong></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Categoria</th><th>Tipo</th><th>Quando Usar</th><th>Objetivo</th></tr>\n<tr><td><strong>Funcional</strong></td><td>Unitário</td><td>Desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Integração</td><td>Pós-unitário</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Sistema</td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Aceitação</td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Performance</td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Segurança</td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Usabilidade</td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n</table></figure>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem todo projeto precisa de todos os tipos</li><br><li><strong>Priorize</strong> - Comece com unitários e integração</li><br><li><strong>Automatize</strong> - Regressão deve ser automática</li><br><li><strong>Meça</strong> - Cobertura, tempo, defeitos encontrados</li><br><li><strong>Melhore</strong> - Itere constantemente</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre Tipos de Testes</h3></p>\n\n<p><strong>P: Quantos tipos de testes existem?</strong>  <br>R: Existem dozens de tipos de testes classificados de diferentes formas. Os principais são funcionais e não-funcionais, cada um com subtipos específicos.</p>\n\n<p><strong>P: Qual a diferença entre teste de sistema e teste de aceitação?</strong>  <br>R: Teste de sistema verifica se o sistema atende aos requisitos técnicos. Teste de aceitação verifica se o sistema atende às expectativas do usuário/cliente.</p>\n\n<p><strong>P: Testes manuais podem ser substituídos por automatizados?</strong>  <br>R: Não completamente. Testes manuais são essenciais para exploratory testing, UX e cenários complexos. A automação complementa, não substitui.</p>\n\n<p><strong>P: Quando devo começar a testar?</strong>  <br>R: O mais cedo possível! O conceito de Shift-Left recomenda testes desde as primeiras fases do desenvolvimento.</p>\n\n<p><strong>P: Qual a ordem ideal de execução dos testes?</strong>  <br>R: Unitários → Integração → Sistema → Aceitação. Cada nível depende do anterior.</p>\n\n<hr>\n<em>Fonte: Selenium.dev, Atlassian, Vericode, ISTQB, OWASP</em>', 'Tipos de Testes de Software: Guia Completo com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '179-revision-v1', '', '', '2026-07-06 22:51:37', '2026-07-07 01:51:37', '', '179', 'http://localhost:8082/ideiasti/?p=454', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('455', '0', '2026-07-06 22:51:40', '2026-07-07 01:51:40', '', 'giphy-5', '', 'inherit', 'open', 'closed', '', 'giphy-5', '', '', '2026-07-06 22:51:40', '2026-07-07 01:51:40', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-5.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('456', '0', '2026-07-06 22:51:40', '2026-07-07 01:51:40', '<p><strong>Meta Description:</strong> Descubra como a Inteligência Artificial está revolucionando a QA: automação inteligente, geração de testes, detecção de anomalias e manutenção preditiva. Guia completo para profissionais.</p>\n\n<hr>\n<h2>Estado Atual da IA em QA</h2>\n\n<p>O <strong>World Quality Report 2025</strong> revela dados impressionantes: quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão ativamente buscando GenAI</strong> em práticas de Quality Engineering (QE), mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} alcançaram implementação em escala empresarial.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-5.gif\" alt=\"AI Brain - Inteligência Artificial em QA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Esta lacuna entre interesse e implementação representa uma oportunidade significativa para profissionais e organizações que souberem aproveitar efetivamente essas tecnologias.</p>\n\n<hr>\n<h2>Por Que a Adoção de IA em QA Está Crescendo?</h2>\n\n<h3>Drivers de Adoção</h3>\n<ol><li><strong>Volume de testes crescente</strong> - Sistemas mais complexos exigem mais testes</li>\n<li><strong>Pressure de velocidade</strong> - CI/CD demanda execuções mais rápidas</li>\n<li><strong>Escassez de profissionais</strong> - Demanda supera oferta de testadores</li>\n<li><strong>Qualidade em produção</strong> - Necessidade de monitoramento contínuo</li>\n<li><strong>Custos crescentes</strong> - Automação inteligente reduz despesas</li>\n</ol>\n<h3>Benefícios Comprovados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Impacto da IA</th></tr>\n<tr><td>Redução de tempo de teste</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de custos de QA</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Melhoria em cobertura</td><td>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Detecção precoce de bugs</td><td>3-5x mais cedo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Desafios de Adoção de IA em QA</h2>\n\n<h3>1. Desalinhamento Estratégico</h3>\n\n<p>Existe um hiato crescente entre o interesse organizacional em GenAI e a prontidão real para adoção efetiva dentro de QE. O caminho da experimentação para implementação é mais complexo do que o antecipado.</p>\n\n<h4>Sinais de Desalinhamento</h4>\n\n<ul><li>GenAI vista como \"solução mágica\" sem estratégia clara</li><ol><li>Falta de alinhamento entre TI e negócios</li>\n<li>Expectativas irreais sobre capacidades</li>\n<li>Subestimação de esforço de integração</li>\n</ol>\n<h3>2. Complexidade de Implementação</h3>\n\n<p>A implementação de IA em QA requer alinhamento entre inovação operacional e oversight estratégico. Desafios incluem:</p>\n\n<h4>Desafios Técnicos</h4>\n<ol><li>Integração com sistemas legados</li>\n<li>Qualidade dos dados de treinamento</li>\n<li>Escolha de modelos adequados</li>\n<li>Manutenção de modelos em produção</li>\n</ol>\n<h4>Desafios Organizacionais</h4>\n<ol><li>Resistência cultural</li>\n<li>Falta de competências</li>\n<li>Processos não adaptados</li>\n<li>Governança de IA</li>\n</ol>\n<h3>3. Questões Éticas e de Governança</h3>\n<ol><li>Viés em modelos de IA</li>\n<li>Transparência nas decisões</li>\n<li>Responsabilidade por falhas</li>\n<li>Conformidade regulatória</li>\n</ol>\n<hr>\n<h2>Aplicações de IA em QA: Casos de Uso Detalhados</h2>\n\n<h3>1. Geração Automatizada de Testes</h3>\n\n<p>IA pode gerar casos de teste automaticamente baseados em requisitos e código. Esta é uma das aplicações mais promissoras.</p>\n\n<figure><img src=\"https://media.giphy.com/media/VbZ0cWw6cVPMM/giphy.gif\" alt=\"Automação de Testes com IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Requisitos → Análise de NLP → Cenários de Teste → Casos de Teste\n    ↓                                                        ↓\n Código → Análise Estática → Cobertura → Testes Sugeridos\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de unit tests</td><td>Diffblue</td></tr>\n<tr><td><strong>Testim</strong></td><td>Testes E2E com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>Automação sem código com IA</td><td>Avo Automation</td></tr>\n</table></figure>\n\n<h4>Exemplo: Geração de Testes com GenAI</h4>\n\n<pre><code># Exemplo conceitual de como IA pode gerar testes\nimport openai\n\n<p>def gerar_testes_para_requisito(requisito):<br>    prompt = f\"\"\"<br>    Gere casos de teste para o seguinte requisito:</p>\n\n<p>Requisito: {requisito}</p>\n\n<p>Formato de saída (JSON):<br>    {{<br>        \"casos_de_teste\": [<br>            {{<br>                \"id\": \"CT-001\",<br>                \"titulo\": \"...\",<br>                \"pre_condicoes\": [...],<br>                \"passos\": [...],<br>                \"dados_teste\": {{...}},<br>                \"resultado_esperado\": \"...\"<br>            }}<br>        ]<br>    }}<br>    \"\"\"</p>\n\n<p>response = openai.chat.completions.create(<br>        model=\"gpt-4\",<br>        messages=[{\"role\": \"user\", \"content\": prompt}]<br>    )</p>\n\n<p>return json.loads(response.choices[0].message.content)<br></code></pre></p>\n\n<h3>2. Detecção de Anomalias</h3>\n\n<p>Algoritmos de machine learning identificam padrões incomuns que indicam defeitos, revolucionando o monitoramento de qualidade.</p>\n\n<h4>Técnicas Utilizadas</h4>\n\n<p>##### Análise de Séries Temporais<br><ol><li>Identificação de anomalias em métricas de performance</li><br><li>Detecção de degradação gradual</li><br><li>Alertas proativos sobre problemas</li><br></ol><br>##### Clustering<br><ol><li>Agrupamento de testes similares</li><br><li>Identificação de testes atípicos</li><br><li>Detecção de padrões de falha</li><br></ol><br>##### Redes Neurais<br><ol><li>Detecção de padrões complexos</li><br><li>Aprendizado de comportamentos normais</li><br><li>Previsão de falhas</li><br></ol><br><h4>Ferramentas de Detecção de Anomalias</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Aplicação</th></tr>\n<tr><td><strong>Elastic APM</strong></td><td>APM</td><td>Detecção de anomalias em produção</td></tr>\n<tr><td><strong>Datadog</strong></td><td>Monitoring</td><td>ML para métricas</td></tr>\n<tr><td><strong>New Relic</strong></td><td>APM</td><td>Detecção inteligente</td></tr>\n<tr><td><strong>Grafana + Loki</strong></td><td>Logging</td><td>Análise de logs com ML</td></tr>\n</table></figure>\n\n<h3>3. Manutenção Inteligente de Testes</h3>\n\n<p>IA ajuda a identificar e remover testes obsoletos ou flaky, mantendo a suite de testes saudável.</p>\n\n<h4>Problemas que a IA Resolve</h4>\n\n<p><strong>Testes Flaky (Instáveis)</strong><br><ol><li>Identificação de padrões que causam instabilidade</li><br><li>Predição de quais testes podem falhar</li><br><li>Sugestões de correções</li><br><li>Quarentena automática</li><br></ol><br><strong>Testes Obsoletos</strong><br><ol><li>Detecção de funcionalidades removidas</li><br><li>Identificação de código não coberto</li><br><li>Sugestões de remoção segura</li><br></ol><br><h4>Exemplo de Detecção de Testes Flaky</h4></p>\n\n<pre><code># Sistema simplificado de detecção de testes flaky\nclass FlakyTestDetector:\n    def __init__(self):\n        self.test_history = {}\n        self.ml_model = load_trained_model()\n\n<p>def analyze_test(self, test_name, execution_history):<br>        features = self.extract_features(execution_history)<br>        flaky_probability = self.ml_model.predict_proba([features])[0]</p>\n\n<p>if flaky_probability &gt; 0.7:<br>            return {<br>                \"test\": test_name,<br>                \"flaky_probability\": flaky_probability,<br>                \"recommendation\": \"QUARANTINE\",<br>                \"reasons\": self.explain_prediction(features)<br>            }<br>        return {\"test\": test_name, \"flaky_probability\": flaky_probability}</p>\n\n<p>def extract_features(self, history):<br>        return [<br>            history.success_rate,<br>            history.avg_duration,<br>            history.recent_failures,<br>            history.environment_changes,<br>            history.dependency_changes<br>        ]<br></code></pre></p>\n\n<h3>4. Análise de Código Estático com IA</h3>\n\n<p>Identifica potenciais problemas de qualidade antes da execução, usando análise semântica avançada.</p>\n\n<h4>Capacidades Avançadas</h4>\n<ol><li><strong>Detecção de vulnerabilidades</strong> - OWASP Top 10</li>\n<li><strong>Análise de dependências</strong> - Bibliotecas desatualizadas</li>\n<li><strong>Code smells</strong> - Padrões problemáticos</li>\n<li><strong>Débito técnico</strong> - Métricas de qualidade</li>\n</ol>\n<h4>Ferramentas com IA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Capacidades IA</th><th>Integração</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Débito técnico, code smells</td><td>CI/CD</td></tr>\n<tr><td><strong>Snyk</strong></td><td>Vulnerabilidades, licenças</td><td>IDE, CI</td></tr>\n<tr><td><strong>CodeClimate</strong></td><td>Quality, maintainability</td><td>GitHub</td></tr>\n<tr><td><strong>DeepSource</strong></td><td>Análise estática com ML</td><td>Git</td></tr>\n</table></figure>\n\n<h3>5. Testes Visuais Automatizados</h3>\n\n<p>Comparação de interfaces visuais usando visão computacional para detectar regressões.</p>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Página Capturada → Modelo de Visão Computacional → Comparação com Baseline\n     ↓                          ↓                                    ↓\n  Screenshots           Detecção de Elementos           Diff Visual\n                                            ↓\n                                    Alertas de Regressão\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tecnologia</th><th>Diferencial</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Visual AI</td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de precisão</td></tr>\n<tr><td><strong> Percy</strong></td><td>Visual testing</td><td>Integração simples</td></tr>\n<tr><td><strong>Chromatic</strong></td><td>Visual regression</td><td>Para Storybook</td></tr>\n<tr><td><strong>Lost Pixel</strong></td><td>Open source</td><td>Self-hosted</td></tr>\n</table></figure>\n\n<h3>6. Oráculos de Teste Baseados em IA</h3>\n\n<p>Validação de resultados usando modelos treinados para determinar se o comportamento está correto.</p>\n\n<h4>Tipos de Oráculos</h4>\n<ol><li><strong>Oráculo de Imagem</strong> - Validação visual de UI</li>\n<li><strong>Oráculo de Texto</strong> - Análise de conteúdo</li>\n<li><strong>Oráculo de Comportamento</strong> - Detecção de anomalias</li>\n<li><strong>Oráculo de Dados</strong> - Validação de datasets</li>\n</ol>\n<hr>\n<h2>Ferramentas de IA para QA: Comparativo</h2>\n\n<h3>Plataformas Completas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Testim</strong></td><td>Automação inteligente E2E</td><td>$600+/mês</td><td>Equipes enterprise</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Automação com ML</td><td>Sob consulta</td><td>Escala enterprise</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>$500+/mês</td><td>CI/CD integrado</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>No-code com IA</td><td>Sob consulta</td><td>Enterprise</td></tr>\n<tr><td><strong>Perfecto</strong></td><td>Testes mobile/web com IA</td><td>Sob consulta</td><td>Mobile testing</td></tr>\n</table></figure>\n\n<h3>Ferramentas Especializadas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais</td><td>$100+/mês</td><td>UI testing</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Unit tests</td><td>$299/assinante</td><td>Dev teams</td></tr>\n<tr><td><strong>Snyk</strong></td><td>SCA</td><td>Grátis + Pro</td><td>Developers</td></tr>\n<tr><td><strong>SonarCloud</strong></td><td>SAST</td><td>Grátis + Pro</td><td>CI/CD</td></tr>\n</table></figure>\n\n<h3>Ferramentas Emerging (2025-2026)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Status</th></tr>\n<tr><td><strong>CodiumAI</strong></td><td>Testes gerados automaticamente</td><td>Beta</td></tr>\n<tr><td><strong>Mutable AI</strong></td><td>Code review + tests</td><td>Beta</td></tr>\n<tr><td><strong>Dagger</strong></td><td>CI/CD programável</td><td>GA</td></tr>\n<tr><td><strong>Trunk</strong></td><td>Linting inteligente</td><td>GA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando IA em QA: Roadmap Prático</h2>\n\n<h3>Fase 1: Avaliação e Planejamento (1-2 meses)</h3>\n\n<h4>Checklist de Avaliação</h4>\n<ol><li>[ ] Mapeamento de processos atuais de QA</li>\n<li>[ ] Identificação de pontos de dor</li>\n<li>[ ] Análise de ROI potencial</li>\n<li>[ ] Avaliação de maturidade tecnológica</li>\n<li>[ ] Levantamento de stakeholders</li>\n</ol>\n<h4>Métricas de Baseline</h4>\n\n<p>Antes de implementar, estabeleça métricas de referência:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Ferramenta</th></tr>\n<tr><td>Tempo de teste</td><td>Duração de suite</td><td>CI/CD logs</td></tr>\n<tr><td>Cobertura de teste</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>Coverage tools</td></tr>\n<tr><td>Taxa de defeitos</td><td>Bugs em produção</td><td>Bug tracker</td></tr>\n<tr><td>Testes flaky</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas instáveis</td><td>CI/CD</td></tr>\n<tr><td>Custo de QA</td><td>$/teste executado</td><td>Financeiro</td></tr>\n</table></figure>\n\n<h3>Fase 2: Pilot (2-3 meses)</h3>\n\n<h4>Escolha do Piloto</h4>\n\n<p>Selecione um projeto ou área com:<br><ol><li>✅ Escopo controlado</li><br><li>✅ Equipe aberta a inovação</li><br><li>✅ Processos definidos</li><br><li>✅ Métricas disponíveis</li><br></ol><br><h4>Pilotos Recomendados</h4><br><ol><li><strong>Geração de unit tests</strong> - Diffblue, CodiumAI</li><br><li><strong>Testes visuais</strong> - Applitools</li><br><li><strong>Detecção de flaky tests</strong> - Ferramentas de CI</li><br><li><strong>Análise estática</strong> - SonarQube, Snyk</li><br></ol><br><h3>Fase 3: Expansão (3-6 meses)</h3></p>\n\n<h4>Escalar Sucesso</h4>\n<ol><li>Documente aprendizados</li>\n<li>Treine outras equipes</li>\n<li>Padronize processos</li>\n<li>Melhore integrações</li>\n</ol>\n<h4>KPIs de Sucesso</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Meta (6 meses)</th></tr>\n<tr><td>Redução de tempo de teste</td><td>30-40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Aumento de cobertura</td><td>20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de defeitos em prod</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>ROI positivo</td><td>Sim</td></tr>\n</table></figure>\n\n<h3>Fase 4: Maturidade (6-12 meses)</h3>\n\n<h4>Implementação Enterprise</h4>\n<ol><li>Integração completa com CI/CD</li>\n<li>IA em produção (monitoramento)</li>\n<li>Maintenance automatizado</li>\n<li>Reporting avançado</li>\n</ol>\n<hr>\n<h2>Futuro da IA em QA: Tendências 2026-2028</h2>\n\n<h3>1. Testes Autônomos</h3>\n\n<p>Sistemas que automaticamente:<br><ol><li>Geram testes baseados em requisitos</li><br><li>Executam testes continuamente</li><br><li>Detectam e reportam falhas</li><br><li>Propõem correções</li><br></ol><br><h3>2. Manutenção Preditiva</h3></p>\n\n<p>IA que prevê:<br><ol><li>Quando testes vão falhar</li><br><li>Quando código precisa de mais testes</li><br><li>Quando componentes estão em risco</li><br><li>Quando fazer refactoring</li><br></ol><br><h3>3. GenAI Nativa em QA</h3></p>\n\n<p>Modelos treinados especificamente para:<br><ol><li>Entender código e testes</li><br><li>Gerar código de teste</li><br><li>Analisar requisitos</li><br><li>Documentar testes</li><br></ol><br><h3>4. Testes em Produção com IA</h3></p>\n\n<p>Monitoramento inteligente:<br><ol><li>Detecção de anomalias em produção</li><br><li>Geração automática de testes de regressão</li><br><li>Validação de deployments</li><br><li>Root cause analysis</li><br></ol><br><hr><br><h2>Considerações Éticas e Best Practices</h2></p>\n\n<h3>Governança de IA em QA</h3>\n\n<h4>Princípios</h4>\n<ol><li><strong>Transparência</strong> - Documente como a IA toma decisões</li>\n<li><strong>Responsabilidade</strong> - Humanos mantêm responsabilidade final</li>\n<li><strong>Fairness</strong> - Evite viés em modelos</li>\n<li><strong>Privacidade</strong> - Proteja dados sensíveis</li>\n<li><strong>Segurança</strong> - Proteja modelos contra ataques</li>\n</ol>\n<h4>Checklist de Governança</h4>\n<ol><li>[ ] Política de uso de IA em QA documentada</li>\n<li>[ ] Processos de revisão de decisões de IA</li>\n<li>[ ] Documentação de modelos utilizados</li>\n<li>[ ] Plano de contingência para falhas de IA</li>\n<li>[ ] Treinamento de equipe em uso responsável</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A IA está transformando fundamentalmente a QA, oferecendo oportunidades sem precedentes para aumentar eficiência, cobertura e qualidade. Embora a adoção em escala ainda seja um desafio, organizações que investem estrategicamente em IA para QA estão obtendo vantagens competitivas significativas.</p>\n\n<p><strong>Resumo dos Principais Aprendizados:</strong></p>\n\n<p>✅ IA pode reduzir tempo de teste em 40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}  <br>✅ GenAI está sendo buscada por 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações, mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram em escala  <br>✅ Ferramentas como Playwright, Applitools e Testim estão liderando a adoção  <br>✅ Implementação requer estratégia, não apenas ferramentas  <br>✅ Futuro aponta para testes autônomos e manutenção preditiva</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem toda organização precisa de todas as capacidades</li><br><li><strong>Comece pequeno</strong> - Pilotos controlados são mais eficazes</li><br><li><strong>Meça resultados</strong> - Métricas são essenciais</li><br><li><strong>Treine sua equipe</strong> - Competências em IA são necessárias</li><br><li><strong>Governarize</strong> - Adote práticas éticas desde o início</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre IA em QA</h3></p>\n\n<p><strong>P: A IA vai substituir testadores humanos?</strong>  <br>R: Não. A IA complementa o trabalho humano, permitindo que testadores foquem em atividades estratégicas, exploratory testing e design de testes.</p>\n\n<p><strong>P: Qual é o ROI da implementação de IA em QA?</strong>  <br>R: O ROI típico é de 200-500{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em 12-18 meses, considerando redução de tempo de teste, aumento de cobertura e redução de defeitos em produção.</p>\n\n<p><strong>P: Preciso de especialistas em dados para implementar IA em QA?</strong>  <br>R: Não necessariamente. Muitas ferramentas são \"plug-and-play\" e não requerem conhecimento de ML. No entanto, para implementações avançadas, especialistas são úteis.</p>\n\n<p><strong>P: Quais são os principais riscos do uso de IA em QA?</strong>  <br>R: Os principais riscos incluem: dependência excessiva, viés em modelos, falta de transparência e custos inesperados de manutenção.</p>\n\n<p><strong>P: Quando devo começar a usar IA em QA?</strong>  <br>R: Se você tem mais de 100 testes automatizados ou gastando mais de 20 horas/semana em QA, é um bom momento para avaliar ferramentas de IA.</p>\n\n<hr>\n<em>Fonte: World Quality Report 2025, Software Testing Magazine, Gartner Research, IEEE Software</em>', 'Inteligência Artificial em Quality Assurance: Guia Completo para 2025-2026', '', 'inherit', 'closed', 'closed', '', '181-revision-v1', '', '', '2026-07-06 22:51:40', '2026-07-07 01:51:40', '', '181', 'http://localhost:8082/ideiasti/?p=456', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('457', '0', '2026-07-06 22:52:03', '2026-07-07 01:52:03', '<h2>Artigos Principais</h2>\n<ol><li><a href=\"01_introducao_qualidade_software.md\">Introdução à Qualidade de Software</a> - Fundamentos de QA, importância e objetivos</li>\n<li><a href=\"02_tendencias_qa_2025.md\">Tendências de QA para 2025</a> - IA, automação, shift-left e mais</li>\n<li><a href=\"03_tipos_testes_software.md\">Tipos de Testes de Software</a> - Unitários, integração, sistema, aceitação</li>\n<li><a href=\"04_benchmark_frameworks.md\">Benchmark de Frameworks</a> - Playwright vs Cypress vs Selenium</li>\n<li><a href=\"05_inteligencia_artificial_qa.md\">Inteligência Artificial em QA</a> - GenAI, automação inteligente</li>\n<li><a href=\"06_conclusao.md\">Conclusão</a> - Síntese e recomendações</li>\n</ol>\n<h2>Automação de Testes</h2>\n<ol><li><a href=\"07_automacao_testes.md\">Automação de Testes</a> - Estratégias e frameworks</li>\n<li><a href=\"08_testes_ageis.md\">Testes Ágeis</a> - Scrum, Kanban e XP</li>\n<li><a href=\"09_testes_performance.md\">Testes de Performance</a> - Load testing e stress testing</li>\n<li><a href=\"10_testes_seguranca.md\">Testes de Segurança</a> - OWASP, penetration testing</li>\n<li><a href=\"11_devops_qa.md\">DevOps e QA</a> - CI/CD com qualidade integrada</li>\n<li><a href=\"12_testes_mobile.md\">Testes Mobile</a> - Appium, Espresso, XCTest</li>\n</ol>\n<h2>Metodologias e Práticas</h2>\n<ol><li><a href=\"13_tdd.md\">Test-Driven Development (TDD)</a> - Ciclo RED-GREEN-REFACTOR</li>\n<li><a href=\"14_bdd.md\">Behavior-Driven Development (BDD)</a> - Gherkin e Cucumber</li>\n<li><a href=\"15_testes_api.md\">Testes de API</a> - REST, GraphQL, microservices</li>\n<li><a href=\"16_exploratory_testing.md\">Exploratory Testing</a> - Testes sem roteiro</li>\n<li><a href=\"17_testes_usabilidade.md\">Testes de Usabilidade</a> - UX e heurísticas</li>\n<li><a href=\"18_testes_regressao.md\">Testes de Regressão</a> - Estratégias de manutenção</li>\n</ol>\n<h2>Metodologias Ágeis</h2>\n<ol><li><a href=\"19_agile_qa.md\">Metodologias Ágeis e QA</a> - Scrum, Kanban e XP na prática</li>\n</ol>\n<h2>Testes de Banco de Dados e Integração</h2>\n<ol><li><a href=\"20_testes_banco_dados.md\">Testes de Banco de Dados</a> - SQL, NoSQL, integridade</li>\n<li><a href=\"21_testes_integracao.md\">Testes de Integração</a> - APIs, serviços, microsserviços</li>\n</ol>\n<h2>Técnicas Avançadas</h2>\n<ol><li><a href=\"22_mutation_testing.md\">Mutation Testing</a> - Avaliando qualidade dos testes</li>\n<li><a href=\"23_visual_testing.md\">Visual Regression Testing</a> - Screenshots comparison</li>\n<li><a href=\"24_selenium_webdriver.md\">Selenium WebDriver</a> - Guia completo de automação web</li>\n</ol>\n<h2>APIs e DevOps</h2>\n<ol><li><a href=\"25_api_rest.md\">API REST</a> - Design e boas práticas</li>\n<li><a href=\"26_cicd_qa.md\">CI/CD para QA</a> - Pipelines com qualidade</li>\n<li><a href=\"27_testes_load.md\">Testes de Load/Stress</a> - JMeter, k6, Gatling</li>\n</ol>\n<h2>Infraestrutura e Monitoramento</h2>\n<ol><li><a href=\"28_kubernetes_qa.md\">Kubernetes e QA</a> - Testes em containers</li>\n<li><a href=\"29_monitoramento_qualidade.md\">Monitoramento de Qualidade</a> - Métricas e dashboards</li>\n<li><a href=\"30_gitops_qa.md\">GitOps e Qualidade</a> - Infraestrutura como código</li>\n</ol>\n<h2>Containers e Acessibilidade</h2>\n<ol><li><a href=\"31_docker_qa.md\">Docker para QA</a> - Containers para testes</li>\n<li><a href=\"32_testes_acessibilidade.md\">Testes de Acessibilidade</a> - WCAG e inclusão</li>\n</ol>\n<h2>Técnicas e Ferramentas</h2>\n<ol><li><a href=\"33_chaos_engineering.md\">Chaos Engineering</a> - Testando resiliência</li>\n<li><a href=\"34_fakes_mocks.md\">Fake Services e Mocking</a> - Isolando dependências</li>\n<li><a href=\"35_testcontainers.md\">Testcontainers</a> - Ambientes Docker para testes</li>\n</ol>\n<h2>Segurança e Testes E2E</h2>\n<ol><li><a href=\"36_security_testing.md\">Security Testing</a> - OWASP, SAST, DAST</li>\n<li><a href=\"37_e2e_testing.md\">Testes E2E</a> - Playwright, Cypress, Selenium</li>\n<li><a href=\"38_cucumber_gherkin.md\">Cucumber e Gherkin</a> - BDD na prática</li>\n<li><a href=\"39_contract_testing.md\">Testes de Contrato</a> - Pact e consumer-driven</li>\n</ol>\n<h2>Métricas e Continuous Testing</h2>\n<ol><li><a href=\"40_qa_metrics.md\">Métricas de QA</a> - KPIs e dashboards</li>\n<li><a href=\"41_continuous_testing.md\">Continuous Testing</a> - Automação total no pipeline</li>\n</ol>\n<hr>\n<h2>Referências de Imagens</h2>\n\n<ul><li><a href=\"referencias_imagens/referencias_imagens.md\">Referências de Imagens</a></li></ul>\n\n<hr>\n<em>Este guia faz parte de uma série completa sobre Qualidade de Software e QA para 2025-2026</em>', 'Índice - Guia Completo de Qualidade de Software e QA', '', 'publish', 'open', 'open', '', '00indice', '', '', '2026-07-06 22:52:03', '2026-07-07 01:52:03', '', '0', 'http://localhost:8082/ideiasti/00indice/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('458', '0', '2026-07-06 22:52:03', '2026-07-07 01:52:03', '<p>Este é o seu novo <em>Cofre</em>.</p>\n\n<p>Anote algo, <a href=\"https://help.obsidian.md/Plugins/Importer\">[crie um link]], ou tente [o Importer</a>!</p>\n\n<p>Quando estiver pronto, exclua esta nota e monte o cofre do seu jeito.</p>', 'Bem-vindo', '', 'publish', 'open', 'open', '', 'bem-vindo', '', '', '2026-07-06 22:52:03', '2026-07-07 01:52:03', '', '0', 'http://localhost:8082/ideiasti/bem-vindo/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('459', '0', '2026-07-06 22:52:03', '2026-07-07 01:52:03', '<p><!-- wp:image {\"align\":\"center\",\"sizeSlug\":\"large\"} --><br><figure class=\"wp-block-image size-large aligncenter\"><img src=\"https://media.giphy.com/media/l0HlHJGHe3yAMjfFC/giphy.gif\" alt=\"Blog QA Brasil - Índice Completo\" /></figure><br><!-- /wp:image --></p>\n\n<p>Bem-vindo ao índice completo do <strong>Blog QA Brasil</strong>. Aqui você encontra todos os nossos artigos organizados por categoria para facilitar sua navegação e aprendizado.</p>\n\n<hr>\n<h2>Fundamentos de Qualidade de Software</h2>\n\n<h3>Artigos Essenciais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/01_introducao_qualidade_software\">01 - Introdução à Qualidade de Software</a></td><td>Fundamentos de QA, importância e objetivos</td></tr>\n<tr><td><a href=\"/02_tendencias_qa_2025\">02 - Tendências de QA 2025</a></td><td>IA, automação, shift-left e mais</td></tr>\n<tr><td><a href=\"/03_tipos_testes_software\">03 - Tipos de Testes de Software</a></td><td>Unitários, integração, sistema, aceitação</td></tr>\n<tr><td><a href=\"/04_benchmark_frameworks\">04 - Benchmark de Frameworks</a></td><td>Playwright vs Cypress vs Selenium</td></tr>\n<tr><td><a href=\"/05_inteligencia_artificial_qa\">05 - Inteligência Artificial em QA</a></td><td>GenAI, automação inteligente</td></tr>\n</table></figure>\n\n<hr>\n<h2>Automação de Testes</h2>\n\n<h3>Frameworks e Ferramentas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/07_automacao_testes\">07 - Automação de Testes</a></td><td>Estratégias e frameworks</td></tr>\n<tr><td><a href=\"/24_selenium_webdriver\">24 - Selenium WebDriver</a></td><td>Guia completo de automação web</td></tr>\n<tr><td><a href=\"/23_visual_testing\">23 - Visual Testing</a></td><td>Comparação de screenshots</td></tr>\n<tr><td><a href=\"/38_e2e_testing\">37 - E2E Testing</a></td><td>Playwright, Cypress, Selenium</td></tr>\n<tr><td><a href=\"/34_cucumber_gherkin\">38 - Cucumber e Gherkin</a></td><td>BDD na prática</td></tr>\n</table></figure>\n\n<h3>Metodologias de Automação</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/13_tdd\">13 - TDD</a></td><td>Ciclo RED-GREEN-REFACTOR</td></tr>\n<tr><td><a href=\"/14_bdd\">14 - BDD</a></td><td>Gherkin e Cucumber</td></tr>\n<tr><td><a href=\"/22_mutation_testing\">22 - Mutation Testing</a></td><td>Avaliando qualidade dos testes</td></tr>\n</table></figure>\n\n<hr>\n<h2>Testes por Tipo</h2>\n\n<h3>Testes Funcionais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/15_testes_api\">15 - Testes de API</a></td><td>REST, GraphQL, microservices</td></tr>\n<tr><td><a href=\"/20_testes_banco_dados\">20 - Testes de Banco de Dados</a></td><td>SQL, NoSQL, integridade</td></tr>\n<tr><td><a href=\"/21_testes_integracao\">21 - Testes de Integração</a></td><td>APIs, serviços, microsserviços</td></tr>\n</table></figure>\n\n<h3>Testes Não-Funcionais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/09_testes_performance\">09 - Testes de Performance</a></td><td>Load testing e stress testing</td></tr>\n<tr><td><a href=\"/27_testes_load\">27 - Testes de Load/Stress</a></td><td>JMeter, k6, Gatling</td></tr>\n<tr><td><a href=\"/10_testes_seguranca\">10 - Testes de Segurança</a></td><td>OWASP, penetration testing</td></tr>\n<tr><td><a href=\"/17_testes_usabilidade\">17 - Testes de Usabilidade</a></td><td>UX e heurísticas</td></tr>\n</table></figure>\n\n<h3>Testes Especiais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/12_testes_mobile\">12 - Testes Mobile</a></td><td>Appium, Espresso, XCTest</td></tr>\n<tr><td><a href=\"/16_exploratory_testing\">16 - Exploratory Testing</a></td><td>Testes sem roteiro</td></tr>\n<tr><td><a href=\"/19_testes_acessibilidade\">19 - Testes de Acessibilidade</a></td><td>WCAG e inclusão</td></tr>\n<tr><td><a href=\"/32_testes_acessibilidade\">32 - Accessibility Testing</a></td><td>Acessibilidade e inclusão</td></tr>\n</table></figure>\n\n<hr>\n<h2>Metodologias Ágeis e DevOps</h2>\n\n<h3>Metodologias</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/08_testes_ageis\">08 - Testes Ágeis</a></td><td>Scrum, Kanban e XP</td></tr>\n<tr><td><a href=\"/19_agile_qa\">19 - Agile QA</a></td><td>Scrum, Kanban e XP na prática</td></tr>\n</table></figure>\n\n<h3>DevOps e CI/CD</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/11_devops_qa\">11 - DevOps e QA</a></td><td>CI/CD com qualidade integrada</td></tr>\n<tr><td><a href=\"/16_cicd_qa\">26 - CI/CD para QA</a></td><td>Pipelines com qualidade</td></tr>\n<tr><td><a href=\"/40_continuous_testing\">40 - Continuous Testing</a></td><td>Automação total no pipeline</td></tr>\n</table></figure>\n\n<hr>\n<h2>Infraestrutura e Containers</h2>\n\n<h3>Containers</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/31_docker_qa\">31 - Docker para QA</a></td><td>Containers para testes</td></tr>\n<tr><td><a href=\"/36_testcontainers\">35 - Testcontainers</a></td><td>Ambientes Docker para testes</td></tr>\n</table></figure>\n\n<h3>Orquestração</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/28_kubernetes_qa\">28 - Kubernetes e QA</a></td><td>Testes em containers</td></tr>\n<tr><td><a href=\"/30_gitops_qa\">30 - GitOps e Qualidade</a></td><td>Infraestrutura como código</td></tr>\n</table></figure>\n\n<hr>\n<h2>Técnicas Avançadas</h2>\n\n<h3>Engenharia de Caos e Resiliência</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/33_chaos_engineering\">33 - Chaos Engineering</a></td><td>Testando resiliência</td></tr>\n<tr><td><a href=\"/34_fakes_mocks\">34 - Fakes, Mocks e Stubbing</a></td><td>Isolando dependências</td></tr>\n</table></figure>\n\n<h3>Testes de Contrato</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/35_contract_testing\">39 - Contract Testing</a></td><td>Pact e consumer-driven</td></tr>\n<tr><td><a href=\"/25_api_rest\">25 - API REST</a></td><td>Design e boas práticas</td></tr>\n</table></figure>\n\n<hr>\n<h2>Monitoramento e Métricas</h2>\n\n<h3>Métricas de Qualidade</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/39_qa_metrics\">39 - Métricas de QA</a></td><td>KPIs e dashboards</td></tr>\n<tr><td><a href=\"/29_monitoramento_qualidade\">29 - Monitoramento de Qualidade</a></td><td>Métricas e dashboards</td></tr>\n</table></figure>\n\n<hr>\n<h2>Testes de Regressão</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/18_testes_regressao\">18 - Testes de Regressão</a></td><td>Estratégias de manutenção</td></tr>\n</table></figure>\n\n<hr>\n<h2>Páginas Institucionais</h2>\n\n<h3>Links Úteis</h3>\n\n<ul><li><a href=\"/\">Página Inicial</a> - Home do Blog QA Brasil</li><ol><li><a href=\"/sobre\">Sobre Nós</a> - Conheça nossa história e missão</li>\n<li><a href=\"/politica-de-privacidade\">Política de Privacidade</a> - LGPD e proteção de dados</li>\n<li><a href=\"/termos-de-uso\">Termos de Uso</a> - Condições de uso do site</li>\n</ol>\n<hr>\n<h2>Navegação por Tags</h2>\n\n<p><!-- wp:tag-cloud --></p>\n\n<p>Explore artigos por tema:<br><ol><li><strong>#automacao</strong> - Automação de testes</li><br><li><strong>#tdd</strong> - Test-Driven Development</li><br><li><strong>#bdd</strong> - Behavior-Driven Development</li><br><li><strong>#devops</strong> - DevOps e CI/CD</li><br><li><strong>#seguranca</strong> - Testes de segurança</li><br><li><strong>#performance</strong> - Testes de performance</li><br><li><strong>#mobile</strong> - Testes mobile</li><br><li><strong>#ia</strong> - Inteligência Artificial em QA</li><br><li><strong>#docker</strong> - Containers e Docker</li><br><li><strong>#kubernetes</strong> - Kubernetes e orquestração</li><br></ol><br><!-- /wp:tag-cloud --></p>\n\n<hr>\n<h2>Artigos Recentes</h2>\n<ol><li><strong>Introdução à Qualidade de Software</strong> - Fundamentos e conceitos essenciais</li>\n<li><strong>Tendências de QA para 2025</strong> - O futuro dos testes de software</li>\n<li><strong>Tipos de Testes de Software</strong> - Guia completo sobre metodologias</li>\n<li><strong>Benchmark de Frameworks</strong> - Comparativo Playwright vs Cypress vs Selenium</li>\n<li><strong>Inteligência Artificial em QA</strong> - GenAI e automação inteligente</li>\n</ol>\n<hr>\n<h2>Buscar Artigos</h2>\n\n<h3>Busque por Palavra-Chave</h3>\n\n<p>Use o campo de busca do site para encontrar artigos específicos:<br><ol><li><strong>Exemplos de busca:</strong> \"automação\", \"Selenium\", \"API\", \"performance\", \"BDD\", \"Docker\"</li><br></ol><br><h3>Browse por Categoria</h3></p>\n\n<p>Selecione uma categoria no menu para ver todos os artigos relacionados:<br><ol><li>Fundamentos</li><br><li>Automação</li><br><li>DevOps</li><br><li>Segurança</li><br><li>Performance</li><br><li>Mobile</li><br><li>Tendências</li></ol></ul></p>\n\n<hr>\n<h2>Newsletter</h2>\n\n<p><!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|50\",\"bottom\":\"var:preset|spacing|50\",\"left\":\"var:preset|spacing|50\",\"right\":\"var:preset|spacing|50\"}},\"border\":{\"radius\":\"10px\"}},\"backgroundColor\":\"primary\",\"textColor\":\"white\",\"className\":\"has-white-color has-primary-background-color has-text-color has-background\"} --><br><div class=\"wp-block-group alignwide has-white-color has-primary-background-color has-text-color has-background\" style=\"border-radius:10px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)\"><!-- wp:paragraph --><br><p><strong>📧 Receba novos artigos por e-mail</strong><br /><br>Inscreva-se na newsletter e receba os melhores conteúdos sobre Qualidade de Software diretamente na sua caixa de entrada.</p><br><!-- /wp:paragraph --></div><br><!-- /wp:group --></p>\n\n<hr>\n<h2>Total de Artigos</h2>\n\n<p>Nosso blog conta com <strong>40+ artigos</strong> organizados em <strong>10+ categorias</strong> cobrindo todos os aspectos de Quality Assurance e Testes de Software.</p>\n\n<hr>\n<h2>Comece Por Aqui</h2>\n\n<h3>Para Iniciantes</h3>\n<ol><li><a href=\"/01_introducao_qualidade_software\">Introdução à Qualidade de Software</a></li>\n<li><a href=\"/03_tipos_testes_software\">Tipos de Testes de Software</a></li>\n<li><a href=\"/07_automacao_testes\">Automação de Testes</a></li>\n</ol>\n<h3>Para Intermediários</h3>\n<ol><li><a href=\"/13_tdd\">Test-Driven Development (TDD)</a></li>\n<li><a href=\"/14_bdd\">Behavior-Driven Development (BDD)</a></li>\n<li><a href=\"/15_testes_api\">Testes de API</a></li>\n<li><a href=\"/11_devops_qa\">DevOps e QA</a></li>\n</ol>\n<h3>Para Avançados</h3>\n<ol><li><a href=\"/05_inteligencia_artificial_qa\">Inteligência Artificial em QA</a></li>\n<li><a href=\"/28_kubernetes_qa\">Kubernetes e QA</a></li>\n<li><a href=\"/33_chaos_engineering\">Chaos Engineering</a></li>\n<li><a href=\"/40_continuous_testing\">Continuous Testing</a></li>\n</ol>\n<hr>\n<em>Índice atualizado em Janeiro de 2025</em>\n\n<p><em>Todos os direitos reservados - Blog QA Brasil</em></p>', 'Blog QA Brasil - Índice Completo', '', 'publish', 'open', 'open', '', 'indice', '', '', '2026-07-06 22:52:03', '2026-07-07 01:52:03', '', '0', 'http://localhost:8082/ideiasti/indice/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('460', '0', '2026-07-06 22:52:07', '2026-07-07 01:52:07', '', 'giphy-6', '', 'inherit', 'open', 'closed', '', 'giphy-6', '', '', '2026-07-06 22:52:07', '2026-07-07 01:52:07', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-6.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('461', '0', '2026-07-06 22:52:08', '2026-07-07 01:52:08', '<p><strong>Meta Description:</strong> Conheça todos os tipos de testes de software: funcionais, não-funcionais, unitários, integração, sistema e mais. Guia completo com definições, objetivos e melhores práticas.</p>\n\n<hr>\n<h2>Introdução aos Tipos de Testes de Software</h2>\n\n<p>Os testes de software são uma atividade crítica no ciclo de desenvolvimento de sistemas. Compreender os diferentes tipos de testes e quando aplicá-los é fundamental para garantir a qualidade e confiabilidade das aplicações.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-6.gif\" alt=\"Pirâmide de Testes - Hierarquia de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este guia completo apresenta uma categorização detalhada dos principais tipos de testes de software, suas finalidades, características e quando cada um deve ser utilizado no seu projeto.</p>\n\n<hr>\n<h2>Categorização Geral dos Testes</h2>\n\n<p>Os testes de software podem ser divididos em duas categorias principais:</p>\n\n<h3>1. Testes Funcionais</h3>\n\n<p>Verificam se o software funciona conforme especificado, testando funcionalidades específicas e requisitos do negócio.</p>\n\n<h3>2. Testes Não-Funcionais</h3>\n\n<p>Avaliam características como performance, segurança, usabilidade e confiabilidade, que não estão relacionadas a funcionalidades específicas.</p>\n\n<hr>\n<h2>Testes Funcionais: Garantindo o Comportamento Correto</h2>\n\n<h3>Teste Unitário: A Base de Tudo</h3>\n\n<p>O teste unitário é o tipo mais básico de teste, onde cada unidade de código (geralmente uma função ou método) é testada isoladamente. Esta atividade é realizada durante as etapas de desenvolvimento pelos próprios desenvolvedores.</p>\n\n<h4>Objetivos dos Testes Unitários</h4>\n\n<ul><li><strong>Identificar falhas em componentes individuais</strong> - Detectar problemas cedo</li><ol><li><strong>Garantir que cada função trabalha corretamente</strong> - Validação granular</li>\n<li><strong>Facilitar a detecção precoce de defeitos</strong> - Redução de custos</li>\n<li><strong>Documentar o código</strong> - Testes como especificação executável</li>\n<li><strong>Permitir refactoring seguro</strong> - Confiança ao modificar código</li>\n</ol>\n<h4>Exemplo Prático em Python (pytest)</h4>\n\n<pre><code>def calcular_desconto(valor_original, percentual):\n    \"\"\"Calcula o valor do desconto.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual deve estar entre 0 e 100\")\n    desconto = valor_original * (percentual / 100)\n    return valor_original - desconto\n\n<p>def test_calcular_desconto_10_porcento():<br>    assert calcular_desconto(100, 10) == 90</p>\n\n<p>def test_calcular_desconto_50_porcento():<br>    assert calcular_desconto(200, 50) == 100</p>\n\n<p>def test_calcular_desconto_invalido():<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 150)<br></code></pre></p>\n\n<h4>Frameworks Populares para Testes Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Framework</th><th>Características</th></tr>\n<tr><td>Java</td><td>JUnit 5, TestNG</td><td>Mais popular, extensível</td></tr>\n<tr><td>JavaScript</td><td>Jest, Mocha</td><td>Rápido, Mocking fácil</td></tr>\n<tr><td>Python</td><td>pytest, unittest</td><td>Sintaxe simples, fixtures</td></tr>\n<tr><td>C#</td><td>xUnit, NUnit</td><td>.NET ecosystem</td></tr>\n<tr><td>Go</td><td>testing (stdlib)</td><td>Simples, integrado</td></tr>\n</table></figure>\n\n<h4>Melhores Práticas para Testes Unitários</h4>\n\n<p>✅ <strong>Teste apenas uma coisa de cada vez</strong> - Um assert por teste é ideal  <br>✅ <strong>Nomes descritivos</strong> - <code>test_deve_retornar_erro_quando_usuario_invalido</code>  <br>✅ <strong>Independência</strong> - Testes não devem depender uns dos outros  <br>✅ <strong>Rapidez</strong> - Unit tests devem executar em milissegundos  <br>✅ <strong>Isolamento</strong> - Use mocks para dependências externas</p>\n\n<hr>\n<h3>Teste de Integração: Verificando Conexões</h3>\n\n<p>O teste de integração verifica a comunicação entre diferentes módulos ou componentes do sistema. Este tipo de teste é crucial para garantir que as partes do sistema funcionam corretamente quando combinadas.</p>\n\n<h4>Características Principais</h4>\n<ol><li><strong>Valida interfaces e interações entre componentes</strong> - Fluxo de dados correto</li>\n<li><strong>Identifica problemas de comunicação</strong> - API mismatches, protocolos</li>\n<li><strong>Pode ser realizado de forma incremental ou big-bang</strong> - Duas abordagens</li>\n<li><strong>Testa camadas de persistência</strong> - Bancos de dados, APIs externas</li>\n</ol>\n<h4>Estratégias de Integração</h4>\n\n<p>##### 1. Big-Bang Integration</p>\n\n<p>Todos os componentes são integrados simultaneamente e testados juntos.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Simples de implementar</li><br><li>Bom para sistemas pequenos</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Difícil localização de erros</li><br><li>Todos os módulos devem estar prontos</li><br></ol><br>##### 2. Incremental Integration (Bottom-Up)</p>\n\n<p>Começa pelos módulos mais baixos e集成 progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Defeitos fáceis de isolar</li><br><li>Feedback contínuo</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode ter módulos de alto nível sem testes até o final</li><br></ol><br>##### 3. Incremental Integration (Top-Down)</p>\n\n<p>Começa pelos módulos de mais alto nível e desce progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Interface do usuário testada primeiro</li><br><li>Protótipo funcional rápido</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Módulos de baixo nível simulados (stubs)</li><br></ol><br><h4>Exemplo de Teste de Integração (REST API)</h4></p>\n\n<pre><code>import requests\nimport pytest\n\n<p>class TestUserAPI:<br>    BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>def test_criar_usuario(self):<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"senha123\"<br>        }<br>        response = requests.post(f\"{self.BASE_URL}/usuarios\", json=payload)</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data</p>\n\n<p>def test_listar_usuarios(self):<br>        response = requests.get(f\"{self.BASE_URL}/usuarios\")</p>\n\n<p>assert response.status_code == 200<br>        assert isinstance(response.json(), list)<br></code></pre></p>\n\n<hr>\n<h3>Teste de Sistema: Visão Holística</h3>\n\n<p>O teste de sistema avalia o software como um todo, verificando se todos os componentes funcionam juntos para atender aos requisitos definidos.</p>\n\n<h4>O Que é Testado no Nível de Sistema?</h4>\n<ol><li><strong>Integração entre todos os módulos</strong></li>\n<li><strong>Fluxos de negócio completos</strong></li>\n<li><strong>Conformidade com requisitos funcionais</strong></li>\n<li><strong>Interface com sistemas externos</strong></li>\n<li><strong>Performance do sistema integrado</strong></li>\n<li><strong>Segurança end-to-end</strong></li>\n</ol>\n<h4>Exemplo: Fluxo de E-commerce</h4>\n\n<pre><code>Usuário → Login → Navegação → Carrinho → Checkout → Pagamento → Confirmação\n    ↓         ↓          ↓           ↓           ↓            ↓            ↓\n Cadastro   Session   Produtos    Estoque     Frete        Stripe     E-mail\n   ↕          ↕         ↕          ↕          ↕            ↕          ↕\n  DB        Redis     DB/API     DB         Correios      API       SMTP\n</code></pre>\n\n<p>Cada seta representa um ponto de integração que deve ser testado no nível de sistema.</p>\n\n<hr>\n<h3>Teste de Aceitação: Validando com o Cliente</h3>\n\n<p>O teste de aceitação determina se um produto ou sistema atende às expectativas e requisitos do cliente. Este é frequentemente o último nível de teste antes da entrega正式.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto certo?\"</strong></p>\n\n<h4>Tipos de Teste de Aceitação</h4>\n\n<p>##### 1. Teste de Aceitação do Usuário (UAT)</p>\n\n<p>Usuários finais testam o sistema em um ambiente semelhante ao de produção.</p>\n\n<p>##### 2. Teste de Aceitação Operacional (OAT)</p>\n\n<p>Equipe de operações validabackup, recuperação, relatórios.</p>\n\n<p>##### 3. Teste de Aceitação Contratual</p>\n\n<p>Verifica se o sistema atende aos critérios contratuais.</p>\n\n<h4>Características do UAT</h4>\n<ol><li>Geralmente envolve cooperação ou feedback do cliente</li>\n<li>Atividade de validação com dados reais</li>\n<li>Foco na usabilidade e fluxo de negócio</li>\n<li>Pode revelar requisitos mal entendidos</li>\n<li>Último checkpoint antes do go-live</li>\n</ol>\n<hr>\n<h3>Teste Funcional: Verificando Funcionalidades</h3>\n\n<p>O teste funcional determina se um recurso ou sistema funciona corretamente sem problemas. Verifica o sistema em diferentes níveis para garantir que todos os cenários são cobertos.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto da forma certa?\"</strong></p>\n\n<h4>Técnicas de Teste Funcional</h4>\n\n<p>##### 1. Teste Baseado em Requisitos<br><ol><li>Cada requisito tem casos de teste correspondentes</li><br><li>Rastreabilidade entre requisitos e testes</li><br><li>Cobertura completa</li><br></ol><br>##### 2. Teste Baseado em Casos de Uso<br><ol><li>Cenários de usuário documentados</li><br><li>Fluxos principais e alternativos</li><br><li>Pré-condições e pós-condições</li><br></ol><br>##### 3. Teste de Tabela de Decisão<br><ol><li>Combinações de condições e ações</li><br><li>Útil para regras de negócio complexas</li><br></ol><br>##### 4. Teste de Transição de Estado<br><ol><li>Mudanças de estado do sistema</li><br><li>Diagramas de estado</li><br></ol><br><hr><br><h2>Testes Não-Funcionais: Avaliando Qualidade Oculta</h2></p>\n\n<h3>Teste de Desempenho: Rapidez e Estabilidade</h3>\n\n<figure><img src=\"https://media.giphy.com/media/l0Iy69RBwNTRF0MXi/giphy.gif\" alt=\"Performance Testing - Testes de Desempenho\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de desempenho avalia a velocidade, responsividade e estabilidade do sistema sob carga de trabalho. É crítico para garantir que a aplicação atende aos SLAs (Service Level Agreements).</p>\n\n<h4>Subtipo 1: Teste de Carga (Load Testing)</h4>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas.</p>\n\n<p><strong>Métricas Coletadas:</strong><ol><li>Tempo de resposta (média, p95, p99)</li><br><li>Throughput (requisições por segundo)</li><br><li>Utilização de recursos (CPU, memória, disco)</li><br><li>Taxa de erros</li><br></ol><br><strong>Ferramentas Populares:</strong><ol><li>JMeter</li><br><li>Gatling</li><br><li>k6</li><br><li>Locust</li><br></ol><br><h4>Subtipo 2: Teste de Estresse (Stress Testing)</h4></p>\n\n<p>Avalia os limites do sistema além da capacidade normal para identificar o ponto de quebra.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar capacidade máxima</li><br><li>Verificar comportamento sob overload</li><br><li>Medir tempo de recuperação</li><br><li>Validar failovers</li><br></ol><br><h4>Subtipo 3: Teste de Resistência (Soak Testing)</h4></p>\n\n<p>Executa o sistema sob carga por períodos prolongados para identificar degradação gradual.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Conexões não fechadas</li><br><li>Acúmulo de logs</li><br><li>Degradação de performance</li><br></ol><br><h4>Subtipo 4: Teste de Pico (Spike Testing)</h4></p>\n\n<p>Avalia reações do sistema a picos súbitos de carga.</p>\n\n<p><strong>Cenário Exemplo:</strong><br><pre><code>Carga normal: 1000 usuários<br>Pico: 5000 usuários em 10 segundos<br>Recovery: Voltar para 1000 usuários<br></code></pre></p>\n\n<h4>Ferramentas de Teste de Desempenho</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>JMeter</strong></td><td>Open Source</td><td>Java</td><td>Enterprise, complexo</td></tr>\n<tr><td><strong>Gatling</strong></td><td>Open Source</td><td>Scala</td><td>DevOps, CI/CD</td></tr>\n<tr><td><strong>k6</strong></td><td>Open Source</td><td>JavaScript</td><td>Moderno, extensível</td></tr>\n<tr><td><strong>Locust</strong></td><td>Open Source</td><td>Python</td><td>Python teams</td></tr>\n<tr><td><strong>LoadRunner</strong></td><td>Comercial</td><td>Various</td><td>Enterprise</td></tr>\n</table></figure>\n\n<h4>Exemplo de Teste de Carga com k6</h4>\n\n<pre><code>// script.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },  // Ramp-up<br>    { duration: \'5m\', target: 100 },  // Steady state<br>    { duration: \'2m\', target: 200 },  // Spike<br>    { duration: \'5m\', target: 200 },  // Steady state<br>    { duration: \'2m\', target: 0 },    // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // Menos de 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/produtos\');<br>  check(res, {<br>    \'status é 200\': (r) =&gt; r.status === 200,<br>    \'tempo  r.timings.duration &lt; 500,<br>  });<br>  sleep(1);<br>}<br></code></pre></p>\n\n<hr>\n<h3>Teste de Segurança: Protegendo Dados e Sistemas</h3>\n\n<figure><img src=\"https://media.giphy.com/media/1qfDU4MJv3jWu34hEx/giphy.gif\" alt=\"Security Testing - Escudo de Segurança\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de segurança identifica vulnerabilidades e garante proteção de dados. Em um mundo cada vez mais digital, a segurança é prioridade.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n\n<p>##### 1. Teste de Penetração (Pen Test)</p>\n\n<p>Simula ataques para identificar vulnerabilidades antes que hackers maliciosos o façam.</p>\n\n<p><strong>Metodologias:</strong><ol><li>OWASP Testing Guide</li><br><li>PTES (Penetration Testing Execution Standard)</li><br><li>NIST SP 800-115</li><br></ol><br><strong>Tipos de Pentest:</strong><ol><li><strong>Black Box:</strong> Sem conhecimento prévio</li><br><li><strong>White Box:</strong> Código e documentação</li><br><li><strong>Gray Box:</strong> Conhecimento parcial</li><br></ol><br>##### 2. Varredura de Vulnerabilidade</p>\n\n<p>Identifica pontos fracos conhecidos através de scanning automatizado.</p>\n\n<p><strong>Ferramentas:</strong><ol><li>Nessus</li><br><li>OpenVAS</li><br><li>Qualys</li><br><li>Nexpose</li><br></ol><br>##### 3. Teste de Firewall e WAF</p>\n\n<p>Verifica configurações de segurança de firewalls e Web Application Firewalls.</p>\n\n<p><strong>O que testar:</strong><ol><li>Regras de firewall</li><br><li>Block de IPs maliciosos</li><br><li>Detecção de SQL Injection</li><br><li>Proteção XSS</li><br></ol><br>##### 4. Análise de Código Estático (SAST)</p>\n\n<p>Detecta vulnerabilidades no código-fonte sem executá-lo.</p>\n\n<p><strong>Ferramentas SAST:</strong><ol><li>SonarQube</li><br><li>Checkmarx</li><br><li>Fortify</li><br><li>Snyk Code</li><br></ol><br>##### 5. Análise de Componentes (SCA)</p>\n\n<p>Identifica vulnerabilidades em bibliotecas e dependências.</p>\n\n<p><strong>Ferramentas SCA:</strong><ol><li>Snyk</li><br><li>OWASP Dependency-Check</li><br><li>WhiteSource</li><br><li>Dependabot</li><br></ol><br><h4>OWASP Top 10: Vulnerabilidades Mais Comuns</h4><br><ol><li><strong>A01 - Broken Access Control</strong></li><br><li><strong>A02 - Cryptographic Failures</strong></li><br><li><strong>A03 - Injection</strong></li><br><li><strong>A04 - Insecure Design</strong></li><br><li><strong>A05 - Security Misconfiguration</strong></li><br><li><strong>A06 - Vulnerable Components</strong></li><br><li><strong>A07 - Authentication Failures</strong></li><br><li><strong>A08 - Software and Data Integrity Failures</strong></li><br><li><strong>A09 - Security Logging Failures</strong></li><br><li><strong>A10 - SSRF (Server-Side Request Forgery)</strong></li><br></ol><br><hr><br><h3>Teste de Usabilidade: Experiência do Usuário</h3></p>\n\n<p>Avalia a facilidade de uso e a experiência do usuário com o sistema. O teste de usabilidade é essencial para garantir que os usuários consigam realizar suas tarefas de forma eficiente.</p>\n\n<h4>Critérios de Usabilidade</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Critério</th><th>Definição</th><th>Métrica</th></tr>\n<tr><td><strong>Eficácia</strong></td><td>Usuário consegue completar tarefa?</td><td>Taxa de sucesso</td></tr>\n<tr><td><strong>Eficiência</strong></td><td>Quanto tempo leva?</td><td>Tempo de tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Usuário gostou?</td><td>Questionários SUS</td></tr>\n<tr><td><strong>Aprendizagem</strong></td><td>Quanto tempo para aprender?</td><td>Tempo até proficiência</td></tr>\n<tr><td><strong>Memorização</strong></td><td>Lembra como usar?</td><td>Retenção após pausa</td></tr>\n</table></figure>\n\n<h4>Métodos de Teste de Usabilidade</h4>\n<ol><li><strong>Testes com Usuários</strong> - Sessões gravadas com participantes</li>\n<li><strong>Análise Heurística</strong> - Avaliação por especialistas</li>\n<li><strong>Questionários</strong> - SUS, SEQ, NPS</li>\n<li><strong>Eye Tracking</strong> - Rastreamento ocular</li>\n<li><strong>Análise de Tarefas</strong> - Tempos e erros</li>\n</ol>\n<h4>Frameworks de Avaliação</h4>\n<ol><li><strong>Nielsen\'s Heurísticas</strong> (10 princípios)</li>\n<li><strong>ISO 9241-11</strong> (Usabilidade)</li>\n<li><strong>WCAG 2.1</strong> (Acessibilidade)</li>\n</ol>\n<hr>\n<h3>Teste de Compatibilidade: Funciona em Todo Lugar?</h3>\n\n<p>Verifica se o software funciona em diferentes ambientes, navegadores e dispositivos.</p>\n\n<h4>Tipos de Teste de Compatibilidade</h4>\n\n<p>##### 1. Teste de Navegador (Cross-Browser)<br><ol><li>Chrome, Firefox, Safari, Edge</li><br><li>Diferentes versões</li><br><li>Modos de compatibilidade</li><br></ol><br>##### 2. Teste Mobile<br><ol><li>iOS (iPhone, iPad)</li><br><li>Android (diferentes fabricantes)</li><br><li>Diferentes tamanhos de tela</li><br><li>Diferentes versões de OS</li><br></ol><br>##### 3. Teste de Sistema Operacional<br><ol><li>Windows 10, 11</li><br><li>macOS (versões diferentes)</li><br><li>Linux (distribuições populares)</li><br></ol><br>##### 4. Teste de Hardware<br><ol><li>Diferentes processadores</li><br><li>Diferentes quantidades de RAM</li><br><li>Diferentes resoluções de tela</li><br></ol><br><h4>Ferramentas de Teste Cross-Browser</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Cobertura</th><th>Preço</th></tr>\n<tr><td>BrowserStack</td><td>3000+ dispositivos</td><td>$29+/mês</td></tr>\n<tr><td>Sauce Labs</td><td>1000+ dispositivos</td><td>$39+/mês</td></tr>\n<tr><td>LambdaTest</td><td>3000+ dispositivos</td><td>$15+/mês</td></tr>\n<tr><td>CrossBrowserTesting</td><td>1500+ dispositivos</td><td>$29+/mês</td></tr>\n</table></figure>\n\n<hr>\n<h3>Teste de Recuperação: Resistência a Falhas</h3>\n\n<p>Avalia a capacidade do sistema de se recuperar de falhas e disasters. É crucial para sistemas críticos que não podem ficar fora do ar.</p>\n\n<h4>Cenários de Teste</h4>\n<ol><li><strong>Falha de Hardware</strong></li>\n</ol>   - Perda de disco\n   - Falha de memória\n   - Queda de servidor\n<ol><li><strong>Falha de Software</strong></li>\n</ol>   - Crash de aplicação\n   - Deadlock\n   - Exceções não tratadas\n<ol><li><strong>Falha de Rede</strong></li>\n</ol>   - Perda de conectividade\n   - Alta latência\n   - Timeout\n<ol><li>:40', '2026-07-07 01:25:40', '', '183', 'http://localhost:8082/ideiasti/?p=413', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('414', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda estratégias de testes ágeis para equipes Scrum, Kanban e DevOps. Como implementar qualidade contínua em ciclos de desenvolvimento rápidos.</p>\n\n<hr>\n<h2>Introdução aos Testes Ágeis</h2>\n\n<p>Testes ágeis é uma abordagem que integra atividades de teste ao longo de todo o ciclo de desenvolvimento ágil, em vez de tratá-las como uma fase separada após a implementação. Esta filosofia promove qualidade contínua e colaboração entre desenvolvedores e testadores.</p>\n\n<h3>Princípios Fundamentais</h3>\n<ol><li><strong>Qualidade é responsabilidade de todos</strong> - Toda equipe é responsável pela qualidade</li>\n<li><strong>Testar cedo e frequentemente</strong> - Shift-Left em ação</li>\n<li><strong>Automação como habilitador</strong> - CI/CD e testes automatizados</li>\n<li><strong>Feedback rápido</strong> - loops de feedback curtos</li>\n<li><strong>Adaptação contínua</strong> - Melhoria baseada em retrospectivas</li>\n</ol>\n<hr>\n<h2>Testes em Diferentes Frameworks Ágeis</h2>\n\n<h3>1. Testes em Scrum</h3>\n\n<h4>Distribuição de Testes por Sprint</h4>\n\n<pre><code>Sprint (2 semanas)\n├── Semana 1\n│   ├── Dia 1-2: Planejamento + Desenvolvimento User Stories\n│   ├── Dia 3-4: Desenvolvimento + Testes Unitários\n│   └── Dia 5: Integração + Testes de Integração\n│\n└── Semana 2\n    ├── Dia 1-2: Testes manuais/exploratórios\n    ├── Dia 3-4: Automação de regressão\n    └── Dia 5: Demo + Retrospectiva\n</code></pre>\n\n<h4>Definition of Done (DoD)</h4>\n\n<p>Cada User Story só está \"Done\" quando:</p>\n\n<ul><li>[ ] Código implementado</li><ol><li>[ ] Unit tests escritos e passando (&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} coverage)</li>\n<li>[ ] Code review aprovado</li>\n<li>[ ] Testes de integração passando</li>\n<li>[ ] Testes funcionais passando</li>\n<li>[ ] Critérios de aceitação cumpridos</li>\n<li>[ ] Documentação atualizada</li>\n<li>[ ] Ready for Production</li>\n</ol>\n<h4>Definition of Ready (DoR)</h4>\n\n<p>Antes de entrar no Sprint:<br><ol><li>[ ] Critérios de aceitação definidos</li><br><li>[ ] Critérios de aceite claros e testáveis</li><br><li>[ ] Dependências identificadas</li><br><li>[ ] Estimativa de tamanho feita</li><br><li>[ ] Wireframes/UI definidos (se aplicável)</li><br></ol><br><h3>2. Testes em Kanban</h3></p>\n\n<h4>WIP Limits para QA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Etapa</th><th>WIP Limit</th><th>Razón</th></tr>\n<tr><td>To Do</td><td>10</td><td>Capacidade da equipe</td></tr>\n<tr><td>In Progress</td><td>5</td><td>Permite foco</td></tr>\n<tr><td>Testing</td><td>3</td><td>Qualidade no teste</td></tr>\n<tr><td>Review</td><td>2</td><td>bottlenecks visíveis</td></tr>\n<tr><td>Done</td><td>∞</td><td>Meta, não limite</td></tr>\n</table></figure>\n\n<h4>Fluxo de Testes Contínuo</h4>\n\n<pre><code>Backlog → Ready → In Dev → In Test → Ready to Deploy → Done\n              ↑                                   ↓\n              ←←←←←← BUG FOUND ←←←←←←←←←←←←←←←←←←←\n</code></pre>\n\n<h3>3. Testes em SAFe (Scaled Agile)</h3>\n\n<h4>Hierarquia de Testes</h4>\n\n<pre><code>Portfolio\n    ↓\nValue Stream\n    ↓\nLarge Solution (Program)\n    ├── Solution Demo\n    ├── Solution Acceptance\n    └── System Integration\n        ↓\n    Agile Release Train (ART)\n    ├── Iteration Planning\n    ├── Continuous Delivery Pipeline\n    └── System Demo\n        ↓\n    Team\n    ├── Unit Tests\n    ├── Component Tests\n    └── Feature Tests\n</code></pre>\n\n<hr>\n<h2>Estratégias de Teste por Fase Ágil</h2>\n\n<h3>Sprint 0: Preparação</h3>\n\n<p><strong>Atividades de Teste:</strong></p>\n\n<p>✅ Configurar ambiente de teste  <br>✅ Implementar framework de automação  <br>✅ Definir estratégia de testes  <br>✅ Criar templates de casos de teste  <br>✅ Estabelecer métricas de qualidade</p>\n\n<h3>Durante o Sprint</h3>\n\n<h4>Daily Testing Activities</h4>\n<ol><li><strong>Code Reviews</strong> - Verificar antes de commitar</li>\n<li><strong>Unit Tests</strong> - Desenvolvedor escreve junto com código</li>\n<li><strong>Peer Testing</strong> - Testar funcionalidades de colegas</li>\n<li><strong>Continuous Integration</strong> - Execução automática em cada commit</li>\n</ol>\n<h4>Quando Receber uma User Story</h4>\n\n<pre><code>1. READ → Ler critérios de aceitação<ol><li>DISCUSS → Tirar dúvidas com PO/analista</li>\n<li>CLARIFY →确保 compreensão comum</li>\n<li>PLAN → Identificar casos de teste</li>\n<li>TEST → Executar durante desenvolvimento</li>\n<li>AUTOMATE → Scripts de automação</li>\n<li>VERIFY → Confirmar que está \"Done\"</li>\n</ol></code></pre>\n\n<h3>Fim do Sprint</h3>\n\n<h4>Sprint Review Testing</h4>\n<ol><li>Demonstração de funcionalidades</li>\n<li>Validação com stakeholders</li>\n<li>Verificação de DoD</li>\n<li>Feedback do Product Owner</li>\n</ol>\n<h4>Sprint Retrospective</h4>\n<ol><li>O que funcionou bem em QA?</li>\n<li>O que precisa melhorar?</li>\n<li>Ações de melhoria para próximo sprint</li>\n</ol>\n<hr>\n<h2>Testes Ágeis em Prática</h2>\n\n<h3>Behavior-Driven Development (BDD)</h3>\n\n<h4>O Ciclo BDD</h4>\n\n<pre><code>        SPECIFICATION\n              ↓\n    ┌─────────────────────┐\n    │   User Stories      │\n    │   (Given-When-Then) │\n    └─────────────────────┘\n              ↓\n        IMPLEMENTATION\n              ↓\n    ┌─────────────────────┐\n    │   Executable Specs  │\n    │   (Cucumber/Behave) │\n    └─────────────────────┘\n              ↓\n         VALIDATION\n              ↓\n         FEEDBACK\n</code></pre>\n\n<h4>Exemplo de Cenário BDD</h4>\n\n<pre><code># features/login.feature\nFeature: Login de Usuário\n\n<p>Como um usuário registrado<br>  Quero fazer login no sistema<br>  Para acessar minha conta</p>\n\n<p>Scenario: Login com credenciais válidas<br>    Given que estou na página de login<br>    And o usuário \"joao@exemplo.com\" está registrado<br>    When eu preencho o campo email com \"joao@exemplo.com\"<br>    And eu preencho o campo senha com \"Senha@123\"<br>    And clico no botão \"Entrar\"<br>    Then sou redirecionado para o dashboard<br>    And uma mensagem de boas-vindas é exibida</p>\n\n<p>Scenario: Login com senha incorreta<br>    Given que estou na página de login<br>    And o usuário \"joao@exemplo.com\" está registrado<br>    When eu preencho o campo email com \"joao@exemplo.com\"<br>    And eu preencho o campo senha com \"senhaerrada\"<br>    And clico no botão \"Entrar\"<br>    Then permaneço na página de login<br>    And uma mensagem de erro \"Credenciais inválidas\" é exibida<br></code></pre></p>\n\n<pre><code># steps/login_steps.py\nfrom behave import given, when, then\nfrom selenium.webdriver.common.by import By\n\n<p>@given(\'que estou na página de login\')<br>def step_impl(context):<br>    context.driver.get(\'https://exemplo.com/login\')</p>\n\n<p>@when(\'eu preencho o campo email com \"{email}\"\')<br>def step_impl(context, email):<br>    context.driver.find_element(By.ID, \'email\').send_keys(email)</p>\n\n<p>@then(\'sou redirecionado para o dashboard\')<br>def step_impl(context):<br>    assert \'dashboard\' in context.driver.current_url<br></code></pre></p>\n\n<h3>Test-Driven Development (TDD)</h3>\n\n<h4>Ciclo Red-Green-Refactor</h4>\n\n<pre><code>    RED          GREEN         REFACTOR\n     ↓            ↓              ↓\n┌─────────┐  ┌─────────┐   ┌─────────────┐\n│Escreva   │  │Faça o   │   │Melhore o    │\n│Teste que │→ │teste    │→  │código sem   │\n│falha    │  │passar   │   │alterar      │\n└─────────┘  └─────────┘   │comportamento│\n     ↑                        └─────────────┘\n     └──────────────────────────────┘\n              (Repetir)\n</code></pre>\n\n<h4>Exemplo TDD</h4>\n\n<pre><code># TDD: Calculadora de desconto\n\n<p># 1. RED - Escrever teste que falha<br>def test_calcular_desconto_10_porcento():<br>    resultado = calcular_desconto(100, 10)<br>    assert resultado == 90  # Falha!</p>\n\n<p># 2. GREEN - Implementar código mínimo<br>def calcular_desconto(valor, percentual):<br>    return valor - (valor * percentual / 100)</p>\n\n<p># 3. REFACTOR - Melhorar código<br>def calcular_desconto(valor: float, percentual: float) -&gt; float:<br>    \"\"\"Calcula o valor final após desconto.\"\"\"<br>    if not 0 &lt;= percentual &lt;= 100:<br>        raise ValueError(\"Percentual deve estar entre 0 e 100\")<br>    return valor * (1 - percentual / 100)<br></code></pre></p>\n\n<hr>\n<h2>Automação de Testes em Ambientes Ágeis</h2>\n\n<h3>Pirâmide de Testes Ágil</h3>\n\n<pre><code>                    /\n                   /  \n                  / E2E      10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes end-to-end\n                 /________   Testes de aceitação de usuário\n                /          \n               /Integração   20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes de API/serviços\n              /______________\n             /                \n            /   Unitários       70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} - Testes unitários\n           /____________________ Rápidos, isolados, confiáveis\n</code></pre>\n\n<h3>Ferramentas por Camada</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Camada</th><th>Ferramentas</th><th>Linguagem</th></tr>\n<tr><td><strong>Unit</strong></td><td>JUnit, pytest, Jest, Mocha</td><td>Qualquer</td></tr>\n<tr><td><strong>Integration</strong></td><td>TestContainers, Postman</td><td>Qualquer</td></tr>\n<tr><td><strong>E2E</strong></td><td>Playwright, Cypress, Selenium</td><td>TS/JS/Python</td></tr>\n<tr><td><strong>Contract</strong></td><td>Pact, Spring Cloud Contract</td><td>Java/JS</td></tr>\n<tr><td><strong>Performance</strong></td><td>k6, JMeter, Gatling</td><td>Multi</td></tr>\n</table></figure>\n\n<h3>CI/CD Pipeline com Testes</h3>\n\n<pre><code># .github/workflows/ci.yml\nname: CI Pipeline\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  test:<br>    runs-on: ubuntu-latest</p>\n\n<p>services:<br>      postgres:<br>        image: postgres:15<br>        env:<br>          POSTGRES_DB: testdb<br>          POSTGRES_USER: test<br>          POSTGRES_PASSWORD: test</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p># Build<br>      - name: Build application<br>        run: npm ci &amp;&amp; npm run build</p>\n\n<p># Testes Unitários<br>      - name: Unit tests<br>        run: npm run test:unit -- --coverage<br>        env:<br>          DB_HOST: postgres</p>\n\n<p># Testes de Integração<br>      - name: Integration tests<br>        run: npm run test:integration<br>        env:<br>          DB_HOST: postgres</p>\n\n<p># Testes E2E<br>      - name: E2E tests<br>        run: npm run test:e2e<br>        if: github.event_name == \'push\'</p>\n\n<p># Análise de Código<br>      - name: SonarCloud Analysis<br>        uses: SonarSource/sonarcloud-github-action@master<br>        env:<br>          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}</p>\n\n<p># Upload Coverage<br>      - name: Upload coverage<br>        uses: codecov/codecov-action@v3<br></code></pre></p>\n\n<hr>\n<h2>Métricas Ágeis de Qualidade</h2>\n\n<h3>burndown de Defeitos</h3>\n\n<pre><code>Dias:   1  2  3  4  5  6  7  8  9 10\n        │  │  │  │  │  │  │  │  │  │\nIdeal ──└──┴──┴──┴──┴──┴──┴──┴──┴──┘\n        │\nReal ───└──┬──┬──┬──┐     ┌──┬──┬──┘\n          │  │  │  │     │  │  │\n         d1 d2 d3 d4     d7 d8 d9\n\n<p>Meta: Reduzir defeitos abertos ao longo do sprint<br></code></pre></p>\n\n<h3>Relatório de Qualidade do Sprint</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Sprint Anterior</th><th>Sprint Atual</th><th>Target</th></tr>\n<tr><td>Defeitos abertos no início</td><td>15</td><td>12</td><td>&lt;10</td></tr>\n<tr><td>Defeitos criados</td><td>8</td><td>6</td><td>&lt;5</td></tr>\n<tr><td>Defeitos resolvidos</td><td>11</td><td>10</td><td>&gt;8</td></tr>\n<tr><td>Defeitos em aberto no fim</td><td>12</td><td>8</td><td>&lt;5</td></tr>\n<tr><td>Cobertura de código</td><td>72{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>78{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Testes passando</td><td>95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>97{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&gt;98{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n</table></figure>\n\n<h3>Velocity de Testes</h3>\n\n<pre><code># Métricas de velocity de testes\nvelocity_data = {\n    \"sprints\": [1, 2, 3, 4, 5],\n    \"testes_automatizados\": [45, 68, 92, 115, 140],\n    \"cobertura\": [45, 55, 65, 73, 80],\n    \"tempo_execucao_min\": [60, 50, 42, 35, 30]\n}\n\n<p># Tendências<br>tendencia_teste = calculate_trend(velocity_data[\"testes_automatizados\"])<br>tendencia_cobertura = calculate_trend(velocity_data[\"cobertura\"])<br>tendencia_tempo = calculate_trend(velocity_data[\"tempo_execucao_min\"], descending=True)<br></code></pre></p>\n\n<hr>\n<h2>Desafios e Soluções</h2>\n\n<h3>Desafio 1: Falta de Tempo para Testes</h3>\n\n<p><strong>Soluções:</strong><br><ol><li>Automatizar tarefas repetitivas</li><br><li>Priorizar testes de maior impacto</li><br><li>Implementar Shift-Left</li><br><li>Dedicated time para automação</li><br></ol><br><h3>Desafio 2: Testes Lentes no CI</h3></p>\n\n<p><strong>Soluções:</strong><br><ol><li>Execução paralela</li><br><li>Selecionar testes por impacto</li><br><li>Cache de dependências</li><br><li>Execução em cloud</li><br></ol><br><h3>Desafio 3: Testes Flaky</h3></p>\n\n<p><strong>Soluções:</strong><br><ol><li>Waits explícitos ao invés de sleeps</li><br><li>Isolamento de testes</li><br><li>Retry strategies</li><br><li>Investigar root cause</li><br></ol><br><h3>Desafio 4: Cobertura Insuficiente</h3></p>\n\n<p><strong>Soluções:</strong><br><ol><li>TDD para novos features</li><br><li>Code coverage gates</li><br><li>Análise de risco para priorizar</li><br><li>Pair testing com devs</li><br></ol><br><hr><br><h2>Checklist de Testes Ágeis</h2></p>\n\n<h3>Antes do Sprint</h3>\n<ol><li>[ ] User Stories com critérios de aceitação claros</li>\n<li>[ ] Ambiente de teste configurado</li>\n<li>[ ] Framework de automação pronto</li>\n<li>[ ] Dados de teste准备好了</li>\n</ol>\n<h3>Durante o Sprint</h3>\n<ol><li>[ ] Unit tests escritos com código</li>\n<li>[ ] Code reviews realizados</li>\n<li>[ ] CI pipeline passando</li>\n<li>[ ] Testes manuais/exploratórios executados</li>\n</ol>\n<h3>Fim do Sprint</h3>\n<ol><li>[ ] Todos os testes passando</li>\n<li>[ ] DoD cumprido para cada story</li>\n<li>[ ] Regressão executada</li>\n<li>[ ] Métricas atualizadas</li>\n<li>[ ] Retrospectiva de QA realizada</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes ágeis não são apenas sobre ferramentas e automação - são sobre uma mentalidade de qualidade compartilhada por toda a equipe. As chaves para o sucesso são:<br><ol><li><strong>Integração</strong> - Testes não são fase separada</li><br><li><strong>Automação</strong> - Habilitador de velocidade</li><br><li><strong>Colaboração</strong> - Todos responsáveis por qualidade</li><br><li><strong>Feedback</strong> - Loops curtos de informação</li><br><li><strong>Melhoria</strong> - Retrospectivas e adaptação</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Como introduzir testes em uma equipe que não faz?</strong>  <br>R: Comece com unit tests, demonstre valor com métricas, expanda gradualmente.</p>\n\n<p><strong>P: Quantos testadores uma equipe ágil precisa?</strong>  <br>R: Não há número fixo. A proporção ideal depende da complexidade do projeto e maturidade da equipe.</p>\n\n<p><strong>P: Testes manuais ainda fazem sentido em ágil?</strong>  <br>R: Sim! Exploratory testing, UX testing e testes de novos cenários ainda são valiosos.</p>\n\n<p><strong>P: Como medir sucesso de testes ágeis?</strong>  <br>R: Métricas como cobertura, tempo de execução, defeitos em produção e velocity.</p>', 'Testes Ágeis: Estratégias para Equipes Ágeis e DevOps', '', 'inherit', 'closed', 'closed', '', '184-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '184', 'http://localhost:8082/ideiasti/?p=414', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('415', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Domine testes de performance: load testing, stress testing, spike testing e soak testing. Aprenda a usar JMeter, k6, Gatling e interprete resultados para otimizar seus sistemas.</p>\n\n<hr>\n<h2>Introdução aos Testes de Performance</h2>\n\n<p>Testes de performance são testes não-funcionais que avaliam quão bem um sistema se comporta sob diferentes condições de carga, volume e estresse. São críticos para garantir que aplicações atendam aos requisitos de velocidade, escalabilidade e estabilidade.</p>\n\n<h3>Por Que Testes de Performance São Essenciais?</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Impacto</th><th>Dados</th></tr>\n<tr><td><strong>Receita</strong></td><td>1 segundo de delay = 7{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos conversões</td></tr>\n<tr><td><strong>Usuários</strong></td><td>53{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} abandonam site se &gt;3s para carregar</td></tr>\n<tr><td><strong>Receita Amazon</strong></td><td>1 segundo de delay = $1.6B/ano em vendas</td></tr>\n<tr><td><strong>Google</strong></td><td>500ms extra = 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos buscas</td></tr>\n</table></figure>\n\n<hr>\n<h2>Tipos de Testes de Performance</h2>\n\n<h3>1. Load Testing (Teste de Carga)</h3>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas em produção.</p>\n\n<p><strong>Objetivos:</strong><br><ul><li>Medir tempos de resposta</li><ol><li>Verificar throughput máximo</li><br><li>Identificar bottlenecks</li><br><li>Validar SLAs</li><br></ol><br><strong>Exemplo de Cenário:</strong><br><pre><code>Carga esperada: 1000 usuários simultâneos<br>Horário de pico: 10:00-12:00 e 14:00-16:00<br>Transações por hora: 10.000<br></code></pre></p>\n\n<h3>2. Stress Testing (Teste de Estresse)</h3>\n\n<p>Avalia os limites do sistema além da capacidade normal.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar ponto de quebra</li><br><li>Medir degradação graciosa</li><br><li>Verificar recovery</li><br><li>Testar failovers</li><br></ol><br><strong>Cenário:</strong><br><pre><code>Normal: 1000 usuários<br>Stress: 2000 → 3000 → 5000 → 8000 → 10000 usuários<br>Objetivo: Encontrar onde o sistema quebra<br></code></pre></p>\n\n<h3>3. Spike Testing (Teste de Pico)</h3>\n\n<p>Avalia reações a picos súbitos de carga.</p>\n\n<pre><code>Carga normal: 1000 usuários\nPico: 5000 usuários em 5 segundos\nRecovery: 1000 usuários\nPadrão: On-off-on-off\n</code></pre>\n\n<h3>4. Soak Testing (Teste de Resistência)</h3>\n\n<p>Executa carga sustentada por período prolongado.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Connection pool exhaustion</li><br><li>Log rotation issues</li><br><li>Database connection limits</li><br><li>Disk space issues</li><br></ol><br><strong>Duração:</strong> 8-24+ horas contínuas</p>\n\n<h3>5. Endurance Testing</h3>\n\n<p>Similar ao Soak, mas com foco em validação de SLAs por longo período.</p>\n\n<hr>\n<h2>Métricas de Performance</h2>\n\n<h3>Métricas Principais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Descrição</th><th>Target Típico</th></tr>\n<tr><td><strong>Response Time (Avg)</strong></td><td>Tempo médio de resposta</td><td>&lt;2s para web, &lt;500ms para API</td></tr>\n<tr><td><strong>Response Time (P95)</strong></td><td>95º percentil</td><td>&lt;3s</td></tr>\n<tr><td><strong>Response Time (P99)</strong></td><td>99º percentil</td><td>&lt;5s</td></tr>\n<tr><td><strong>Throughput</strong></td><td>Requisições por segundo</td><td>Conforme especificado</td></tr>\n<tr><td><strong>Error Rate</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de requisições com erro</td><td>&lt;1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>CPU Usage</strong></td><td>Utilização de CPU</td><td>&lt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Memory Usage</strong></td><td>Utilização de memória</td><td>&lt;85{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Network I/O</strong></td><td>Largura de banda</td><td>Dentro de capacidade</td></tr>\n<tr><td><strong>Disk I/O</strong></td><td>Operações de disco</td><td>&lt;70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} capacidade</td></tr>\n</table></figure>\n\n<h3>Como Medir Percentis</h3>\n\n<pre><code>Lista de tempos de resposta (ms):\n[120, 150, 180, 200, 220, 250, 280, 300, 350, 400, 500, 600, 800, 1000]\n\n<p>Média: 334ms<br>Mediana (P50): 275ms<br>P95: 800ms (5{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} acima = 800ms)<br>P99: 1000ms (1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} acima = 1000ms)<br></code></pre></p>\n\n<hr>\n<h2>Ferramentas de Teste de Performance</h2>\n\n<h3>1. Apache JMeter</h3>\n\n<p><strong>Melhor para:</strong> Projetos enterprise, testes complexos</p>\n\n<h4>Instalação e Configuração</h4>\n\n<pre><code># Download JMeter\nwget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.6.3.tgz\ntar -xzf apache-jmeter-5.6.3.tgz\n\n<p># Executar (requer Java 8+)<br>cd apache-jmeter-5.6.3/bin<br>./jmeter.sh<br></code></pre></p>\n\n<h4>Exemplo de Plano de Teste (GUI)</h4>\n\n<pre><code>Test Plan\n├── Thread Group (Users: 100, Ramp-up: 10s, Loop: 10)\n│   ├── HTTP Request Defaults (Server: api.exemplo.com)\n│   │   └── Path: /api/produtos\n│   ├── HTTP Cookie Manager\n│   ├── Listeners\n│   │   ├── Summary Report\n│   │   ├── View Results Tree\n│   │   └── Graph Results\n</code></pre>\n\n<h4>Script JMeter (CLI)</h4>\n\n<pre><code>\n\n  \n    \n      API Load Test\n    \n    \n      \n        100\n        10\n        10\n      \n      \n        \n          api.exemplo.com\n          GET\n          /api/produtos\n        \n      \n    \n  \n\n</code></pre>\n\n<pre><code># Executar via CLI\n./jmeter.sh -n -t api_test.jmx -l results.jtl -e -o html_report\n</code></pre>\n\n<h3>2. k6 (Grafana k6)</h3>\n\n<p><strong>Melhor para:</strong> DevOps, scripts em JS, CI/CD integrado</p>\n\n<h4>Instalação</h4>\n\n<pre><code># macOS\nbrew install k6\n\n<p># Linux<br>sudo gpg -k<br>sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69<br>echo \"deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main\" | sudo tee /etc/apt/sources.list.d/k6.list<br>sudo apt-get update<br>sudo apt-get install k6<br></code></pre></p>\n\n<h4>Script k6 - Load Test Básico</h4>\n\n<pre><code>// load-test.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\nimport { Rate, Trend } from \'k6/metrics\';\n\n<p>// Métricas customizadas<br>const errorRate = new Rate(\'errors\');<br>const responseTime = new Trend(\'response_time\');</p>\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },   // Ramp-up<br>    { duration: \'5m\', target: 100 },   // Steady state<br>    { duration: \'2m\', target: 200 },   // Stress<br>    { duration: \'5m\', target: 200 },   // Steady state<br>    { duration: \'2m\', target: 0 },     // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das req &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // &lt; 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>    errors: [\'rate&lt;0.1&#039;],               // &lt; 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de erros<br>  },<br>};</p>\n\n<p>const BASE_URL = \'https://api.exemplo.com\';</p>\n\n<p>export default function () {<br>  // Login para obter token<br>  const loginRes = http.post(<code>${BASE_URL}/auth/login</code>, {<br>    email: \'usuario@teste.com\',<br>    password: \'senha123\',<br>  });</p>\n\n<p>check(loginRes, {<br>    \'login status 200\': (r) =&gt; r.status === 200,<br>    \'token received\': (r) =&gt; r.json(\'token\') !== undefined,<br>  });</p>\n\n<p>const token = loginRes.json(\'token\');</p>\n\n<p>// Listar produtos com token<br>  const productsRes = http.get(<code>${BASE_URL}/api/produtos</code>, {<br>    headers: {<br>      \'Authorization\': <code>Bearer ${token}</code>,<br>    },<br>  });</p>\n\n<p>responseTime.add(productsRes.timings.duration);<br>  errorRate.add(productsRes.status !== 200);</p>\n\n<p>check(productsRes, {<br>    \'products status 200\': (r) =&gt; r.status === 200,<br>    \'products returned\': (r) =&gt; r.json(\'data\').length &gt; 0,<br>  });</p>\n\n<p>sleep(1);<br>}<br></code></pre></p>\n\n<h4>Script k6 - Spike Test</h4>\n\n<pre><code>// spike-test.js\nimport http from \'k6/http\';\nimport { check } from \'k6\';\n\n<p>export const options = {<br>  scenarios: {<br>    spike_test: {<br>      executor: \'ramping-vus\',<br>      startVUs: 0,<br>      stages: [<br>        { duration: \'10s\', target: 100 },   // Normal<br>        { duration: \'30s\', target: 1000 },    // SPIKE!<br>        { duration: \'30s\', target: 1000 },   // Hold<br>        { duration: \'10s\', target: 100 },    // Recovery<br>        { duration: \'10s\', target: 0 },      // Cooldown<br>      ],<br>    },<br>  },<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;1000&#039;],<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/health\');<br>  check(res, { \'status OK\': (r) =&gt; r.status === 200 });<br>}<br></code></pre></p>\n\n<h3>3. Gatling</h3>\n\n<p><strong>Melhor para:</strong> Scala/Java, relatórios detalhados, CI/CD</p>\n\n<h4>Instalação</h4>\n\n<pre><code># Download\nwget https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/3.10.5/gatling-charts-highcharts-bundle-3.10.5.zip\nunzip gatling-charts-highcharts-bundle-3.10.5.zip\n</code></pre>\n\n<h4>Script Gatling (Scala)</h4>\n\n<pre><code>// src/test/scala/LoadSimulation.scala\npackage simulations\n\n<p>import io.gatling.core.Predef._<br>import io.gatling.http.Predef._</p>\n\n<p>class LoadSimulation extends Simulation {</p>\n\n<p>val baseUrl = \"https://api.exemplo.com\"</p>\n\n<p>val httpConfig = http<br>    .baseUrl(baseUrl)<br>    .acceptHeader(\"application/json\")<br>    .contentTypeHeader(\"application/json\")</p>\n\n<p>val userFeeder = csv(\"users.csv\").random</p>\n\n<p>val scn = scenario(\"API Load Test\")<br>    .feed(userFeeder)<br>    .exec(<br>      http(\"Login\")<br>        .post(\"/auth/login\")<br>        .body(StringBody(\"\"\"{\"email\":\"${email}\",\"password\":\"${password}\"}\"\"\"))<br>        .check(jsonPath(\"$.token\").saveAs(\"authToken\"))<br>    )<br>    .pause(1)<br>    .exec(<br>      http(\"Get Products\")<br>        .get(\"/api/produtos\")<br>        .header(\"Authorization\", \"Bearer ${authToken}\")<br>        .check(status.is(200))<br>    )<br>    .pause(1)<br>    .exec(<br>      http(\"Get Product Details\")<br>        .get(\"/api/produtos/1\")<br>        .header(\"Authorization\", \"Bearer ${authToken}\")<br>        .check(status.is(200))<br>    )</p>\n\n<p>setUp(<br>    scn.inject(<br>      rampUsers(100).during(30.seconds),<br>      constantUsersPerSec(50).during(60.seconds)<br>    )<br>  )<br>  .protocols(httpConfig)<br>  .thresholds(<br>    http_req_duration.p95.lt(500),<br>    http_req_duration.p99.lt(1000)<br>  )<br>}<br></code></pre></p>\n\n<h3>4. Locust (Python)</h3>\n\n<p><strong>Melhor para:</strong> Equipes Python, testes distribuídos</p>\n\n<h4>Instalação</h4>\n\n<pre><code>pip install locust\n</code></pre>\n\n<h4>Script Locust</h4>\n\n<pre><code># locustfile.py\nfrom locust import HttpUser, task, between, events\nimport random\n\n<p>class APIClient(HttpUser):<br>    wait_time = between(1, 3)</p>\n\n<p>def on_start(self):<br>        \"\"\"Login antes de executar tarefas\"\"\"<br>        response = self.client.post(\"/auth/login\", json={<br>            \"email\": \"usuario@teste.com\",<br>            \"password\": \"senha123\"<br>        })<br>        if response.status_code == 200:<br>            self.token = response.json()[\"token\"]<br>        else:<br>            self.token = None</p>\n\n<p>@task(3)<br>    def list_products(self):<br>        \"\"\"Listar produtos (mais frequente)\"\"\"<br>        if self.token:<br>            self.client.get(<br>                \"/api/produtos\",<br>                headers={\"Authorization\": f\"Bearer {self.token}\"}<br>            )</p>\n\n<p>@task(2)<br>    def get_product(self):<br>        \"\"\"Detalhes de produto\"\"\"<br>        product_id = random.randint(1, 100)<br>        if self.token:<br>            self.client.get(<br>                f\"/api/produtos/{product_id}\",<br>                headers={\"Authorization\": f\"Bearer {self.token}\"}<br>            )</p>\n\n<p>@task(1)<br>    def create_order(self):<br>        \"\"\"Criar pedido (menos frequente)\"\"\"<br>        if self.token:<br>            self.client.post(<br>                \"/api/pedidos\",<br>                headers={\"Authorization\": f\"Bearer {self.token}\"},<br>                json={<br>                    \"produto_id\": random.randint(1, 100),<br>                    \"quantidade\": random.randint(1, 5)<br>                }<br>            )</p>\n\n<p># Executar<br># locust -f locustfile.py --host=https://api.exemplo.com<br></code></pre></p>\n\n<hr>\n<h2>Cenários de Teste Common</h2>\n\n<h3>1. E-commerce</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Cenário</th><th>Usuários</th><th>Duração</th><th>Objetivo</th></tr>\n<tr><td>Navegação</td><td>500</td><td>10 min</td><td>P95 &lt; 2s</td></tr>\n<tr><td>Busca</td><td>200</td><td>5 min</td><td>Throughput &gt; 50/s</td></tr>\n<tr><td>Checkout</td><td>100</td><td>15 min</td><td>P95 &lt; 5s</td></tr>\n<tr><td>Pico Black Friday</td><td>2000</td><td>1 min</td><td>Sistema estável</td></tr>\n</table></figure>\n\n<h3>2. API REST</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Endpoint</th><th>Load</th><th>Stress</th><th>Spike</th></tr>\n<tr><td>GET /users</td><td>1000 rps</td><td>2000 rps</td><td>5000 rps</td></tr>\n<tr><td>POST /orders</td><td>500 rps</td><td>1000 rps</td><td>2000 rps</td></tr>\n<tr><td>GET /products</td><td>2000 rps</td><td>4000 rps</td><td>8000 rps</td></tr>\n</table></figure>\n\n<h3>3. Aplicação Web</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Página</th><th>Target Load</th><th>P95 Target</th></tr>\n<tr><td>Home</td><td>1000 concurrent</td><td>&lt;3s</td></tr>\n<tr><td>Search</td><td>500 concurrent</td><td>&lt;2s</td></tr>\n<tr><td>Product Page</td><td>800 concurrent</td><td>&lt;2.5s</td></tr>\n<tr><td>Checkout</td><td>200 concurrent</td><td>&lt;5s</td></tr>\n</table></figure>\n\n<hr>\n<h2>Interpretando Resultados</h2>\n\n<h3>Identificando Bottlenecks</h3>\n\n<h4>CPU Bound</h4>\n\n<pre><code>Sintomas:<ol><li>CPU &gt; 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</li>\n<li>Throughput não aumenta com mais usuários</li>\n<li>Response time aumenta linearmente</li>\n</ol>\nSoluções:<ol><li>Otimizar algoritmos</li>\n<li>Cachear resultados</li>\n<li>Adicionar índices ao banco</li>\n<li>Load balancing</li>\n</ol></code></pre>\n\n<h4>Memory Bound</h4>\n\n<pre><code>Sintomas:<ol><li>Memory leak crescente</li>\n<li>Garbage collection frequente</li>\n<li>OOM errors</li>\n</ol>\nSoluções:<ol><li>Code review para memory leaks</li>\n<li>Aumentar memória</li>\n<li>Pool de objetos</li>\n<li>Compactação de dados</li>\n</ol></code></pre>\n\n<h4>I/O Bound</h4>\n\n<pre><code>Sintomas:<ol><li>Disk I/O 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</li>\n<li>Network saturation</li>\n<li>Queries lentas</li>\n</ol>\nSoluções:<ol><li>Cache de queries</li>\n<li>Compressão de dados</li>\n<li>CDN para estáticos</li>\n<li>Read replicas</li>\n</ol></code></pre>\n\n<h3>Dashboard de Resultados</h3>\n\n<pre><code>// Exemplo de parse de resultados JMeter para dashboard\nconst results = parseJMeterResults(\'results.jtl\');\n\n<p>const summary = {<br>  totalRequests: results.length,<br>  avgResponseTime: results.avg(r =&gt; r.elapsed),<br>  p95ResponseTime: results.percentile(95, r =&gt; r.elapsed),<br>  p99ResponseTime: results.percentile(99, r =&gt; r.elapsed),<br>  errorRate: results.filter(r =&gt; r.success === false).length / results.length,<br>  throughput: results.length / (results.max(r =&gt; r.timestamp) - results.min(r =&gt; r.timestamp)) * 1000,<br>};</p>\n\n<p>console.log(`<br>=== Load Test Summary ===<br>Total Requests: ${summary.totalRequests}<br>Avg Response: ${summary.avgResponseTime}ms<br>P95 Response: ${summary.p95ResponseTime}ms<br>P99 Response: ${summary.p99ResponseTime}ms<br>Error Rate: ${(summary.errorRate * 100).toFixed(2)}{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>Throughput: ${summary.throughput.toFixed(2)} req/s<br>`);<br></code></pre></p>\n\n<hr>\n<h2>Melhores Práticas</h2>\n\n<h3>Antes do Teste</h3>\n<ol><li><strong>Definir objetivos claros</strong> - SLAs, thresholds</li>\n<li><strong>Ambiente isolado</strong> - Não testar em produção</li>\n<li><strong>Dados准备了</strong> - Massa de dados realista</li>\n<li><strong>Baseline estabelecido</strong> - Métricas de referência</li>\n<li><strong>Monitoramento configurado</strong> - APM tools</li>\n</ol>\n<h3>Durante o Teste</h3>\n<ol><li><strong>Iniciar gradualmente</strong> - Ramp-up suave</li>\n<li><strong>Monitorar em tempo real</strong> - Dashboards ativos</li>\n<li><strong>Documentar incidentes</strong> - Timestamps e evidências</li>\n<li><strong>Não tocar no ambiente</strong> - Interferência mínima</li>\n<li><strong>Capturar métricas</strong> - Logs, monitoring, profiling</li>\n</ol>\n<h3>Após o Teste</h3>\n<ol><li><strong>Analisar resultados</strong> - Correlacionar métricas</li>\n<li><strong>Identificar bottlenecks</strong> - Root cause analysis</li>\n<li><strong>Documentar achados</strong> - Relatório técnico</li>\n<li><strong>Recomendar ações</strong> - Priorizadas por impacto</li>\n<li><strong>Repetir testes</strong> - Validar otimizações</li>\n</ol>\n<hr>\n<h2>Checklist de Teste de Performance</h2>\n\n<h3>Preparação</h3>\n<ol><li>[ ] Objetivos de teste definidos</li>\n<li>[ ] SLAs documentados</li>\n<li>[ ] Ambiente configurado</li>\n<li>[ ] Dados de teste criados</li>\n<li>[ ] Baselinecapturado</li>\n<li>[ ] Monitoramento configurado</li>\n</ol>\n<h3>Execução</h3>\n<ol><li>[ ] Teste piloto executado</li>\n<li>[ ] Carga gradual aplicada</li>\n<li>[ ] Métricas capturadas</li>\n<li>[ ] Incidentes documentados</li>\n<li>[ ] Logs coletados</li>\n</ol>\n<h3>Análise</h3>\n<ol><li>[ ] Resultados analisados</li>\n<li>[ ] Bottlenecks identificados</li>\n<li>[ ] Recomendações formuladas</li>\n<li>[ ] Relatório preparado</li>\n<li>[ ] Ações priorizadas</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de performance são essenciais para garantir que suas aplicações atendam às expectativas dos usuários em termos de velocidade, escalabilidade e estabilidade. A escolha da ferramenta certa depende do contexto do projeto, mas o mais importante é:<br><ol><li><strong>Testar regularmente</strong> - Não apenas antes de releases</li><br><li><strong>Definir SLAs claros</strong> - Métricas objetivas</li><br><li><strong>Analisar resultados</strong> - Não apenas coletar</li><br><li><strong>Otimizar continuamente</strong> - Melhoria progressiva</li><br><li><strong>Automatizar</strong> - CI/CD integrado</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Quantos usuários devo simular no load test?</strong>  <br>R: Baseie-se em seus picos de uso real + margem de 20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}.</p>\n\n<p><strong>P: Qual é o P95 ideal?</strong>  <br>R: Depende do tipo de aplicação. API: &lt;500ms, Web: &lt;3s, Mobile: &lt;2s.</p>\n\n<p><strong>P: Como often devo executar load tests?</strong>  <br>R: Mínimo: antes de cada release. Ideal: diária com subset, semanal completa.</p>\n\n<p><strong>P: Load test em produção é uma boa ideia?</strong>  <br>R: Somente com feature flags, canary deployments e monitoramento rigoroso.</p>', 'Testes de Performance: Guia Completo de Load Testing e Stress Testing', '', 'inherit', 'closed', 'closed', '', '185-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '185', 'http://localhost:8082/ideiasti/?p=415', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('416', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a implementar testes de segurança eficazes: OWASP Top 10, penetration testing, SAST, DAST, SCA e análise de vulnerabilidades. Guia completo para proteção de aplicações.</p>\n\n<hr>\n<h2>Introdução à Segurança de Software</h2>\n\n<p>A segurança de software é um aspecto crítico do desenvolvimento moderno. Com o aumento de ataques cibernéticos e regulamentações como LGPD e GDPR, garantir que suas aplicações sejam seguras não é mais opcional - é uma necessidade de negócios.</p>\n\n<h3>Estatísticas Alarmantes</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Dado</th><th>Porcentagem</th></tr>\n<tr><td>Ataques direcionados a apps web</td><td>40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de todos os ataques</td></tr>\n<tr><td>Cust médio de violação de dados</td><td>R$ 6.4 milhões</td></tr>\n<tr><td>Tempo médio para detectar breach</td><td>207 dias</td></tr>\n<tr><td>apps com vulnerabilidades críticas</td><td>47{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>OWASP Top 10 presente em</td><td>94{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das apps</td></tr>\n</table></figure>\n\n<hr>\n<h2>OWASP Top 10: As Maiores Vulnerabilidades</h2>\n\n<p>O OWASP Top 10 é o guia definitivo das vulnerabilidades mais críticas em aplicações web. Vamos explorar cada uma.</p>\n\n<h3>A01 - Broken Access Control (Controle de Acesso Quebrado)</h3>\n\n<p><strong>Descrição:</strong> Usuários podem executar ações além de suas permissões permitidas.</p>\n\n<p><strong>Exemplos:</strong><br><pre><code># VULNERÁVEL - IDOR (Insecure Direct Object Reference)<br>@app.route(\'/pedidos/\')<br>def get_pedido(id):<br>    # Não verifica se o pedido pertence ao usuário logado<br>    return Pedido.query.get(id)</p>\n\n<p># SEGURO<br>@app.route(\'/pedidos/\')<br>@login_required<br>def get_pedido(id):<br>    pedido = Pedido.query.filter_by(<br>        id=id, <br>        usuario_id=current_user.id<br>    ).first_or_404()<br>    return pedido<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><br><ul><li>Implementar autorização em cada camada</li><ol><li>Negar por padrão</li><br><li>Usar IDs aleatórios (UUID)</li><br><li>Log de acessos</li><br></ol><br><h3>A02 - Cryptographic Failures (Falhas Criptográficas)</h3></p>\n\n<p><strong>Descrição:</strong> Exposição de dados sensíveis devido a criptografia inadequada.</p>\n\n<p><strong>Exemplos:</strong><br><pre><code># VULNERÁVEL<br>senha = \"senha123\"  # Sem hash<br>dados = dados.encode(\"utf-8\")  # Sem criptografia</p>\n\n<p># SEGURO<br>from cryptography.fernet import Fernet</p>\n\n<p># Gerar chave (armazenar em segurança!)<br>key = Fernet.generate_key()<br>cipher = Fernet(key)</p>\n\n<p>senha_hash = bcrypt.hashpw(\"senha123\".encode(), bcrypt.gensalt())<br>dados_criptografados = cipher.encrypt(dados)<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>Usar criptografia forte (AES-256, bcrypt, Argon2)</li><br><li>Gerenciar chaves com Key Vault</li><br><li>TLS para dados em trânsito</li><br><li>Nunca hardcodar secrets</li><br></ol><br><h3>A03 - Injection (Injeção)</h3></p>\n\n<p><strong>Descrição:</strong> Injeção de código malicioso através de inputs não sanitizados.</p>\n\n<p><strong>Exemplos:</strong></p>\n\n<pre><code>-- SQL Injection Vulnerável\ncursor.execute(f\"SELECT * FROM users WHERE email = \'{email}\'\")\n\n<p>-- SQL Injection Seguro<br>cursor.execute(\"SELECT * FROM users WHERE email = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s\", (email,))<br></code></pre></p>\n\n<pre><code># Command Injection Vulnerável\nos.system(f\"ping {host}\")\n\n<p># Command Injection Seguro<br>import subprocess<br>subprocess.run([\"ping\", host])  # Lista, não string!<br></code></pre></p>\n\n<pre><code>// XSS Vulnerável\ndocument.getElementById(\'comment\').innerHTML = userInput;\n\n<p>// XSS Seguro<br>document.getElementById(\'comment\').textContent = userInput;<br>// ou<br>element.textContent = sanitizeHTML(userInput);<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>Sanitizar e validar inputs</li><br><li>Usar ORM ou queries parametrizadas</li><br><li>Escapar outputs</li><br><li>Content Security Policy (CSP)</li><br></ol><br><h3>A04 - Insecure Design (Design Inseguro)</h3></p>\n\n<p><strong>Descrição:</strong> Arquitetura e modelagem de sistema com falhas de segurança inerentes.</p>\n\n<p><strong>Mitigação:</strong><ol><li>Threat modeling na fase de design</li><br><li>Segregar recursos por criticidade</li><br><li>Limitar tentativas de login (rate limiting)</li><br><li>Princípio de menor privilégio</li><br></ol><br><h3>A05 - Security Misconfiguration (Configuração de Segurança)</h3></p>\n\n<p><strong>Exemplos:</strong><br><pre><code># Docker vulnerável<br>docker run -p 80:80 -v /:/root image:latest</p>\n\n<p># Docker seguro<br>docker run <br>  --read-only <br>  --no-new-privileges <br>  -p 8080:8080 <br>  --cap-drop ALL <br>  image:latest<br></code></pre></p>\n\n<pre><code># Flask vulnerável\napp = Flask(__name__)\napp.debug = True  # Reveals code in errors!\n\n<p># Flask seguro<br>app = Flask(__name__)<br>app.config[\'DEBUG\'] = False<br>app.config[\'PROPAGATE_EXCEPTIONS\'] = False<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>Hardening de servidores</li><br><li>Revisão de configurações</li><br><li>Automação de patching</li><br><li>Arquitetura minimalista</li><br></ol><br><h3>A06 - Vulnerable and Outdated Components (Componentes Vulneráveis)</h3></p>\n\n<p><strong>Mitigação:</strong><br><pre><code># Verificar dependências vulneráveis<br>pip install safety<br>safety check</p>\n\n<p># npm audit<br>npm audit</p>\n\n<p># OWASP Dependency-Check<br>dependency-check --project App --scan ./lib<br></code></pre></p>\n\n<pre><code># GitHub Actions - Verificar vulnerabilidades em PR<ol><li>name: Run Snyk Security Test</li>\n</ol>  uses: snyk/actions/python@master\n  with:\n    args: --severity-threshold=high\n  env:\n    SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}\n</code></pre>\n\n<h3>A07 - Identification and Authentication Failures</h3>\n\n<pre><code># Vulnerável - Sem rate limiting\n@app.route(\'/login\', methods=[\'POST\'])\ndef login():\n    user = User.query.filter_by(email=email).first()\n    if bcrypt.checkpw(password, user.password_hash):\n        login_user(user)\n        return redirect(\'/dashboard\')\n\n<p># Seguro - Com rate limiting<br>from flask_limiter import Limiter<br>limiter = Limiter(app)</p>\n\n<p>@app.route(\'/login\', methods=[\'POST\'])<br>@limiter.limit(\"5 per minute\")<br>def login():<br>    # ... resto do código<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>MFA (Autenticação Multifator)</li><br><li>Rate limiting em autenticação</li><br><li>Senhas complexas (passphrase &gt; senha)</li><br><li>Sessões com timeout</li><br></ol><br><h3>A08 - Software and Data Integrity Failures</h3></p>\n\n<pre><code># GitHub Actions - Verificar integridade de dependências<ol><li>name: Verify checksums</li>\n</ol>  run: |\n    echo \"$CHECKSUM\" &gt; expected_checksum.txt\n    sha256sum -c expected_checksum.txt\n  env:\n    CHECKSUM: ${{ secrets.CHECKSUM }}\n</code></pre>\n\n<p><strong>Mitigação:</strong><ol><li>Verificar integridade de dependências</li><br><li>Assinar artefatos</li><br><li>CI/CD com aprovações</li><br><li>Não confiar em dados não verificados</li><br></ol><br><h3>A09 - Security Logging and Monitoring Failures</h3></p>\n\n<pre><code>import logging\nfrom flask import request\n\n<p>logger = logging.getLogger(__name__)</p>\n\n<p>@app.before_request<br>def log_request():<br>    logger.info({<br>        \'ip\': request.remote_addr,<br>        \'method\': request.method,<br>        \'path\': request.path,<br>        \'user_agent\': request.headers.get(\'User-Agent\')<br>    })</p>\n\n<p>@app.route(\'/login\', methods=[\'POST\'])<br>def login():<br>    if failed_login(user):<br>        logger.warning({<br>            \'event\': \'failed_login\',<br>            \'email\': request.form.get(\'email\'),<br>            \'ip\': request.remote_addr,<br>            \'attempts\': get_attempts(request.remote_addr)<br>        })<br>        # Alertar se muitas tentativas<br></code></pre></p>\n\n<p><strong>Mitigação:</strong><ol><li>Logging de todos os eventos de segurança</li><br><li>Monitoramento 24/7</li><br><li>Alertas para anomalias</li><br><li>Retenção de logs adequada</li><br></ol><br><h3>A10 - Server-Side Request Forgery (SSRF)</h3></p>\n\n<pre><code># Vulnerável\n@app.route(\'/fetch_url\')\ndef fetch_url():\n    url = request.args.get(\'url\')\n    response = requests.get(url)  # Pode acessar internamente!\n    return response.text\n\n<p># Seguro<br>from urllib.parse import urlparse</p>\n\n<p>ALLOWED_HOSTS = [\'api.exemplo.com\', \'cdn.exemplo.com\']</p>\n\n<p>@app.route(\'/fetch_url\')<br>def fetch_url():<br>    url = request.args.get(\'url\')<br>    parsed = urlparse(url)</p>\n\n<p>if parsed.hostname not in ALLOWED_HOSTS:<br>        abort(403)</p>\n\n<p># Block private IPs<br>    if parsed.hostname in [\'localhost\', \'127.0.0.1\', \'0.0.0.0\']:<br>        abort(403)</p>\n\n<p>return requests.get(url).text<br></code></pre></p>\n\n<hr>\n<h2>Ferramentas de Teste de Segurança</h2>\n\n<h3>SAST - Static Application Security Testing</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Linguagem</th><th>Tipo</th><th>Custo</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Multi</td><td>Self-hosted</td><td>Grátis/Enterprise</td></tr>\n<tr><td><strong>Snyk Code</strong></td><td>Multi</td><td>Cloud</td><td>Grátis/Pro</td></tr>\n<tr><td><strong>Semgrep</strong></td><td>Multi</td><td>CLI</td><td>Grátis</td></tr>\n<tr><td><strong>Checkmarx</strong></td><td>Multi</td><td>Enterprise</td><td>Comercial</td></tr>\n<tr><td><strong>Fortify</strong></td><td>Multi</td><td>Enterprise</td><td>Comercial</td></tr>\n</table></figure>\n\n<h3>DAST - Dynamic Application Security Testing</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Custo</th></tr>\n<tr><td><strong>OWASP ZAP</strong></td><td>Open Source</td><td>Grátis</td></tr>\n<tr><td><strong>Burp Suite</strong></td><td>Freemium</td><td>$399+/ano</td></tr>\n<tr><td><strong>Acunetix</strong></td><td>Commercial</td><td>Sob consulta</td></tr>\n<tr><td><strong>Netsparker</strong></td><td>Commercial</td><td>Sob consulta</td></tr>\n</table></figure>\n\n<h3>SCA - Software Composition Analysis</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Custo</th></tr>\n<tr><td><strong>Snyk</strong></td><td>Dependencies</td><td>Grátis/Pro</td></tr>\n<tr><td><strong>OWASP Dep-Check</strong></td><td>Dependencies</td><td>Grátis</td></tr>\n<tr><td><strong>WhiteSource</strong></td><td>Enterprise</td><td>Comercial</td></tr>\n<tr><td><strong>FOSSA</strong></td><td>License compliance</td><td>Grátis/Pro</td></tr>\n</table></figure>\n\n<h3>IAST - Interactive Application Security Testing</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th></tr>\n<tr><td><strong>Contrast Security</strong></td><td>Commercial</td></tr>\n<tr><td><strong>Hdiv</strong></td><td>Commercial</td></tr>\n<tr><td><strong>Seeker</strong> (Synopsys)</td><td>Commercial</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando Testes de Segurança no CI/CD</h2>\n\n<h3>GitHub Actions - Pipeline de Segurança</h3>\n\n<pre><code>name: Security Pipeline\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  sast:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Semgrep<br>        uses: returntocorp/semgrep-action@v1<br>        with:<br>          config: &gt;<br>            p/owasp-top-ten<br>            p/nodejs-scan</p>\n\n<p>- name: SonarCloud Scan<br>        uses: SonarSource/sonarcloud-github-action@master<br>        env:<br>          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}</p>\n\n<p>sca:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Snyk<br>        uses: snyk/actions/python@master<br>        with:<br>          args: --severity-threshold=high</p>\n\n<p>dast:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Start application<br>        run: docker-compose up -d</p>\n\n<p>- name: OWASP ZAP Scan<br>        uses: zaproxy/action-baseline@v0.9.0<br>        with:<br>          target: \'https://localhost:8443\'<br>          rules_rules_name: \'api-scan\'<br></code></pre></p>\n\n<hr>\n<h2>Penetration Testing</h2>\n\n<h3>Metodologia OWASP</h3>\n\n<pre><code>1. Information Gathering\n   - Footprinting\n   - Enumeration\n   <ol><li>Threat Modeling</li>\n</ol>   - Identify assets\n   - Analyze threats\n   <ol><li>Vulnerability Analysis</li>\n</ol>   - Automated scanning\n   - Manual testing\n   <ol><li>Exploitation</li>\n</ol>   - Proof of concept\n   - Impact assessment\n   <ol><li>Reporting</li>\n</ol>   - Findings\n   - Recommendations\n   - Remediation\n</code></pre>\n\n<h3>Tipos de Pentest</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo</th><th>Conhecimento</th><th>Escopo</th><th>Custo</th></tr>\n<tr><td><strong>Black Box</strong></td><td>Zero</td><td>Sem informação</td><td>$$$</td></tr>\n<tr><td><strong>Gray Box</strong></td><td>Parcial</td><td>Credenciais limitadas</td><td>$$$$</td></tr>\n<tr><td><strong>White Box</strong></td><td>Total</td><td>Código e documentação</td><td>$$$$$</td></tr>\n</table></figure>\n\n<h3>Ferramentas de Pentest</h3>\n\n<pre><code># Reconhecimento\nnmap -sV -sC target.com\nsubfinder -d target.com\namass enum -passive -d target.com\n\n<p># Scanning<br>nikto -h https://target.com<br>sqlmap -u \"https://target.com/api?id=1\"<br>XSStrike -u \"https://target.com/search?q=test\"</p>\n\n<p># Exploitation<br>metasploit framework<br>burp suite professional<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Segurança de software é responsabilidade de todos. Implementar testes de segurança de forma integrada ao ciclo de desenvolvimento é essencial para reduzir riscos e proteger dados sensíveis.</p>\n\n<p><strong>Resumo:</strong><ol><li>OWASP Top 10 deve ser training obrigatório</li><br><li>SAST/DAST/SCA integrados ao CI/CD</li><br><li>Pentests periódicos são essenciais</li><br><li>Nunca confie em inputs de usuários</li><br><li>Criptografia forte é não negociável</li></ol></ul></p>\n\n<hr>\n<h3>FAQ</h3>\n\n<p><strong>P: Com que frequência devo fazer pentests?</strong>  <br>R: Mínimo annually, idealmente a cada 6 meses ou após grandes mudanças.</p>\n\n<p><strong>P: SAST substitui DAST?</strong>  <br>R: Não. SAST analisa código, DAST testa aplicação em execução. São complementares.</p>\n\n<p><strong>P: Como começar com segurança em devs?</strong>  <br>R: Treinamento OWASP Top 10, implementar SAST no CI/CD, secure code review.</p>\n\n<p><strong>P: Bug bounty substitui pentest?</strong>  <br>R: Não. São complementares. Bug bounty encontra issues em produção, pentest é controlado.</p>', 'Testes de Segurança: OWASP, Penetration Testing e Análise de Vulnerabilidades', '', 'inherit', 'closed', 'closed', '', '186-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '186', 'http://localhost:8082/ideiasti/?p=416', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('417', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Descubra como integrar QA no DevOps: CI/CD pipelines, quality gates, automação de testes em pipeline e métricas de qualidade para equipes DevOps modernas.</p>\n\n<hr>\n<h2>A Evolução de QA para DevOps</h2>\n\n<p>DevOps representa a fusão de desenvolvimento e operações, com QA como ponte essencial entre os dois mundos. A qualidade não é mais uma fase separada, mas um valor integrado em cada etapa do pipeline.</p>\n\n<h3>Transformação Cultural</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tradicional</th><th>DevOps</th></tr>\n<tr><td>QA como gatekeeper</td><td>QA como habilitador</td></tr>\n<tr><td>Testes no final</td><td>Testes contínuos</td></tr>\n<tr><td>Releases trimestrais</td><td>Deploys diários</td></tr>\n<tr><td>Siloed teams</td><td>Squads multifuncionais</td></tr>\n<tr><td>Reativo</td><td>Proativo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Pipeline de CI/CD com Qualidade Integrada</h2>\n\n<h3>Visão Geral do Pipeline</h3>\n\n<pre><code>Code → Build → Test → Security → Deploy → Monitor → Feedback\n  ↓      ↓       ↓       ↓          ↓         ↓         ↓\nCommit  Unit   Integration  SAST/DAST  Staging  APM     Retrospectiva\nReview  Tests   + E2E       SCA        Deploy   Alerts\n</code></pre>\n\n<h3>Estrutura do Pipeline</h3>\n\n<h4>1. Stage: Code (Commit)</h4>\n\n<pre><code># .github/workflows/code-quality.yml\nname: Code Quality\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  lint:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Set up Python<br>        uses: actions/setup-python@v5<br>        with:<br>          python-version: \'3.11\'</p>\n\n<p>- name: Install linters<br>        run: pip install ruff black flake8</p>\n\n<p>- name: Run Ruff (Linter)<br>        run: ruff check .</p>\n\n<p>- name: Run Black (Formatter)<br>        run: black --check .</p>\n\n<p>- name: Run type checker<br>        run: pip install mypy &amp;&amp; mypy src/<br></code></pre></p>\n\n<h4>2. Stage: Build</h4>\n\n<pre><code>  build:\n    needs: lint\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n<p>- name: Build Docker image<br>        run: |<br>          docker build <br>            --tag app:${{ github.sha }} <br>            --tag app:latest <br>            .</p>\n\n<p>- name: Run Trivy (Container scan)<br>        uses: aquasecurity/trivy-action@master<br>        with:<br>          image-ref: \'app:${{ github.sha }}\'<br>          format: \'sarif\'<br>          output: \'trivy-results.sarif\'<br></code></pre></p>\n\n<h4>3. Stage: Unit Tests</h4>\n\n<pre><code>  unit-tests:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n<p>- name: Run Unit Tests<br>        run: |<br>          docker-compose run --rm test pytest <br>            --cov=src <br>            --cov-report=xml <br>            --cov-fail-under=80</p>\n\n<p>- name: Upload coverage<br>        uses: codecov/codecov-action@v3<br></code></pre></p>\n\n<h4>4. Stage: Integration Tests</h4>\n\n<pre><code>  integration-tests:\n    runs-on: ubuntu-latest\n    services:\n      postgres:\n        image: postgres:15\n        env:\n          POSTGRES_DB: test\n          POSTGRES_USER: test\n          POSTGRES_PASSWORD: test\n        options: &gt;-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 5432:5432\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Integration Tests<br>        env:<br>          DATABASE_URL: postgresql://test:test@localhost:5432/test<br>        run: |<br>          docker-compose run --rm test pytest <br>            tests/integration/ <br>            -v <br>            --tb=short<br></code></pre></p>\n\n<h4>5. Stage: E2E Tests</h4>\n\n<pre><code>  e2e-tests:\n    runs-on: ubuntu-latest\n    if: github.event_name == \'push\'\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run E2E Tests<br>        run: |<br>          npm ci<br>          npx playwright install --with-deps<br>          npm run test:e2e</p>\n\n<p>- name: Upload test results<br>        uses: actions/upload-artifact@v4<br>        if: always()<br>        with:<br>          name: playwright-report<br>          path: playwright-report/<br></code></pre></p>\n\n<h4>6. Stage: Security Scan</h4>\n\n<pre><code>  security:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n<p>- name: SAST with Semgrep<br>        uses: returntocorp/semgrep-action@v1</p>\n\n<p>- name: SCA with Snyk<br>        uses: snyk/actions/python@master<br>        with:<br>          args: --severity-threshold=high</p>\n\n<p>- name: DAST with OWASP ZAP<br>        run: |<br>          docker run -t owasp/zap2docker-stable <br>            zap-baseline.py <br>            -t https://staging.exemplo.com <br>            -J zap-results.json<br></code></pre></p>\n\n<h4>7. Stage: Deploy (Quality Gates)</h4>\n\n<pre><code>  deploy-staging:\n    needs: [security, e2e-tests]\n    runs-on: ubuntu-latest\n    environment: staging\n\n<p>steps:<br>      - name: Deploy to Staging<br>        run: |<br>          kubectl apply -f k8s/staging/</p>\n\n<p>- name: Smoke Tests<br>        run: |<br>          curl -f https://staging.exemplo.com/health || exit 1</p>\n\n<p>- name: Notify<br>        run: |<br>          echo \"Deploy concluído para staging\"<br></code></pre></p>\n\n<hr>\n<h2>Quality Gates</h2>\n\n<p>Quality Gates são pontos de verificação que determinam se o código pode avançar no pipeline.</p>\n\n<h3>Critérios de Quality Gate</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Gate</th><th>Critério</th><th>Ação se Falhar</th></tr>\n<tr><td><strong>Code Coverage</strong></td><td>&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>Blocker</td></tr>\n<tr><td><strong>Code Quality</strong></td><td>No critical issues</td><td>Blocker</td></tr>\n<tr><td><strong>Security Scan</strong></td><td>No high/critical CVEs</td><td>Blocker</td></tr>\n<tr><td><strong>Unit Tests</strong></td><td>100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} passing</td><td>Blocker</td></tr>\n<tr><td><strong>E2E Tests</strong></td><td>&gt;95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} passing</td><td>Blocker</td></tr>\n<tr><td><strong>Performance</strong></td><td>P95 &lt; 500ms</td><td>Warning</td></tr>\n</table></figure>\n\n<h3>Implementação de Quality Gates</h3>\n\n<pre><code># Quality Gate no GitHub Actions\n<ul><li>name: Check Quality Gates</li></ul>\n  run: |\n    # Verificar cobertura\n    COVERAGE=$(cat coverage/coverage.xml | grep -oP \'(?&lt;=line-covered=&quot;)d+&#039;)\n    TOTAL=$(cat coverage/coverage.xml | grep -oP &#039;(?&lt;=line-count=&quot;)d+&#039;)\n    PERCENTAGE=$((COVERAGE * 100 / TOTAL))\n\n<p>echo \"Coverage: ${PERCENTAGE}{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</p>\n\n<p>if [ $PERCENTAGE -lt 80 ]; then<br>      echo \"❌ Coverage below 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br>      exit 1<br>    fi</p>\n\n<p># Verificar security<br>    if [ -f \"snyk/snyk.sarif\" ]; then<br>      VULNS=$(cat snyk/snyk.sarif | grep -c \"high|critical\")<br>      if [ $VULNS -gt 0 ]; then<br>        echo \"❌ Security vulnerabilities found\"<br>        exit 1<br>      fi<br>    fi</p>\n\n<p>echo \"✅ All quality gates passed\"<br></code></pre></p>\n\n<hr>\n<h2>TestContainers para Testes de Integração</h2>\n\n<pre><code># testcontainers_example.py\nimport pytest\nfrom selenium import webdriver\nfrom selenium.webdriver.common.by import By\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\n\n<p>@pytest.fixture(scope=\"class\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as postgres:<br>        url = postgres.get_connection_url()<br>        yield url</p>\n\n<p>@pytest.fixture(scope=\"class\")<br>def redis():<br>    with RedisContainer(\"redis:7\") as redis:<br>        yield redis.get_connection_url()</p>\n\n<p>@pytest.fixture(scope=\"class\")<br>def app(postgres, redis):<br>    \"\"\"SUT com dependências reais\"\"\"<br>    import os<br>    os.environ[\'DATABASE_URL\'] = postgres<br>    os.environ[\'REDIS_URL\'] = redis</p>\n\n<p>from app import create_app<br>    app = create_app()<br>    app.config[\'TESTING\'] = True</p>\n\n<p>with app.app_context():<br>        from models import db<br>        db.create_all()</p>\n\n<p>yield app</p>\n\n<p>@pytest.fixture<br>def client(app):<br>    return app.test_client()<br></code></pre></p>\n\n<hr>\n<h2>Métricas DevOps de Qualidade</h2>\n\n<h3>Four Keys (DORA Metrics)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Descrição</th><th>Target Elite</th></tr>\n<tr><td><strong>Deployment Frequency</strong></td><td>Frequência de deploys</td><td>On-demand (várias vezes/dia)</td></tr>\n<tr><td><strong>Lead Time for Changes</strong></td><td>Tempo do commit ao prod</td><td>&lt;1 hora</td></tr>\n<tr><td><strong>Time to Restore</strong></td><td>Tempo para recovery</td><td>&lt;1 hora</td></tr>\n<tr><td><strong>Change Failure Rate</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de deploys com falha</td><td>&lt;15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n</table></figure>\n\n<h3>Dashboard de Qualidade</h3>\n\n<pre><code># Métricas para Grafana\npanels:\n  - title: \"Test Coverage\"\n    query: \"coverage_percentage{job=\'unit-tests\'}\"\n    thresholds:\n      - value: 80\n        color: green\n      - value: 60\n        color: yellow\n      - value: 0\n        color: red\n\n<p>- title: \"Test Pass Rate\"<br>    query: \"rate(test_passed_total[5m]) / rate(test_total[5m])\"<br>    thresholds:<br>      - value: 0.95<br>        color: green</p>\n\n<p>- title: \"Pipeline Duration\"<br>    query: \"histogram_quantile(0.95, pipeline_duration_bucket)\"<br>    unit: \"s\"</p>\n\n<p>- title: \"Failed Deployments\"<br>    query: \"rate(deployment_failed_total[1h])\"<br></code></pre></p>\n\n<hr>\n<h2>Estratégia de Deploy</h2>\n\n<h3>Canary Deployment</h3>\n\n<pre><code># Argo Rollouts Canary\napiVersion: argoproj.io/v1alpha1\nkind: Rollout\nmetadata:\n  name: my-app\nspec:\n  strategy:\n    canary:\n      steps:\n        - setWeight: 5\n        - pause: {duration: 10m}\n        - setWeight: 20\n        - pause: {duration: 10m}\n        - setWeight: 50\n        - pause: {duration: 30m}\n      analysis:\n        templates:\n          - templateName: success-rate\n        args:\n          - name: service-name\n            value: my-app-canary\n</code></pre>\n\n<h3>Feature Flags</h3>\n\n<pre><code># Feature Flags com LaunchDarkly\nimport launchdarkly_server_sdk\n\n<p>client = launchdarkly_server_sdk.Client(\"sdk-key\")</p>\n\n<p>user = {<br>    \"key\": user_id,<br>    \"email\": email,<br>    \"custom\": {<br>        \"team\": team<br>    }<br>}</p>\n\n<p># Check feature flag<br>if client.variation(\"new_checkout\", user, False):<br>    return new_checkout_flow()<br>else:<br>    return legacy_checkout_flow()<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Integrar QA no DevOps não é apenas sobre ferramentas - é uma mudança cultural. As chaves para o sucesso são:<br><ol><li><strong>Automação em primeiro lugar</strong> - Tudo que pode ser automatizado deve</li><br><li><strong>Quality Gates efetivos</strong> - Critérios claros para avanzar</li><br><li><strong>Feedback rápido</strong> - Detectar problemas cedo</li><br><li><strong>Métricas de qualidade</strong> - Medir é melhorar</li><br><li><strong>Melhoria contínua</strong> - Retrospectivas e ajustes</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Como começar a integrar QA em DevOps?</strong>  <br>R: Comece com unit tests no CI, depois expanda para integração e E2E gradualmente.</p>\n\n<p><strong>P: Quantos testes devo ter no pipeline?</strong>  <br>R: Priorize por impacto e risco. Cobertura &gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} é bom target.</p>\n\n<p><strong>P: Quality Gates devem ser obrigatórios?</strong>  <br>R: Para código em main, sim. Para feature branches, podem ser warnings.</p>\n\n<p><strong>P: Como medir ROI de DevOps QA?</strong>  <br>R: DORA metrics + redução de bugs em produção + tempo economizado.</p>', 'DevOps e QA: Integrando Qualidade no Pipeline de Entrega Contínua', '', 'inherit', 'closed', 'closed', '', '187-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '187', 'http://localhost:8082/ideiasti/?p=417', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('418', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a testar aplicativos mobile: Appium, Espresso, XCTest, testes emulators vs dispositivos reais, e automação mobile para iOS e Android.</p>\n\n<hr>\n<h2>Introdução aos Testes Mobile</h2>\n\n<p>Testar aplicativos mobile apresenta desafios únicos: múltiplas versões de OS, diferentes tamanhos de tela, conectividade variável e interação touch. Uma estratégia de teste mobile eficaz deve cobrir dispositivos, plataformas e condições de uso diversas.</p>\n\n<h3>Panorama Mobile</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Dado</th><th>Valor</th></tr>\n<tr><td>Apps disponíveis</td><td>6.5+ milhões</td></tr>\n<tr><td>Tempo médio em apps</td><td>4.8 horas/dia</td></tr>\n<tr><td>Usuários mobile</td><td>7.33 bilhões</td></tr>\n<tr><td>Fragmentação Android</td><td>24.000+ dispositivos</td></tr>\n<tr><td>iOS versions ativas</td><td>4-5 simultâneas</td></tr>\n</table></figure>\n\n<hr>\n<h2>Estratégia de Testes Mobile</h2>\n\n<h3>Pirâmide de Testes Mobile</h3>\n\n<pre><code>              /\n             /           E2E Tests\n            /____        (10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\n           /             Funcionalidade completa\n          /              em dispositivos reais\n         /__________\n        /               Integration Tests\n       /______________  (20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\n      /                 Componentes e módulos\n     /__________________\n    /                     Unit Tests\n   /______________________ (70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\n   Componentes e lógica\n</code></pre>\n\n<h3>Dispositivos: Emuladores vs. Reais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Aspecto</th><th>Emuladores</th><th>Dispositivos Reais</th></tr>\n<tr><td><strong>Custo</strong></td><td>Grátis</td><td>Dispositivos físicos</td></tr>\n<tr><td><strong>Velocidade</strong></td><td>Mais lentos</td><td>Mais rápidos</td></tr>\n<tr><td><strong>Acurácia</strong></td><td>Limitada</td><td>Real</td></tr>\n<tr><td><strong>Hardware</strong></td><td>CPU/RAM limitados</td><td>Real performance</td></tr>\n<tr><td><strong>Sensores</strong></td><td>Simulados</td><td>Reais (GPS, câmera)</td></tr>\n<tr><td><strong>Rede</strong></td><td>Controlável</td><td>Real, variável</td></tr>\n</table></figure>\n\n<p><strong>Recomendação:</strong> Usar ambos - emuladores para CI/rapidez, dispositivos reais para QA final.</p>\n\n<hr>\n<h2>Ferramentas de Teste Mobile</h2>\n\n<h3>1. Appium - Cross-Platform</h3>\n\n<p><strong>Melhor para:</strong> Testes cross-platform (iOS + Android) com uma codebase.</p>\n\n<h4>Instalação</h4>\n\n<pre><code># macOS com Homebrew\nbrew install node\nnpm install -g appium\nnpm install -g appium-doctor\nappium &amp;\n</code></pre>\n\n<h4>Configuração Android</h4>\n\n<pre><code># SDK Android\nexport ANDROID_HOME=~/Android/Sdk\nexport PATH=$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools\n\n<p># Start emulador<br>$ANDROID_HOME/emulator/emulator -avd Pixel_6_API_33<br></code></pre></p>\n\n<h4>Script Appium (Python)</h4>\n\n<pre><code>from appium import webdriver\nfrom appium.webdriver.common.appiumby import AppiumBy\nfrom appium.webdriver.common.touch_action import TouchAction\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n<p>class TestApp:<br>    @pytest.fixture<br>    def driver(self):<br>        capabilities = {<br>            \"platformName\": \"Android\",<br>            \"deviceName\": \"Pixel_6_API_33\",<br>            \"app\": \"/path/to/app.apk\",<br>            \"automationName\": \"UiAutomator2\",<br>            \"autoGrantPermissions\": True<br>        }</p>\n\n<p>driver = webdriver.Remote(<br>            \"http://localhost:4723/wd/hub\",<br>            capabilities<br>        )<br>        yield driver<br>        driver.quit()</p>\n\n<p>def test_login_flow(self, driver):<br>        # Aguardar elementos<br>        wait = WebDriverWait(driver, 10)</p>\n\n<p># Clicar no campo email<br>        email_field = wait.until(<br>            EC.presence_of_element_located(<br>                (AppiumBy.ANDROID_UIAUTOMATOR, \'resourceId(\"com.app:id/email\")\')<br>            )<br>        )<br>        email_field.send_keys(\"usuario@test.com\")</p>\n\n<p># Clicar no campo senha<br>        driver.find_element(<br>            AppiumBy.ANDROID_UIAUTOMATOR,<br>            \'resourceId(\"com.app:id/password\")\'<br>        ).send_keys(\"senha123\")</p>\n\n<p># Clicar em Login<br>        driver.find_element(<br>            AppiumBy.ANDROID_UIAUTOMATOR,<br>            \'text(\"Entrar\")\'<br>        ).click()</p>\n\n<p># Verificar redirecionamento para dashboard<br>        wait.until(<br>            EC.presence_of_element_located(<br>                (AppiumBy.ANDROID_UIAUTOMATOR, \'text(\"Dashboard\")\')<br>            )<br>        )</p>\n\n<p>def test_swipe_gesture(self, driver):<br>        # Obter tamanho da tela<br>        size = driver.get_window_size()<br>        start_x = size[\'width\'] * 0.5<br>        start_y = size[\'height\'] * 0.8<br>        end_y = size[\'height\'] * 0.2</p>\n\n<p># Swipe up<br>        TouchAction(driver).press(start_x, start_y).move_to(0, -500).release().perform()</p>\n\n<p>def test_scroll_to_element(self, driver):<br>        # Scroll até encontrar elemento<br>        driver.find_element(<br>            AppiumBy.ANDROID_UIAUTOMATOR,<br>            \'new UiScrollable(new UiSelector()).scrollIntoView(text(\"Settings\"))\'<br>        )<br></code></pre></p>\n\n<h3>2. Espresso - Android Nativo</h3>\n\n<p><strong>Melhor para:</strong> Projetos Android com Kotlin/Java.</p>\n\n<h4>Dependências (build.gradle)</h4>\n\n<pre><code>androidTestImplementation \'androidx.test.espresso:espresso-core:3.5.1\'\nandroidTestImplementation \'androidx.test:runner:1.5.2\'\nandroidTestImplementation \'androidx.test:rules:1.5.0\'\n</code></pre>\n\n<h4>Script Espresso (Kotlin)</h4>\n\n<pre><code>package com.example.app\n\n<p>import androidx.test.ext.junit.rules.ActivityScenarioRule<br>import androidx.test.ext.junit.runners.AndroidJUnit4<br>import androidx.test.filters.LargeTest<br>import org.junit.Rule<br>import org.junit.Test<br>import org.junit.runner.RunWith<br>import static androidx.test.espresso.Espresso.*<br>import static androidx.test.espresso.action.ViewActions.*<br>import static androidx.test.espresso.assertion.ViewAssertions.*<br>import static androidx.test.espresso.matcher.ViewMatchers.*</p>\n\n<p>@RunWith(AndroidJUnit4::class)<br>@LargeTest<br>class LoginTest {</p>\n\n<p>@get:Rule<br>    val activityRule = ActivityScenarioRule(LoginActivity::class.java)</p>\n\n<p>@Test<br>    fun testLoginWithValidCredentials() {<br>        // Preencher email<br>        onView(withId(R.id.email_input))<br>            .perform(typeText(\"usuario@test.com\"), closeSoftKeyboard())</p>\n\n<p>// Preencher senha<br>        onView(withId(R.id.password_input))<br>            .perform(typeText(\"senha123\"), closeSoftKeyboard())</p>\n\n<p>// Clicar em Login<br>        onView(withId(R.id.login_button))<br>            .perform(click())</p>\n\n<p>// Verificar navegação para Dashboard<br>        onView(withId(R.id.dashboard_title))<br>            .check(matches(isDisplayed()))<br>    }</p>\n\n<p>@Test<br>    fun testLoginWithInvalidCredentials() {<br>        onView(withId(R.id.email_input))<br>            .perform(typeText(\"invalido@test.com\"))<br>            .perform(typeText(\"senhaerrada\"), closeSoftKeyboard())</p>\n\n<p>onView(withId(R.id.login_button)).perform(click())</p>\n\n<p>// Verificar mensagem de erro<br>        onView(withId(R.id.error_message))<br>            .check(matches(withText(\"Credenciais inválidas\")))<br>    }</p>\n\n<p>@Test<br>    fun testScrollThroughList() {<br>        // Scroll down<br>        onView(withId(R.id.product_list))<br>            .perform(<br>                RecyclerViewActions.scrollTo(<br>                    hasDescendant(withText(\"Product 50\"))<br>                )<br>            )</p>\n\n<p>// Clicar no item<br>        onView(withText(\"Product 50\"))<br>            .perform(click())<br>    }<br>}<br></code></pre></p>\n\n<h3>3. XCTest - iOS Nativo</h3>\n\n<p><strong>Melhor para:</strong> Projetos iOS com Swift/Objective-C.</p>\n\n<h4>Script XCTest (Swift)</h4>\n\n<pre><code>import XCTest\n\n<p>class LoginTests: XCTestCase {</p>\n\n<p>var app: XCUIApplication!</p>\n\n<p>override func setUp() {<br>        super.setUp()<br>        continueAfterFailure = false<br>        app = XCUIApplication()<br>        app.launchArguments = [\"--uitesting\"]<br>        app.launch()<br>    }</p>\n\n<p>func testLoginWithValidCredentials() {<br>        // Acessar campos<br>        let emailField = app.textFields[\"email_input\"]<br>        let passwordField = app.secureTextFields[\"password_input\"]<br>        let loginButton = app.buttons[\"login_button\"]</p>\n\n<p>// Preencher credenciais<br>        emailField.tap()<br>        emailField.typeText(\"usuario@test.com\")</p>\n\n<p>passwordField.tap()<br>        passwordField.typeText(\"senha123\")</p>\n\n<p>// Clicar em Login<br>        loginButton.tap()</p>\n\n<p>// Verificar Dashboard<br>        XCTAssertTrue(<br>            app.staticTexts[\"dashboard_title\"].waitForExistence(timeout: 5)<br>        )<br>    }</p>\n\n<p>func testPullToRefresh() {<br>        // Encontrar UITableView<br>        let tableView = app.tables[\"product_list\"]</p>\n\n<p>// Pull to refresh<br>        let firstCell = tableView.cells.element(boundBy: 0)<br>        let cellCenter = firstCell.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0))<br>        let pullPoint = cellCenter.withOffset(CGVector(dx: 0, dy: -100))</p>\n\n<p>cellCenter.press(forDuration: 0, thenDragTo: pullPoint)</p>\n\n<p>// Verificar refresh indicator<br>        XCTAssertTrue(app.activityIndicators[\"refresh_indicator\"].exists)<br>    }</p>\n\n<p>func testSwipeToDelete() {<br>        let tableView = app.tables[\"product_list\"]<br>        let cell = tableView.cells.element(boundBy: 0)</p>\n\n<p>// Swipe left<br>        cell.swipeLeft()</p>\n\n<p>// Clicar em Delete<br>        app.buttons[\"delete_button\"].tap()</p>\n\n<p>// Verificar confirmação<br>        app.alerts[\"Confirma exclusão?\"].buttons[\"Excluir\"].tap()<br>    }<br>}<br></code></pre></p>\n\n<hr>\n<h2>Testes em Dispositivos Reais</h2>\n\n<h3>Serviços de Cloud Testing</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Serviço</th><th>Dispositivos</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>BrowserStack</strong></td><td>3000+</td><td>$29+/mês</td><td>Cobertura completa</td></tr>\n<tr><td><strong>Sauce Labs</strong></td><td>1000+</td><td>$39+/mês</td><td>Enterprise</td></tr>\n<tr><td><strong>AWS Device Farm</strong></td><td>数百</td><td>Sob demanda</td><td>AWS integration</td></tr>\n<tr><td><strong>Firebase Test Lab</strong></td><td>数百</td><td>Pay-per-use</td><td>Android focused</td></tr>\n</table></figure>\n\n<h3>Setup BrowserStack</h3>\n\n<pre><code># pytest + BrowserStack\nfrom appium import webdriver\n\n<p>def get_browserstack_driver():<br>    desired_caps = {<br>        \"platformName\": \"android\",<br>        \"deviceName\": \"Samsung Galaxy S23\",<br>        \"os_version\": \"13.0\",<br>        \"app\": \"bs://APP_ID\",<br>        \"browserstack.user\": \"USER\",<br>        \"browserstack.key\": \"ACCESS_KEY\",<br>        \"browserstack.debug\": True,<br>        \"browserstack.networkLogs\": True<br>    }</p>\n\n<p>return webdriver.Remote(<br>        \"http://hub-cloud.browserstack.com/wd/hub\",<br>        desired_caps<br>    )<br></code></pre></p>\n\n<hr>\n<h2>Cenários de Teste Mobile</h2>\n\n<h3>1. Testes de Interface</h3>\n\n<pre><code>def test_responsividade_telas():\n    \"\"\"Testa layouts em diferentes tamanhos de tela\"\"\"\n    sizes = [\n        (360, 640),  # Small phone\n        (390, 844),  # iPhone 12/13\n        (412, 915),  # Large phone\n        (600, 1024), # Tablet portrait\n    ]\n\n<p>for width, height in sizes:<br>        driver.execute_script(f\"setWindowSize({width}, {height})\")</p>\n\n<p># Verificar elementos não se sobrepõem<br>        assert not elements_overlap(header, footer)<br>        assert text_is_readable(header)<br></code></pre></p>\n\n<h3>2. Testes de Conectividade</h3>\n\n<pre><code>def test_offline_mode():\n    \"\"\"Testa comportamento sem internet\"\"\"\n    # Desligar rede\n    driver.set_network_connection(0)  # Airplane mode\n\n<p># Tentar acessar conteúdo offline<br>    assert app.has_cached_content()<br>    assert app.can_show_cached_products()</p>\n\n<p># Tentar ação que requer internet<br>    with pytest.raises(NetworkError):<br>        app.submit_order()</p>\n\n<p># Reconectar<br>    driver.set_network_connection(6)  # WiFi</p>\n\n<p># Sincronizar<br>    app.sync_pending_orders()<br>    assert order.was_synced()<br></code></pre></p>\n\n<h3>3. Testes de Performance</h3>\n\n<pre><code>@Test\nfun testListScrollPerformance() {\n    val recyclerView = espresso.onView(\n        withId(R.id.product_list)\n    )\n\n<p>// Medir FPS durante scroll<br>    val monitor = FrameMetricsMonitor()</p>\n\n<p>recyclerView.perform(<br>        scrollToPosition(100),<br>        scrollToPosition(50),<br>        scrollToPosition(0)<br>    )</p>\n\n<p>val metrics = monitor.getMetrics()</p>\n\n<p>// Verificar 60 FPS (16.67ms por frame)<br>    assertThat(metrics.averageFrameTime).isLessThan(20.0)<br>    assertThat(metrics.droppedFrames).isLessThan(5)<br>}<br></code></pre></p>\n\n<hr>\n<h2>Appium + CI/CD</h2>\n\n<h3>GitHub Actions</h3>\n\n<pre><code>name: Mobile Tests\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  android-tests:<br>    runs-on: macos-latest</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Java<br>        uses: actions/setup-java@v4<br>        with:<br>          java-version: \'17\'</p>\n\n<p>- name: Setup Android SDK<br>        uses: android-actions/setup-android@v2</p>\n\n<p>- name: Cache Appium<br>        uses: actions/cache@v3<br>        with:<br>          path: node_modules<br>          key: ${{ runner.os }}-appium</p>\n\n<p>- name: Install Dependencies<br>        run: |<br>          npm ci<br>          pip install pytest pytest-appium</p>\n\n<p>- name: Run Tests on BrowserStack<br>        env:<br>          BROWSERSTACK_USER: ${{ secrets.BS_USER }}<br>          BROWSERSTACK_KEY: ${{ secrets.BS_KEY }}<br>        run: |<br>          pytest tests/mobile/ <br>            --device=\"Samsung Galaxy S23\" <br>            --platform=\"Android 13\" <br>            --hub=\"http://hub.browserstack.com/wd/hub\"<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes mobile requerem estratégia bem definida cobrindo múltiplas plataformas, dispositivos e condições. As chaves para sucesso são:<br><ol><li><strong>Automação estratégica</strong> - Appium para cross-platform, nativo para performance</li><br><li><strong>Device matrix</strong> - Priorizar por uso real</li><br><li><strong>CI/CD integrado</strong> - Testes em cloud para escalabilidade</li><br><li><strong>Performance monitorada</strong> - FPS, memória, bateria</li><br><li><strong>Testes de condições reais</strong> - Offline, network switching</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Appium é mais lento que Espresso/XCTest?</strong>  <br>R: Sim, mas permite código único para iOS e Android.</p>\n\n<p><strong>P: Quantos dispositivos testar?</strong>  <br>R: Foque nos top 10-20 dispositivos por mercado (iOS, Android).</p>\n\n<p><strong>P: Como testar notificações push?</strong>  <br>R: Use emuladores para automação, dispositivos reais para validação final.</p>\n\n<p><strong>P: Testes mobile podem ser 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} automatizados?</strong>  <br>R: Não. Alguns testes (usabilidade, exploratory) requerem testers humanos.</p>', 'Testes Mobile: Guia Completo para Apps iOS e Android', '', 'inherit', 'closed', 'closed', '', '188-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '188', 'http://localhost:8082/ideiasti/?p=418', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('419', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda TDD do zero: ciclo Red-Green-Refactor, baby steps, mocks e práticas essenciais para escrever código testável e robusto.</p>\n\n<hr>\n<h2>O Que é TDD?</h2>\n\n<p>Test-Driven Development (TDD) é uma metodologia de desenvolvimento onde você escreve os testes antes do código de produção. O ciclo é simples: Red (falha), Green (passa), Refactor (melhora).</p>\n\n<h3>Ciclo Red-Green-Refactor</h3>\n\n<pre><code>    RED              GREEN            REFACTOR\n     ↓                ↓                 ↓\n┌─────────┐     ┌─────────┐      ┌─────────────┐\n│Escreva  │     │Faça o   │      │Melhore o    │\n│o teste  │ →   │código   │ →    │código sem   │\n│que      │     │mínimo   │      │mudar o      │\n│falha    │     │passar   │      │comportamento│\n└─────────┘     └─────────┘      └─────────────┘\n     ↑                                   │\n     └───────────────────────────────────┘\n                 (Repetir)\n</code></pre>\n\n<hr>\n<h2>Por Que TDD?</h2>\n\n<h3>Benefícios Quantificados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Com TDD</th><th>Sem TDD</th></tr>\n<tr><td>Defeitos em produção</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos</td><td>Baseline</td></tr>\n<tr><td>Cobertura de testes</td><td>90-100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>20-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Confiança em refactoring</td><td>Alta</td><td>Baixa</td></tr>\n<tr><td>Tempo de debugging</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos</td><td>Baseline</td></tr>\n<tr><td>Custo de manutenção</td><td>40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menor</td><td>Baseline</td></tr>\n</table></figure>\n\n<h3>Quando Usar TDD</h3>\n\n<p><strong>TDD BRILHA quando:</strong><br><ul><li>Algoritmos complexos</li><ol><li>APIs e bibliotecas</li><br><li>Refactoring de código legado</li><br><li>Código compartilhado</li><br><li>Requisitos claros</li><br></ol><br><strong>TDD é mais difícil quando:</strong><ol><li>UI layouts complexos</li><br><li>Exploratory features</li><br><li>Requisitos muito instáveis</li><br><li>Prototipagem rápida</li><br></ol><br><hr><br><h2>TDD em Diferentes Linguagens</h2></p>\n\n<h3>Python com pytest</h3>\n\n<pre><code># 1. RED - Escrever teste que falha\nimport pytest\n\n<p>def test_somar_dois_numeros_positivos():<br>    # Dado<br>    a = 2<br>    b = 3</p>\n\n<p># Quando<br>    resultado = somar(a, b)</p>\n\n<p># Então<br>    assert resultado == 5</p>\n\n<p># 2. GREEN - Implementar código mínimo<br>def somar(a, b):<br>    return 5  # Hardcoded para fazer passar</p>\n\n<p># 3. REFACTOR - Implementar corretamente<br>def somar(a, b):<br>    return a + b<br></code></pre></p>\n\n<h3>Exemplo Completo: Calculadora de Desconto</h3>\n\n<h4>RED - Testes Iniciais</h4>\n\n<pre><code># tests/test_desconto.py\nimport pytest\nfrom desconto import CalculadoraDesconto\n\n<p>class TestCalculadoraDesconto:<br>    def setup_method(self):<br>        self.calc = CalculadoraDesconto()</p>\n\n<p>def test_desconto_de_10_porcento(self):<br>        \"\"\"Cliente com 10 compras recebe 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de desconto\"\"\"<br>        resultado = self.calc.calcular(valor=100, quantidade_compras=10)<br>        assert resultado == 90</p>\n\n<p>def test_desconto_de_20_porcento(self):<br>        \"\"\"Cliente com 20 compras recebe 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de desconto\"\"\"<br>        resultado = self.calc.calcular(valor=100, quantidade_compras=20)<br>        assert resultado == 80</p>\n\n<p>def test_sem_desconto(self):<br>        \"\"\"Cliente novo (0 compras) não recebe desconto\"\"\"<br>        resultado = self.calc.calcular(valor=100, quantidade_compras=0)<br>        assert resultado == 100</p>\n\n<p>def test_desconto_maximo_de_30_porcento(self):<br>        \"\"\"Cliente VIP (50+ compras) recebe no máximo 30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\"\"<br>        resultado = self.calc.calcular(valor=100, quantidade_compras=100)<br>        assert resultado == 70</p>\n\n<p>def test_valor_negativo_deve_falhar(self):<br>        \"\"\"Valor negativo deve lançar exceção\"\"\"<br>        with pytest.raises(ValueError):<br>            self.calc.calcular(valor=-100, quantidade_compras=10)</p>\n\n<p>@pytest.mark.parametrize(\"valor,compras,esperado\", [<br>        (100, 5, 100),   # Sem desconto<br>        (100, 10, 90),   # 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>        (100, 20, 80),   # 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>        (100, 50, 70),   # 30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>        (200, 10, 180),  # 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em valor maior<br>    ])<br>    def test_parametrizado(self, valor, compras, esperado):<br>        resultado = self.calc.calcular(valor=valor, quantidade_compras=compras)<br>        assert resultado == esperado<br></code></pre></p>\n\n<h4>GREEN - Implementação Mínima</h4>\n\n<pre><code># desconto.py\nclass CalculadoraDesconto:\n    def calcular(self, valor, quantidade_compras):\n        if valor &lt; 0:\n            raise ValueError(&quot;Valor não pode ser negativo&quot;)\n\n<p>if quantidade_compras &gt;= 50:<br>            desconto = 0.30<br>        elif quantidade_compras &gt;= 20:<br>            desconto = 0.20<br>        elif quantidade_compras &gt;= 10:<br>            desconto = 0.10<br>        else:<br>            desconto = 0</p>\n\n<p>return valor * (1 - desconto)<br></code></pre></p>\n\n<h4>REFACTOR - Melhorias</h4>\n\n<pre><code># desconto.py (refatorado)\nfrom dataclasses import dataclass\n\n<p>@dataclass<br>class RegraDesconto:<br>    min_compras: int<br>    max_compras: int | None<br>    percentual: float</p>\n\n<p>REGRAS = [<br>    RegraDesconto(min_compras=50, max_compras=None, percentual=30),<br>    RegraDesconto(min_compras=20, max_compras=49, percentual=20),<br>    RegraDesconto(min_compras=10, max_compras=19, percentual=10),<br>]</p>\n\n<p>class CalculadoraDesconto:<br>    def calcular(self, valor: float, quantidade_compras: int) -&gt; float:<br>        if valor &lt; 0:<br>            raise ValueError(\"Valor não pode ser negativo\")</p>\n\n<p>for regra in REGRAS:<br>            if quantidade_compras &gt;= regra.min_compras:<br>                if regra.max_compras is None or quantidade_compras &lt;= regra.max_compras:<br>                    return valor * (1 - regra.percentual / 100)</p>\n\n<p>return valor<br></code></pre></p>\n\n<h3>JavaScript com Jest</h3>\n\n<pre><code>// 1. RED - Testes\ndescribe(\'CalculadoraFrete\', () =&gt; {\n  const calculadora = new CalculadoraFrete();\n\n<p>test(\'frete para SP capital\', () =&gt; {<br>    expect(calculadora.calcular(\'SP\', \'São Paulo\')).toBe(15.90);<br>  });</p>\n\n<p>test(\'frete para RJ\', () =&gt; {<br>    expect(calculadora.calcular(\'RJ\', \'Rio de Janeiro\')).toBe(20.00);<br>  });</p>\n\n<p>test(\'frete para outros estados\', () =&gt; {<br>    expect(calculadora.calcular(\'MG\', \'Belo Horizonte\')).toBe(30.00);<br>  });</p>\n\n<p>test(\'frete grátis para SP com compra &gt; 200\', () =&gt; {<br>    expect(calculadora.calcular(\'SP\', \'São Paulo\', 250)).toBe(0);<br>  });<br>});</p>\n\n<p>// 2. GREEN - Implementação<br>class CalculadoraFrete {<br>  calcular(estado, cidade, valorCompra = 0) {<br>    if (estado === \'SP\' &amp;&amp; valorCompra &gt; 200) return 0;<br>    if (estado === \'SP\') return 15.90;<br>    if (estado === \'RJ\') return 20.00;<br>    return 30.00;<br>  }<br>}<br></code></pre></p>\n\n<h3>Java com JUnit 5</h3>\n\n<pre><code>// Teste\nclass CarrinhoTest {\n\n<p>@Test<br>    void deveCalcularTotalComDesconto() {<br>        // Given<br>        Carrinho carrinho = new Carrinho();<br>        carrinho.adicionar(new Produto(\"Camiseta\", 50.00, 2));<br>        carrinho.adicionar(new Produto(\"Calça\", 100.00, 1));</p>\n\n<p>// When<br>        double total = carrinho.calcularTotal();</p>\n\n<p>// Then<br>        assertEquals(200.00, total, 0.01);<br>    }</p>\n\n<p>@Test<br>    void deveAplicarCupomDesconto() {<br>        // Given<br>        Carrinho carrinho = new Carrinho();<br>        carrinho.adicionar(new Produto(\"Camiseta\", 100.00, 1));</p>\n\n<p>// When<br>        carrinho.aplicarCupom(new Cupom(\"DESCONTO10\", 10));<br>        double total = carrinho.calcularTotal();</p>\n\n<p>// Then<br>        assertEquals(90.00, total, 0.01);<br>    }</p>\n\n<p>@ParameterizedTest<br>    @CsvSource({<br>        \"100, 10, 90\",<br>        \"200, 10, 180\",<br>        \"100, 20, 80\"<br>    })<br>    void deveCalcularComDescontoParametrizado(<br>        double valor, double desconto, double esperado<br>    ) {<br>        Carrinho carrinho = new Carrinho();<br>        carrinho.adicionar(new Produto(\"Item\", valor, 1));<br>        carrinho.aplicarCupom(new Cupom(\"TESTE\", desconto));</p>\n\n<p>assertEquals(esperado, carrinho.calcularTotal(), 0.01);<br>    }<br>}<br></code></pre></p>\n\n<hr>\n<h2>Baby Steps: Implementação Incremental</h2>\n\n<h3>Exemplo: Fibonacci</h3>\n\n<pre><code># Passo 1: O menor teste possível\ndef test_fibonacci_0():\n    assert fibonacci(0) == 0\n\n<p># Implementação mínima<br>def fibonacci(n):<br>    return 0</p>\n\n<p># Passo 2: Segundo valor<br>def test_fibonacci_1():<br>    assert fibonacci(1) == 1</p>\n\n<p>def fibonacci(n):<br>    if n == 0:<br>        return 0<br>    return 1  # Ainda não está correto!</p>\n\n<p># Passo 3: Terceiro valor<br>def test_fibonacci_2():<br>    assert fibonacci(2) == 1</p>\n\n<p># GREEN: Implementação correta (forma recursiva)<br>def fibonacci(n):<br>    if n &lt;= 0:<br>        return 0<br>    if n == 1:<br>        return 1<br>    return fibonacci(n - 1) + fibonacci(n - 2)</p>\n\n<p># GREEN: Implementação melhor (forma iterativa)<br>def fibonacci(n):<br>    if n &lt;= 0:<br>        return 0<br>    if n == 1:<br>        return 1</p>\n\n<p>a, b = 0, 1<br>    for _ in range(2, n + 1):<br>        a, b = b, a + b<br>    return b<br></code></pre></p>\n\n<hr>\n<h2>Mocks e Stubs</h2>\n\n<h3>Por Que Usar Mocks?</h3>\n\n<p>Mocks são essenciais para:<ol><li>Isolar unidade sob teste</li><br><li>Simular dependências externas</li><br><li>Controlar cenários de teste</li><br><li>Aumentar velocidade dos testes</li></ol></ul></p>\n\n<h3>Exemplo: Service com Dependência</h3>\n\n<pre><code># 1. Teste com mock\nfrom unittest.mock import Mock, patch\n\n<p>def test_pedido_service_cria_pedido_com_sucesso():<br>    # Given<br>    email_service = Mock()<br>    email_service.enviar = Mock(return_value=True)</p>\n\n<p>payment_gateway = Mock()<br>    payment_gateway.cobrar = Mock(return_value={<br>        \"status\": \"approved\",<br>        \"transaction_id\": \"tx_123\"<br>    })</p>\n\n<p>repository = Mock()<br>    repository.salvar = Mock(return_value=1)</p>\n\n<p>service = PedidoService(<br>        email_service=email_service,<br>        payment_gateway=payment_gateway,<br>        repository=repository<br>    )</p>\n\n<p># When<br>    resultado = service.criar_pedido(<br>        cliente_id=1,<br>        itens=[{\"produto_id\": 1, \"quantidade\": 2}],<br>        forma_pagamento=\"credit_card\"<br>    )</p>\n\n<p># Then<br>    assert resultado[\"status\"] == \"confirmed\"<br>    assert resultado[\"pedido_id\"] == 1</p>\n\n<p># Verificar chamadas<br>    payment_gateway.cobrar.assert_called_once()<br>    repository.salvar.assert_called_once()<br>    email_service.enviar.assert_called_once()<br></code></pre></p>\n\n<h3>Spy vs Mock vs Stub</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo</th><th>Comportamento</th><th>Uso</th></tr>\n<tr><td><strong>Stub</strong></td><td>Respostas pré-programadas</td><td>Fornecer dados</td></tr>\n<tr><td><strong>Mock</strong></td><td>Comportamento verificado</td><td>Verificar interações</td></tr>\n<tr><td><strong>Spy</strong></td><td>Wrapper do real + verificação</td><td>Comportamento real + verificação</td></tr>\n</table></figure>\n\n<pre><code># Stub\nrepository = Mock()\nrepository.buscar_por_id = Mock(return_value={\"id\": 1, \"nome\": \"Produto\"})\n\n<p># Spy (usando wraps)<br>with patch(\'app.repository\') as mock_repo:<br>    mock_repo.buscar_por_id.return_value = {\"id\": 1}</p>\n\n<p>service = MyService(mock_repo)<br>    service.algum_metodo()</p>\n\n<p># Verificar que foi chamado<br>    mock_repo.buscar_por_id.assert_called_once_with(1)<br></code></pre></p>\n\n<hr>\n<h2>TDD em Prática: Kata de String Calculator</h2>\n\n<h3>Requisitos</h3>\n<ol><li>Criar calculadora que recebe string vazia retorna 0</li>\n<li>Recebe \"1\" retorna 1</li>\n<li>Recebe \"1,2\" retorna 3</li>\n<li>Recebe \"1n2,3\" retorna 6</li>\n<li>Suporta delimitador customizado \"//;n1;2\" retorna 3</li>\n</ol>\n<h3>Solução TDD</h3>\n\n<pre><code># Step 1: String vazia\ndef test_string_vazia_retorna_zero():\n    assert string_calculator(\"\") == 0\n\n<p>def string_calculator(numbers):<br>    return 0</p>\n\n<p># Step 2: Um número<br>def test_um_numero():<br>    assert string_calculator(\"1\") == 1</p>\n\n<p>def string_calculator(numbers):<br>    if not numbers:<br>        return 0<br>    return int(numbers)</p>\n\n<p># Step 3: Dois números separados por vírgula<br>def test_dois_numeros():<br>    assert string_calculator(\"1,2\") == 3</p>\n\n<p>def string_calculator(numbers):<br>    if not numbers:<br>        return 0<br>    return sum(int(n) for n in numbers.split(\',\'))</p>\n\n<p># Step 4: Múltiplos números<br>def test_multiplos_numeros():<br>    assert string_calculator(\"1,2,3,4,5\") == 15</p>\n\n<p>def string_calculator(numbers):<br>    if not numbers:<br>        return 0<br>    delimiters = [\',\', \'n\']<br>    parts = numbers.replace(\'n\', \',\')<br>    return sum(int(n) for n in parts.split(\',\'))</p>\n\n<p># Step 5: Delimitador customizado<br>def test_delimitador_customizado():<br>    assert string_calculator(\"//;n1;2;3\") == 6</p>\n\n<p>def string_calculator(numbers):<br>    if not numbers:<br>        return 0</p>\n\n<p># Detectar delimitador customizado<br>    if numbers.startswith(\'//\'):<br>        end_header = numbers.index(\'n\')<br>        delimiter = numbers[2:end_header]<br>        numbers = numbers[end_header + 1:]<br>        numbers = numbers.replace(delimiter, \',\')</p>\n\n<p>return sum(int(n) for n in numbers.replace(\'n\', \',\').split(\',\'))<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>TDD é mais que escrever testes primeiro - é uma filosofia de design que resulta em código mais limpo, testável e manutenível. As chaves para dominar TDD são:<br><ol><li><strong>Prática constante</strong> - Katas diárias</li><br><li><strong>Baby steps</strong> - Pequenas iterações</li><br><li><strong>Feedback rápido</strong> - Execução de testes rápida</li><br><li><strong>Disciplina</strong> - Não pule etapas</li><br><li><strong>Paciência</strong> - Curva de aprendizado é íngreme no início</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: TDD funciona para todos os projetos?</strong>  <br>R: Não. É excelente para lógica de negócio, APIs. Menos para UI exploratória ou protótipos.</p>\n\n<p><strong>P: Como começar com TDD?</strong>  <br>R: Pratique com katas (String Calculator, Bowling Game, Tennis Refactoring) diariamente.</p>\n\n<p><strong>P: TDD não ralent development?</strong>  <br>R: No curto prazo parece mais lento, mas reduz significativamente bugs e tempo de debugging.</p>\n\n<p><strong>P: Posso usar TDD com legacy code?</strong>  <br>R: Sim! Comece com characterization tests, depois refatore一点点 com testes.</p>', 'Test-Driven Development (TDD): Guia Prático para Implementação', '', 'inherit', 'closed', 'closed', '', '189-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '189', 'http://localhost:8082/ideiasti/?p=419', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('420', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda BDD: Gherkin, Cucumber, Behave, e como implementar desenvolvimento guiado por comportamento para equipes ágeis.</p>\n\n<hr>\n<h2>O Que é BDD?</h2>\n\n<p>Behavior-Driven Development (BDD) é uma evolução do TDD que foca na colaboração entre desenvolvedores, QA e negócios. BDD usa linguagem natural (Gherkin) para descrever comportamentos de software, tornando requisitos mais acessíveis a todos.</p>\n\n<h3>A História do BDD</h3>\n\n<pre><code>2003: Dan North cria \"JBehave\" (Java)\n2006: Ruby implementation \"Cucumber\" (Aslak Hellesøy)\n2008: GoBehave para Python\n2012: Cucumber-JVM\nHoje: Gherkin é padrão indústria\n</code></pre>\n\n<hr>\n<h2>Gherkin: A Linguagem de BDD</h2>\n\n<h3>Estrutura Básica</h3>\n\n<pre><code># language: pt\nFuncionalidade: Título da funcionalidade\n  Como um [ator]\n  Quero [ação]\n  Para [benefício]\n\n<p>Contexto: [precondições]<br>    Dado [estado inicial]<br>    E [mais estados]</p>\n\n<p>Cenário: [nome do cenário]<br>    Quando [ação]<br>    E [mais ações]<br>    Então [resultado esperado]<br>    E [mais resultados]</p>\n\n<p>Cenário: [outro cenário]<br>    ...<br></code></pre></p>\n\n<h3>Palavras-Chave Gherkin</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Keyword</th><th>Uso</th></tr>\n<tr><td><code>Funcionalidade</code> (Feature)</td><td>Agrupa cenários relacionados</td></tr>\n<tr><td><code>Contexto</code> (Background)</td><td>Precondições comuns</td></tr>\n<tr><td><code>Cenário</code> (Scenario)</td><td>Caso de uso específico</td></tr>\n<tr><td><code>Dado</code> (Given)</td><td>Pré-condições</td></tr>\n<tr><td><code>Quando</code> (When)</td><td>Ação/evento</td></tr>\n<tr><td><code>Então</code> (Then)</td><td>Resultado esperado</td></tr>\n<tr><td><code>E</code> (And)</td><td>Conjunção</td></tr>\n<tr><td><code>Mas</code> (But)</td><td>Conjunção negativa</td></tr>\n<tr><td><code>Esquema do Cenário</code></td><td>Cenário parametrizado</td></tr>\n<tr><td><code> Exemplos</code> (Examples)</td><td>Dados de teste</td></tr>\n</table></figure>\n\n<h3>Exemplo Completo</h3>\n\n<pre><code># language: pt\nFuncionalidade: Login de Usuário\n  Como um usuário registrado no sistema\n  Quero fazer login com minhas credenciais\n  Para acessar minha conta e visualizar meus dados\n\n<p>Contexto:<br>    Dado que o sistema está operacional<br>    E o usuário \"joao@exemplo.com\" está cadastrado com senha \"Senha@123\"</p>\n\n<p>Cenário: Login com credenciais válidas<br>    Quando eu acesso a página de login<br>    E preencho o campo email com \"joao@exemplo.com\"<br>    E preencho o campo senha com \"Senha@123\"<br>    E clico no botão \"Entrar\"<br>    Então sou redirecionado para o dashboard<br>    E uma mensagem de boas-vindas é exibida<br>    E meu nome \"João Silva\" aparece no cabeçalho</p>\n\n<p>Cenário: Login com senha incorreta<br>    Quando eu acesso a página de login<br>    E preencho o campo email com \"joao@exemplo.com\"<br>    E preencho o campo senha com \"senhaerrada\"<br>    E clico no botão \"Entrar\"<br>    Então permaneço na página de login<br>    E uma mensagem de erro \"Credenciais inválidas\" é exibida<br>    E o campo senha está vazio para nova tentativa</p>\n\n<p>Cenário: Login com email não cadastrado<br>    Quando eu acesso a página de login<br>    E preencho o campo email com \"naoexiste@exemplo.com\"<br>    E preencho o campo senha com \"senha123\"<br>    E clico no botão \"Entrar\"<br>    Então uma mensagem de erro \"Usuário não encontrado\" é exibida</p>\n\n<p>Esquema do Cenário: Bloqueio após múltiplas tentativas<br>    Quando tento fazer login com email \"\" e senha \"\"<br>    E repito este login falho por  vezes<br>    Então minha conta fica bloqueada por  minutos<br>    E uma mensagem \"Conta temporariamente bloqueada\" é exibida</p>\n\n<p>Exemplos:<br>      | email             | senha      | tentativas | minutos |<br>      | joao@exemplo.com  | errada1    | 3          | 30      |<br>      | maria@exemplo.com  | errada2    | 5          | 60      |<br></code></pre></p>\n\n<hr>\n<h2>Cucumber: Implementando BDD</h2>\n\n<h3>Cucumber Architecture</h3>\n\n<pre><code>.feature files (Gherkin)\n        ↓\n   Cucumber Parser\n        ↓\n   Step Definitions (Glue Code)\n        ↓\n   Step Definitions (Java/JS/Python/Ruby)\n        ↓\n   Application Under Test\n</code></pre>\n\n<h3>Cucumber com Java (Spring Boot)</h3>\n\n<h4>Dependências</h4>\n\n<pre><code>\n    io.cucumber\n    cucumber-java\n    7.14.0\n    test\n\n\n    io.cucumber\n    cucumber-spring\n    7.14.0\n    test\n\n\n    io.cucumber\n    cucumber-junit-platform-engine\n    7.14.0\n    test\n\n</code></pre>\n\n<h4>Feature File</h4>\n\n<pre><code># src/test/resources/features/carrinho.feature\nFuncionalidade: Carrinho de Compras\n  Como um cliente do e-commerce\n  Quero adicionar e remover produtos do carrinho\n  Para finalizar minha compra\n\n<p>Contexto:<br>    Dado que estou logado como \"cliente@teste.com\"<br>    E o produto \"Camiseta Azul\" custa R$ 49,90<br>    E o produto \"Calça Jeans\" custa R$ 129,90<br>    E o produto \"Tênis\" custa R$ 199,90</p>\n\n<p>Cenário: Adicionar produto ao carrinho<br>    Quando adiciono \"Camiseta Azul\" ao carrinho<br>    Então o carrinho deve conter 1 item<br>    E o total deve ser R$ 49,90</p>\n\n<p>Cenário: Adicionar múltiplos produtos<br>    Quando adiciono \"Camiseta Azul\" ao carrinho<br>    E adiciono \"Calça Jeans\" ao carrinho<br>    E adiciono \"Tênis\" ao carrinho<br>    Então o carrinho deve conter 3 itens<br>    E o total deve ser R$ 379,70</p>\n\n<p>Cenário: Remover produto do carrinho<br>    Dado que tenho \"Camiseta Azul\" e \"Calça Jeans\" no carrinho<br>    Quando removo \"Camiseta Azul\" do carrinho<br>    Então o carrinho deve conter 1 item<br>    E o total deve ser R$ 129,90<br></code></pre></p>\n\n<h4>Step Definitions</h4>\n\n<pre><code>package steps;\n\n<p>import io.cucumber.java.pt.*;<br>import org.springframework.beans.factory.annotation.Autowired;<br>import static org.junit.jupiter.api.Assertions.*;</p>\n\n<p>class CarrinhoSteps {</p>\n\n<p>@Autowired<br>    private CarrinhoService carrinhoService;</p>\n\n<p>@Autowired<br>    private TestContext testContext;</p>\n\n<p>private Carrinho carrinho;</p>\n\n<p>@Dado(\"que estou logado como {string}\")<br>    public void que_estou_logado_como(String email) {<br>        testContext.setUsuario(email);<br>        carrinho = new Carrinho();<br>    }</p>\n\n<p>@Dado(\"o produto {string} custa R$ {double}\")<br>    public void produto_custa(String nome, double preco) {<br>        // Setup de produto no banco de dados de teste<br>    }</p>\n\n<p>@Quando(\"adiciono {string} ao carrinho\")<br>    public void adiciono_produto_ao_carrinho(String produto) {<br>        carrinho.adicionar(new Item(produto, obterPreco(produto)));<br>    }</p>\n\n<p>@Então(\"o carrinho deve conter {int} item\")<br>    public void carrinho_deve_conter_itens(int quantidade) {<br>        assertEquals(quantidade, carrinho.getItens().size());<br>    }</p>\n\n<p>@Então(\"o total deve ser R$ {double}\")<br>    public void total_deve_ser(double total) {<br>        assertEquals(total, carrinho.getTotal(), 0.01);<br>    }<br>}<br></code></pre></p>\n\n<h3>Cucumber com Python (Behave)</h3>\n\n<h4>Instalação</h4>\n\n<pre><code>pip install behave\n</code></pre>\n\n<h4>Feature File</h4>\n\n<pre><code># features/carrinho.feature\nFuncionalidade: Carrinho de Compras\n  Como um cliente do e-commerce\n  Quero adicionar produtos ao carrinho\n  Para visualizar o total da compra\n\n<p>Cenário: Adicionar produto ao carrinho<br>    Dado que o produto \"Camiseta\" custa 50.00<br>    Quando adiciono o produto ao carrinho<br>    Então o total deve ser 50.00<br></code></pre></p>\n\n<h4>Step Definitions</h4>\n\n<pre><code># features/steps/carrinho_steps.py\nfrom behave import given, when, then\nfrom carrinho import Carrinho\n\n<p>@given(\'o produto \"{nome}\" custa {preco}\')<br>def step_impl(context, nome, preco):<br>    if not hasattr(context, \'produtos\'):<br>        context.produtos = {}<br>    context.produtos[nome] = float(preco.replace(\'.\', \'\').replace(\',\', \'.\'))</p>\n\n<p>@when(\'adiciono o produto ao carrinho\')<br>def step_impl(context):<br>    if not hasattr(context, \'carrinho\'):<br>        context.carrinho = Carrinho()</p>\n\n<p>for nome, preco in context.produtos.items():<br>        context.carrinho.adicionar(nome, preco)</p>\n\n<p>@then(\'o total deve ser {total}\')<br>def step_impl(context, total):<br>    esperado = float(total.replace(\'.\', \'\').replace(\',\', \'.\'))<br>    assert context.carrinho.total == esperado, <br>        f\"Esperado {esperado}, got {context.carrinho.total}\"<br></code></pre></p>\n\n<h4>Runner</h4>\n\n<pre><code># features/environment.py\ndef before_all(context):\n    context.produtos = {}\n    context.carrinho = None\n\n<p>def after_scenario(context, scenario):<br>    # Cleanup<br>    context.produtos = {}<br>    context.carrinho = None<br></code></pre></p>\n\n<hr>\n<h2>BDD em Equipes Ágeis</h2>\n\n<h3>O Ciclo BDD Completo</h3>\n\n<pre><code>   ┌──────────────────────────────────────────────┐\n   │                                              │\n   ▼                                              │\n┌───────┐    ┌─────────┐    ┌──────────┐    ┌─────┴───┐\n│DISCUSS│───▶│EXAMPLES │───▶│AUTOMATE │───▶│IMPLEMENT│\n│   ()  │    │   (O)   │    │   (o)   │    │   (.)   │\n└───────┘    └─────────┘    └──────────┘    └─────────┘\n    ▲                                              │\n    │                                              │\n    └──────────────────────────────────────────────┘\n                    (Feedback)\n</code></pre>\n\n<h3>Reunião de Three Amigos</h3>\n\n<p>A reunião de Three Amigos junta desenvolvedores, QA e product owner para discutir requisitos.</p>\n\n<pre><code># Agenda da Reunião Three Amigos\n\n<h2>Preparação (1 dia antes)</h2>\n<ul><li>PO compartilha user stories</li><ol><li>QA prepara perguntas</li>\n<li>Devs revisam história</li>\n</ol>\n<h2>Reunião (60 minutos)</h2><ol><li>PO apresenta user story (10 min)</li>\n<li>Discussão de requisitos (20 min)</li>\n<li>QA identifica cenários de teste (15 min)</li>\n<li>Devs identificam complexidades (10 min)</li>\n<li>Acordo sobre exemplos concretos (5 min)</li>\n</ol>\n<h2>Output</h2><ol><li>User story com critérios de aceitação claros</li>\n<li>Cenários BDD definidos</li>\n<li>Incertezas documentadas</li>\n</ol></code></pre>\n\n<h3>Exemplo: User Story com BDD</h3>\n\n<pre><code><h2>User Story: RS-123 - Carrinho Abandonado</h2>\n\n<h3>Como</h3>\n  Vendedor do e-commerce\n\n<h3>Eu quero</h3>\n  Receber notificação quando cliente abandonar carrinho\n\n<h3>Para que</h3>\n  Possa entrar em contato e recuperar a venda\n\n<h3>Critérios de Aceitação:</h3><ol><li>[ ] Notificação enviada 30 min após abandono</li>\n<li>[ ] Email inclui produtos abandonados</li>\n<li>[ ] Email inclui link para recuperação</li>\n<li>[ ] Não enviar se cliente já Comprou</li>\n<li>[ ] Rate limit de 1 email por cliente por dia</li></ol></ul>\n\n<h3>Cenários BDD:</h3>\n</code></pre>\n\n<pre><code>Funcionalidade: Carrinho Abandonado\n\n<p>Cenário: Notificação enviada após 30 minutos<br>    Dado que o cliente adicionou produtos ao carrinho<br>    E saiu do site sem Comprar<br>    Quando passam 30 minutos<br>    Então um email de recuperação é enviado</p>\n\n<p>Cenário: Email inclui produtos abandonados<br>    Dado que o cliente abandonou o carrinho com:<br>      | Produto       | Quantidade |<br>      | Camiseta     | 2         |<br>      | Calça Jeans  | 1         |<br>    Quando o email de recuperação é enviado<br>    Então o email lista todos os produtos abandonados</p>\n\n<p>Cenário: Não enviar se cliente Comprou<br>    Dado que o cliente abandonou o carrinho<br>    Mas depois finalizou a compra<br>    Quando passam 30 minutos<br>    Então nenhum email é enviado<br></code></pre></p>\n\n<hr>\n<h2>Boas Práticas em BDD</h2>\n\n<h3>1. Feature Files Bem Estruturados</h3>\n\n<pre><code># BOM: Cenários focados e descritivos\nFuncionalidade: Cálculo de Frete\n  Cenário: Frete para SP capital\n    Dado que o produto custa R$ 100\n    Quando o cliente é de \"SP\" e \"São Paulo\"\n    Então o frete é R$ 15,90\n\n<p># RUIM: Cenário muito genérico<br>Funcionalidade: Frete<br>  Cenário: Teste de frete<br>    Dado que tenho um produto<br>    Quando calculo o frete<br>    Então deve funcionar<br></code></pre></p>\n\n<h3>2. Step Definitions Reutilizáveis</h3>\n\n<pre><code># Defina steps genéricos\n@given(\'que o produto \"{nome}\" custa R$ {preco}\')\ndef step_produto(context, nome, preco):\n    context.produtos[nome] = float(preco)\n\n<p>@when(\'eu adiciono \"{nome}\" ao carrinho\')<br>def step_adicionar(context, nome):<br>    context.carrinho.adicionar(nome, context.produtos[nome])<br></code></pre></p>\n\n<h3>3. Page Objects para Web</h3>\n\n<pre><code># pages/login_page.py\nclass LoginPage:\n    def __init__(self, driver):\n        self.driver = driver\n\n<p>@property<br>    def email_field(self):<br>        return self.driver.find_element(By.ID, \'email\')</p>\n\n<p>@property<br>    def password_field(self):<br>        return self.driver.find_element(By.ID, \'password\')</p>\n\n<p>@property<br>    def login_button(self):<br>        return self.driver.find_element(By.ID, \'login-button\')</p>\n\n<p>def login(self, email, password):<br>        self.email_field.send_keys(email)<br>        self.password_field.send_keys(password)<br>        self.login_button.click()<br></code></pre></p>\n\n<hr>\n<h2>Integração com CI/CD</h2>\n\n<pre><code># GitHub Actions - BDD Tests\nname: BDD Tests\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  bdd-tests:<br>    runs-on: ubuntu-latest</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Python<br>        uses: actions/setup-python@v5<br>        with:<br>          python-version: \'3.11\'</p>\n\n<p>- name: Install dependencies<br>        run: |<br>          pip install behave selenium webdriver-manager</p>\n\n<p>- name: Run BDD tests<br>        run: behave --format=json --outfile=reports/behave.json</p>\n\n<p>- name: Upload reports<br>        uses: actions/upload-artifact@v4<br>        with:<br>          name: cucumber-reports<br>          path: reports/<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>BDD é uma metodologia poderosa que une equipes através de linguagem comum. As chaves para sucesso são:<br><ol><li><strong>Colaboração</strong> - Three Amigos regularmente</li><br><li><strong>Exemplos concretos</strong> - Ao invés de requisitos vagos</li><br><li><strong>Automação</strong> - Transforma cenários em testes executáveis</li><br><li><strong>Documentação viva</strong> - Features são especificação + teste</li><br><li><strong>Feedback rápido</strong> - Ciclos curtos de desenvolvimento</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: BDD substitui TDD?</strong>  <br>R: Não. BDD usa TDD internamente. BDD foca em colaboração, TDD em técnica.</p>\n\n<p><strong>P: Como começar com BDD?</strong>  <br>R: Comece com Three Amigos para definir cenários, depois implemente com Cucumber/Behave.</p>\n\n<p><strong>P: Quantos cenários por feature?</strong>  <br>R: O suficiente para cobrir comportamento. Evite redundância, use Examples para variações.</p>\n\n<p><strong>P: BDD funciona para qualquer projeto?</strong>  <br>R: Melhor para projetos com requisitos claros e colaboração entre negocio e TI.</p>', 'BDD (Behavior-Driven Development): Guia Completo para Equipes Ágeis', '', 'inherit', 'closed', 'closed', '', '190-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '190', 'http://localhost:8082/ideiasti/?p=420', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('421', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Domine testes de API: REST, GraphQL, microservices. Aprenda a usar Postman, RestAssured, pytest e automação de testes de API para garantir qualidade de integrações.</p>\n\n<hr>\n<h2>Introdução aos Testes de API</h2>\n\n<p>APIs (Application Programming Interfaces) são a espinha dorsal da arquitetura moderna de software. Testar APIs de forma eficaz garante que os serviços se comuniquem corretamente, retornem dados esperados e tratem erros apropriadamente.</p>\n\n<h3>Por Que Testar APIs?</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Benefício</th><th>Impacto</th></tr>\n<tr><td><strong>Detecção precoce de bugs</strong></td><td>APIs são gateway para frontend</td></tr>\n<tr><td><strong>Integração confiável</strong></td><td>Microserviços se comunicam via API</td></tr>\n<tr><td><strong>Performance</strong></td><td>API performance afeta toda a aplicação</td></tr>\n<tr><td><strong>Documentação viva</strong></td><td>Contratos de API testados</td></tr>\n<tr><td><strong>Regression testing</strong></td><td>Mudanças não quebram integrações</td></tr>\n</table></figure>\n\n<hr>\n<h2>Tipos de Testes de API</h2>\n\n<h3>1. Testes de Funcionalidade</h3>\n\n<p>Verificam se a API funciona conforme especificado.</p>\n\n<pre><code>import requests\nimport pytest\n\n<p>BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>class TestUsuarioAPI:</p>\n\n<p>def test_criar_usuario(self):<br>        \"\"\"Deve criar usuário com sucesso\"\"\"<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"Senha@123\"<br>        }</p>\n\n<p>response = requests.post(<br>            f\"{BASE_URL}/usuarios\",<br>            json=payload,<br>            headers={\"Content-Type\": \"application/json\"}<br>        )</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data<br>        assert \"senha\" not in data  # Não retorna senha!</p>\n\n<p>def test_criar_usuario_email_duplicado(self):<br>        \"\"\"Deve falhar quando email já existe\"\"\"<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",  # Já existe<br>            \"senha\": \"Senha@123\"<br>        }</p>\n\n<p>response = requests.post(<br>            f\"{BASE_URL}/usuarios\",<br>            json=payload<br>        )</p>\n\n<p>assert response.status_code == 409  # Conflict<br>        assert \"email\" in response.json()[\"erro\"].lower()</p>\n\n<p>def test_buscar_usuario_por_id(self):<br>        \"\"\"Deve retornar usuário existente\"\"\"<br>        response = requests.get(f\"{BASE_URL}/usuarios/1\")</p>\n\n<p>assert response.status_code == 200<br>        data = response.json()<br>        assert data[\"id\"] == 1<br>        assert \"email\" in data</p>\n\n<p>def test_buscar_usuario_inexistente(self):<br>        \"\"\"Deve retornar 404 para usuário inexistente\"\"\"<br>        response = requests.get(f\"{BASE_URL}/usuarios/99999\")</p>\n\n<p>assert response.status_code == 404<br></code></pre></p>\n\n<h3>2. Testes de Contrato</h3>\n\n<p>Verificam se a API está em conformidade com seu contrato (OpenAPI/Swagger).</p>\n\n<pre><code>import pytest\nfrom jsonschema import validate\n\n<p>schema = {<br>    \"type\": \"object\",<br>    \"required\": [\"id\", \"nome\", \"email\"],<br>    \"properties\": {<br>        \"id\": {\"type\": \"integer\"},<br>        \"nome\": {\"type\": \"string\", \"minLength\": 1},<br>        \"email\": {\"type\": \"string\", \"format\": \"email\"}<br>    }<br>}</p>\n\n<p>def test_usuario_response_match_schema():<br>    response = requests.get(f\"{BASE_URL}/usuarios/1\")<br>    data = response.json()</p>\n\n<p>validate(instance=data, schema=schema)<br></code></pre></p>\n\n<h3>3. Testes de Performance</h3>\n\n<pre><code>import time\nimport concurrent.futures\n\n<p>def test_api_response_time():<br>    \"\"\"Tempo de resposta deve ser &lt; 500ms&quot;&quot;&quot;<br>    start = time.time()<br>    response = requests.get(f\"{BASE_URL}/usuarios/1\")<br>    elapsed = (time.time() - start) * 1000</p>\n\n<p>assert response.status_code == 200<br>    assert elapsed &lt; 500, f&quot;Response took {elapsed}ms&quot;</p>\n\n<p>def test_concurrent_requests():<br>    \"\"\"API deve suportar 100 requisições simultâneas\"\"\"<br>    def make_request():<br>        response = requests.get(f\"{BASE_URL}/health\")<br>        return response.status_code == 200</p>\n\n<p>with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:<br>        futures = [executor.submit(make_request) for _ in range(100)]<br>        results = [f.result() for f in concurrent.futures.as_completed(futures)]</p>\n\n<p>success_rate = sum(results) / len(results)<br>    assert success_rate &gt; 0.95, f\"Only {success_rate*100}{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} succeeded\"<br></code></pre></p>\n\n<h3>4. Testes de Segurança</h3>\n\n<pre><code>def test_sql_injection_prevention():\n    \"\"\"API deve prevenir SQL injection\"\"\"\n    payload = {\"email\": \"admin\' OR \'1\'=\'1\"}\n    response = requests.post(f\"{BASE_URL}/usuarios\", json=payload)\n\n<p># Não deve retornar dados sensíveis<br>    assert response.status_code in [400, 422]</p>\n\n<p>def test_xss_in_input(self):<br>    \"\"\"API deve sanitizar inputs\"\"\"<br>    payload = {\"nome\": \"alert(\'xss\')\"}<br>    response = requests.post(f\"{BASE_URL}/usuarios\", json=payload)</p>\n\n<p>if response.status_code == 201:<br>        data = response.json()<br>        assert \"\" not in data[\"nome\"]</p>\n\n<p>def test_rate_limiting(self):<br>    \"\"\"API deve limitar requisições excessivas\"\"\"<br>    responses = []<br>    for _ in range(105):  # Limite é 100<br>        response = requests.get(f\"{BASE_URL}/usuarios/1\")<br>        responses.append(response.status_code)</p>\n\n<p># Últimas 5 devem retornar 429 (Too Many Requests)<br>    assert 429 in responses[-5:]<br></code></pre></p>\n\n<hr>\n<h2>GraphQL: Testando APIs Modernas</h2>\n\n<h3>Queries</h3>\n\n<pre><code>import requests\n\n<p>GRAPHQL_URL = \"https://api.exemplo.com/graphql\"</p>\n\n<p>class TestGraphQL:</p>\n\n<p>def test_query_basica(self):<br>        \"\"\"Deve buscar dados com query GraphQL\"\"\"<br>        query = \"\"\"<br>        query {<br>            usuario(id: 1) {<br>                id<br>                nome<br>                email<br>            }<br>        }<br>        \"\"\"</p>\n\n<p>response = requests.post(<br>            GRAPHQL_URL,<br>            json={\"query\": query}<br>        )</p>\n\n<p>assert response.status_code == 200<br>        data = response.json()<br>        assert \"data\" in data<br>        assert \"usuario\" in data[\"data\"]<br>        assert data[\"data\"][\"usuario\"][\"nome\"]</p>\n\n<p>def test_query_com_parametros(self):<br>        \"\"\"Deve filtrar com argumentos\"\"\"<br>        query = \"\"\"<br>        query($limite: Int) {<br>            produtos(limit: $limite) {<br>                id<br>                nome<br>                preco<br>            }<br>        }<br>        \"\"\"</p>\n\n<p>response = requests.post(<br>            GRAPHQL_URL,<br>            json={<br>                \"query\": query,<br>                \"variables\": {\"limite\": 5}<br>            }<br>        )</p>\n\n<p>data = response.json()<br>        assert len(data[\"data\"][\"produtos\"]) &lt;= 5</p>\n\n<p>def test_mutation_inserir(self):<br>        \"\"\"Deve criar dado com mutation\"\"\"<br>        mutation = \"\"\"<br>        mutation {<br>            criarUsuario(input: {<br>                nome: \"Maria Silva\"<br>                email: \"maria@exemplo.com\"<br>                senha: \"Senha@123\"<br>            }) {<br>                id<br>                nome<br>                email<br>            }<br>        }<br>        \"\"\"</p>\n\n<p>response = requests.post(GRAPHQL_URL, json={\"query\": mutation})</p>\n\n<p>assert response.status_code == 200<br>        data = response.json()<br>        assert \"errors\" not in data<br>        assert data[\"data\"][\"criarUsuario\"][\"nome\"] == \"Maria Silva\"<br></code></pre></p>\n\n<h3>Introspection para Validação</h3>\n\n<pre><code>def test_graphql_introspection():\n    \"\"\"Deve permitir introspection do schema\"\"\"\n    query = \"\"\"\n    {\n        __schema {\n            types {\n                name\n                kind\n            }\n        }\n    }\n    \"\"\"\n\n<p>response = requests.post(GRAPHQL_URL, json={\"query\": query})<br>    data = response.json()</p>\n\n<p>assert \"data\" in data<br>    type_names = [t[\"name\"] for t in data[\"data\"][\"__schema\"][\"types\"]]<br>    assert \"Query\" in type_names<br></code></pre></p>\n\n<hr>\n<h2>Microserviços: Testando em Ambientes Distribuídos</h2>\n\n<h3>Service Mesh Testing</h3>\n\n<pre><code>┌─────────────┐     ┌─────────────┐     ┌─────────────┐\n│   API GW    │────▶│   Auth Svc  │────▶│  User Svc   │\n│   :8080     │     │   :8081     │     │   :8082     │\n└─────────────┘     └─────────────┘     └─────────────┘\n       │                                      │\n       │                                      │\n       ▼                                      ▼\n┌─────────────┐                        ┌─────────────┐\n│   Product   │                        │  Database   │\n│   Svc :8083 │                        │   :5432     │\n└─────────────┘                        └─────────────┘\n</code></pre>\n\n<h3>Testes de Contrato com Pact</h3>\n\n<pre><code># Provider (microserviço de usuários)\nfrom pact import Consumer, Provider\n\n<p>pact = Consumer(\'API-Gateway\').has_pact_with(Provider(\'User-Service\'))<br>pact.start_service()</p>\n\n<p>try:<br>    # Definir expectativas<br>    (pact<br>     .given(\'user with id 1 exists\')<br>     .upon_receiving(\'a request for user 1\')<br>     .with_request(\'GET\', \'/users/1\')<br>     .will_respond_with(200, body={<br>         \'id\': 1,<br>         \'name\': \'Test User\',<br>         \'email\': \'test@example.com\'<br>     })<br>     .verify())</p>\n\n<p># Verificar provider<br>    from pact.matchers import like, Term</p>\n\n<p>(pact<br>     .given(\'user exists\')<br>     .upon_receiving(\'a request for users\')<br>     .with_request(\'GET\', \'/users\')<br>     .will_respond_with(200, body=[<br>         like({<br>             \'id\': 1,<br>             \'name\': Term(\'w+\', \'Test User\'),<br>             \'email\': Term(r\'[w.]+@[w.]+\', \'test@example.com\')<br>         })<br>     ])<br>     .verify())<br>finally:<br>    pact.stop_service()<br></code></pre></p>\n\n<h3>Contrato Consumer-Driven</h3>\n\n<pre><code>// contract.json (gerado pelo consumer)\n{\n  \"consumer\": {\n    \"name\": \"Order-Service\"\n  },\n  \"provider\": {\n    \"name\": \"User-Service\"\n  },\n  \"interactions\": [\n    {\n      \"description\": \"Get user details\",\n      \"request\": {\n        \"method\": \"GET\",\n        \"path\": \"/users/1\"\n      },\n      \"response\": {\n        \"status\": 200,\n        \"body\": {\n          \"id\": 1,\n          \"name\": \"John\",\n          \"email\": \"john@example.com\"\n        }\n      }\n    }\n  ]\n}\n</code></pre>\n\n<h3>TestContainers para Microserviços</h3>\n\n<pre><code>import pytest\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\n\n<p>@pytest.fixture(scope=\"module\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as pg:<br>        yield pg</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def redis():<br>    with RedisContainer(\"redis:7\") as rd:<br>        yield rd</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def user_service(postgres, redis):<br>    with DockerCompose(\".\") as compose:<br>        # Start user-service<br>        compose.exec(\"user-service\", \"python\", \"manage.py\", \"migrate\")<br>        port = compose.expose(\"user-service\", 8080)<br>        yield f\"http://localhost:{port}\"<br></code></pre></p>\n\n<hr>\n<h2>Postman: Collection Runner</h2>\n\n<h3>Collection Structure</h3>\n\n<pre><code>{\n  \"info\": {\n    \"name\": \"E-commerce API\",\n    \"schema\": \"https://schema.getpostman.com/json/collection/v2.1.0/collection.json\"\n  },\n  \"item\": [\n    {\n      \"name\": \"Auth\",\n      \"item\": [\n        {\n          \"name\": \"Login\",\n          \"event\": [\n            {\n              \"listen\": \"test\",\n              \"script\": {\n                \"exec\": [\n                  \"pm.test(\'Status 200\', () =&gt; {\",\n                  \"  pm.response.to.have.status(200);\",\n                  \"});\",\n                  \"pm.test(\'Token received\', () =&gt; {\",\n                  \"  const jsonData = pm.response.json();\",\n                  \"  pm.collectionVariables.set(\'token\', jsonData.token);\",\n                  \"});\"\n                ]\n              }\n            }\n          ],\n          \"request\": {\n            \"method\": \"POST\",\n            \"url\": \"{{baseUrl}}/auth/login\",\n            \"body\": {\n              \"mode\": \"raw\",\n              \"raw\": \"{\"email\":\"test@test.com\",\"password\":\"test123\"}\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"Users\",\n      \"item\": [\n        {\n          \"name\": \"Get All Users\",\n          \"request\": {\n            \"auth\": {\n              \"type\": \"bearer\",\n              \"bearer\": [{\"key\": \"token\", \"value\": \"{{token}}\"}]\n            },\n            \"method\": \"GET\",\n            \"url\": \"{{baseUrl}}/users\"\n          }\n        }\n      ]\n    }\n  ]\n}\n</code></pre>\n\n<h3>Newman CLI</h3>\n\n<pre><code># Executar collection\nnewman run ecommerce-api.postman_collection.json \n  --environment dev.postman_environment.json \n  --reporters html,json \n  --reporter-json-export results.json \n  --reporter-html-export report.html\n\n<p># Com CI/CD<br>newman run collection.json <br>  --environment ${{ secrets.POSTMAN_ENV }} <br>  --iteration-count 1 <br>  --bail<br></code></pre></p>\n\n<hr>\n<h2>Frameworks de Teste de API</h2>\n\n<h3>RestAssured (Java)</h3>\n\n<pre><code>import static io.restassured.RestAssured.*;\nimport static io.restassured.matcher.RestAssuredMatchers.*;\nimport static org.hamcrest.Matchers.*;\n\n<p>class UserApiTest {</p>\n\n<p>@BeforeAll<br>    static void setup() {<br>        RestAssured.baseURI = \"https://api.exemplo.com/v1\";<br>    }</p>\n\n<p>@Test<br>    void criarUsuario() {<br>        given()<br>            .contentType(\"application/json\")<br>            .body(\"\"\"<br>                {<br>                    \"nome\": \"João Silva\",<br>                    \"email\": \"joao@exemplo.com\",<br>                    \"senha\": \"Senha@123\"<br>                }<br>                \"\"\")<br>        .when()<br>            .post(\"/usuarios\")<br>        .then()<br>            .statusCode(201)<br>            .body(\"nome\", equalTo(\"João Silva\"))<br>            .body(\"email\", equalTo(\"joao@exemplo.com\"))<br>            .body(\"id\", notNullValue())<br>            .body(\"senha\", nullValue());<br>    }</p>\n\n<p>@Test<br>    void validarSchema() {<br>        given()<br>            .get(\"/usuarios/1\")<br>        .then()<br>            .statusCode(200)<br>            .body(matchesJsonSchemaInClasspath(\"schemas/usuario.json\"));<br>    }<br>}<br></code></pre></p>\n\n<h3>Pytest + requests</h3>\n\n<pre><code># pytest.ini\n[pytest]\naddopts = -v --tb=short --strict-markers\nmarkers =\n    smoke: Smoke tests\n    integration: Integration tests\n    slow: Slow running tests\n\n<p># conftest.py<br>import pytest<br>import requests</p>\n\n<p>@pytest.fixture<br>def api_client():<br>    class APIClient:<br>        base_url = \"https://api.exemplo.com/v1\"</p>\n\n<p>def __init__(self):<br>            self.session = requests.Session()</p>\n\n<p>def create_user(self, data):<br>            return self.session.post(f\"{self.base_url}/usuarios\", json=data)</p>\n\n<p>def get_user(self, user_id):<br>            return self.session.get(f\"{self.base_url}/usuarios/{user_id}\")</p>\n\n<p>def delete_user(self, user_id):<br>            return self.session.delete(f\"{self.base_url}/usuarios/{user_id}\")</p>\n\n<p>return APIClient()</p>\n\n<p>@pytest.fixture<br>def clean_user(api_client):<br>    \"\"\"Cria usuário para teste e limpa depois\"\"\"<br>    user_data = {<br>        \"nome\": \"Test User\",<br>        \"email\": f\"test_{uuid4()}@exemplo.com\",<br>        \"senha\": \"Senha@123\"<br>    }<br>    response = api_client.create_user(user_data)<br>    user_id = response.json()[\"id\"]</p>\n\n<p>yield user_id</p>\n\n<p># Cleanup<br>    api_client.delete_user(user_id)</p>\n\n<p># test_api.py<br>@pytest.mark.integration<br>def test_criar_e_buscar_usuario(api_client):<br>    # Create<br>    user_data = {\"nome\": \"Test\", \"email\": \"test@ex.com\", \"senha\": \"123\"}<br>    response = api_client.create_user(user_data)<br>    assert response.status_code == 201<br>    user_id = response.json()[\"id\"]</p>\n\n<p># Read<br>    response = api_client.get_user(user_id)<br>    assert response.status_code == 200<br>    assert response.json()[\"nome\"] == \"Test\"<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testar APIs é fundamental para garantir qualidade em arquiteturas modernas. As chaves são:<br><ol><li><strong>Cobertura completa</strong> - Funcional, contrato, performance, segurança</li><br><li><strong>Automação</strong> - CI/CD com collections automatizadas</li><br><li><strong>Contratos</strong> - Consumer-driven contracts para microservices</li><br><li><strong>Isolamento</strong> - TestContainers para dependências</li><br><li><strong>Monitoramento</strong> - API health checks em produção</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Postman substitui testes de código?</strong>  <br>R: Não. Postman é excelente para exploratory e collections, mas testes em código são mais versionáveis e reutilizáveis.</p>\n\n<p><strong>P: Como testar APIs GraphQL?</strong>  <br>R: Use GraphQL client libraries (gql, strawberry) e valide queries, mutations e subscriptions.</p>\n\n<p><strong>P: Contract testing é necessário?</strong>  <br>R: Essencial em microservices. Consumer-driven contracts (Pact) garantem que mudanças não quebram consumidores.</p>\n\n<p><strong>P: Quanto coverage é suficiente?</strong>  <br>R: 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos endpoints críticos, pelo menos 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos endpoints públicos.</p>', 'Testes de API: REST, GraphQL e Microserviços', '', 'inherit', 'closed', 'closed', '', '191-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '191', 'http://localhost:8082/ideiasti/?p=421', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('422', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a testar usabilidade: heurísticas de Nielsen, testes com usuários, análise heurística, e como garantir que seus produtos sejam intuitivos e fáceis de usar.</p>\n\n<hr>\n<h2>Introdução aos Testes de Usabilidade</h2>\n\n<p>Testes de usabilidade avaliam quão fácil e intuitivo é usar um produto. São essenciais para garantir que usuários consigam completar suas tarefas eficientemente, sem frustração.</p>\n\n<h3>Por Que Usabilidade Importa?</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Impacto</th><th>Dado</th></tr>\n<tr><td><strong>Receita</strong></td><td>88{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} desiste após experiência ruim</td></tr>\n<tr><td><strong>Suporte</strong></td><td>Custos de suporte dobram com UX ruim</td></tr>\n<tr><td><strong>Conversão</strong></td><td>UX otimizada = +200{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} conversões</td></tr>\n<tr><td><strong>Retenção</strong></td><td>UX excelente = +90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} retenção</td></tr>\n<tr><td><strong>Brand</strong></td><td>73{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} culpa site pelo abandono</td></tr>\n</table></figure>\n\n<hr>\n<h2>As 10 Heurísticas de Nielsen</h2>\n\n<p>Jakob Nielsen definiu 10 princípios para avaliar usabilidade:</p>\n\n<h3>H1: Visibilidade do Status do Sistema</h3>\n\n<p><strong>Descrição:</strong> O sistema deve manter os usuários informados sobre o que está acontecendo.</p>\n\n<pre><code># BOM - Status visível\n✓ Barra de progresso durante upload\n✓ Indicador de \"Salvando...\"\n✓ Toast notification após ação\n\n<p># RUIM - Sem feedback<br>✗ Tela congelada sem indicator<br>✗ Upload sem progresso<br>✗ Confirmação unclear<br></code></pre></p>\n\n<h3>H2: Correspondência entre Sistema e Mundo Real</h3>\n\n<p><strong>Descrição:</strong> Use linguagem e conceitos familiares ao usuário.</p>\n\n<pre><code># BOM\n✓ Ícones de carrinho, lixeira, envelope\n✓ Labels em português correto\n✓ Jargão do domínio, não técnico\n\n<p># RUIM<br>✗ Códigos internos visíveis ao usuário<br>✗ Mensagens de erro técnicas<br>✗ Nomenclatura inconsistente<br></code></pre></p>\n\n<h3>H3: Controle e Liberdade do Usuário</h3>\n\n<p><strong>Descrição:</strong> Ofereça \"saídas de emergência\" e capacidade de desfazer ações.</p>\n\n<pre><code># BOM\n✓ Botão \"Cancelar\" claro\n✓ Undo/Redo disponíveis\n✓ Navegação consistente (back button)\n✓ Discard/Excluir com confirmação\n\n<p># RUIM<br>✗ Ações sem confirmação<br>✗ Sem como cancelar operação<br>✗ Dead ends na navegação<br></code></pre></p>\n\n<h3>H4: Consistência e Padrões</h3>\n\n<p><strong>Descrição:</strong> Mantenha consistência dentro do produto e com convenções da plataforma.</p>\n\n<pre><code># BOM\n✓ Mesmo estilo de botões\n✓ Terminologia consistente\n✓ Padrões de plataforma (iOS/Android)\n\n<p># RUIM<br>✗ Labels diferentes para mesma ação<br>✗ Cores diferentes para mesmo tipo<br>✗ Posições diferentes de elementos<br></code></pre></p>\n\n<h3>H5: Prevenção de Erros</h3>\n\n<p><strong>Descrição:</strong> Melhor do que mensagens de erro é prevenir que erros aconteçam.</p>\n\n<pre><code># BOM\n✓ Máscara de input (telefone, CPF)\n✓ Autocomplete com sugestões\n✓ Desabilitar botão enquanto processa\n✓ Validação em tempo real\n\n<p># RUIM<br>✗ Form提交 sem validação<br>✗ Botão ativo durante loading<br>✗ Senha sem requisitos visíveis<br></code></pre></p>\n\n<h3>H6: Reconhecimento ao Invés de Memorização</h3>\n\n<p><strong>Descrição:</strong> Torne opções e ações visíveis, sem forçar memorização.</p>\n\n<pre><code># BOM\n✓ Breadcrumbs sempre visíveis\n✓ Menus com ícones + texto\n✓ Histórico de navegação\n✓ Labels descritivos\n\n<p># RUIM<br>✗ Navegação só por atalhos<br>✗ Menu com ícones misteriosos<br>✗ Sem orientação contextual<br></code></pre></p>\n\n<h3>H7: Flexibilidade e Eficiência de Uso</h3>\n\n<p><strong>Descrição:</strong> Acomode usuários iniciantes e avançados.</p>\n\n<pre><code># BOM\n✓ Shortcuts para power users\n✓ Configurações avançadas (ocultas)\n✓ Onboarding para novos\n✓ Customização de interface\n\n<p># RUIM<br>✗ Tudo ou nada<br>✗ Sem atalhos possíveis<br>✗ Interface única para todos<br></code></pre></p>\n\n<h3>H8: Design Estético e Minimalista</h3>\n\n<p><strong>Descrição:</strong> Remova informações irrelevantes.</p>\n\n<pre><code># BOM\n✓ Foco no essencial\n✓ Hierarquia visual clara\n✓ White space adequado\n✓ Progressive disclosure\n\n<p># RUIM<br>✗ Informações demais<br>✗ Banners e popups constantes<br>✗ Tudo na mesma tela<br></code></pre></p>\n\n<h3>H9: Ajuda para Reconhecer Erros</h3>\n\n<p><strong>Descrição:</strong> Mensagens de erro devem ajudar o usuário a resolver.</p>\n\n<pre><code># BOM\n✓ \"Email inválido. Formato: usuario@dominio.com\"\n✓ \"Senha deve ter 8+ caracteres, incluindo número\"\n✓ Highlight do campo com erro\n\n<p># RUIM<br>✗ \"Erro 500\"<br>✗ \"Algo deu errado\"<br>✗ Erro sem указание do que fazer<br></code></pre></p>\n\n<h3>H10: Ajuda e Documentação</h3>\n\n<p><strong>Descrição:</strong> Forneça ajuda quando necessário.</p>\n\n<pre><code># BOM\n✓ Tooltips informativos\n✓ FAQ ou central de ajuda\n✓ Onboarding guiado\n✓ Chat de suporte\n\n<p># RUIM<br>✗ Sem documentação<br>✗ Documentação desatualizada<br>✗ Ajuda difícil de encontrar<br></code></pre></p>\n\n<hr>\n<h2>Tipos de Testes de Usabilidade</h2>\n\n<h3>1. Testes com Usuários</h3>\n\n<h4>Setup</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Aspecto</th><th>Recomendação</th></tr>\n<tr><td><strong>Participantes</strong></td><td>5-8 para finding inicial</td></tr>\n<tr><td><strong>Perfil</strong></td><td>Similar ao público real</td></tr>\n<tr><td><strong>Ambiente</strong></td><td>Silencioso, sem distrações</td></tr>\n<tr><td><strong>Duração</strong></td><td>30-90 minutos por sessão</td></tr>\n<tr><td><strong>Gravação</strong></td><td>Tela + rosto + áudio</td></tr>\n</table></figure>\n\n<h4>Tarefas para Usuário</h4>\n\n<pre><code># Tarefas para Teste de E-commerce\n<ol><li>\"Encontre uma camisa azul tamanho M e adicione ao carrinho\"</li>\n</ol>   - Tempo: ___\n   - Sucesso: ✓/✗\n   - Dificuldades: ___\n<ol><li>\"Use um cupom de desconto de 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</li>\n</ol>   - Tempo: ___\n   - Sucesso: ✓/✗\n   - Dificuldades: ___\n<ol><li>\"Finalize a compra como visitante\"</li>\n</ol>   - Tempo: ___\n   - Sucesso: ✓/✗\n   - Dificuldades: ___\n</code></pre>\n\n<h4>Métricas</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Target</th></tr>\n<tr><td><strong>Tempo na tarefa</strong></td><td>Cronômetro</td><td>&lt; 60s para simples</td></tr>\n<tr><td><strong>Taxa de sucesso</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} completou</td><td>&gt; 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Erros</strong></td><td>Contagem</td><td>&lt; 2 por tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Questionnaire (SUS)</td><td>&gt; 70</td></tr>\n<tr><td><strong>Confusão</strong></td><td>Observação</td><td>Minimo</td></tr>\n</table></figure>\n\n<h3>2. Análise Heurística</h3>\n\n<pre><code># Avaliação Heurística\n\n<p>Avaliador: [Nome]<br>Data: [Data]<br>Produto: [Nome]</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Heurística</th><th>Conformidade</th><th>Severidade</th><th>Comentários</th></tr>\n<tr><td>H1: Status</td><td>⚠️ 2/5</td><td>Média</td><td>Carrinho sem count badge</td></tr>\n<tr><td>H2: Mundo Real</td><td>✓ 5/5</td><td>-</td><td>Excelente</td></tr>\n<tr><td>H3: Controle</td><td>✗ 1/5</td><td>Alta</td><td>Sem undo</td></tr>\n<tr><td>H4: Consistência</td><td>✓ 5/5</td><td>-</td><td>Excelente</td></tr>\n<tr><td>H5: Prevenção</td><td>⚠️ 3/5</td><td>Baixa</td><td>Validação tardia</td></tr>\n<tr><td>...</td><td>...</td><td>...</td><td>...</td></tr>\n</table></figure>\n\n<p>Legenda Severidade:<br><ul><li>Crítica: Deve corrigir imediatamente</li><ol><li>Alta: Corrigir na próxima release</li><br><li>Média: Corrigir se tempo</li><br><li>Baixa: Nice to have</li><br></ol></code></pre></p>\n\n<h3>3. Questionário SUS (System Usability Scale)</h3>\n\n<pre><code># SUS Score\n\n<p>Responda de 1 (Discordo totalmente) a 5 (Concordo totalmente):<br><ol><li>Eu acho que gostaria de usar este sistema frequentemente</li><br><li>Eu achei o sistema inutilmente complexo</li><br><li>Eu achei o sistema fácil de usar</li><br><li>Eu precisaria de suporte técnico para usar este sistema</li><br><li>Eu encontrei várias funções bem integradas neste sistema</li><br><li>Eu achei que havia muita inconsistência neste sistema</li><br><li>A maioria das pessoas aprenderia a usar este sistema rapidamente</li><br><li>Eu achei o sistema muito trabalhoso de usar</li><br><li>Eu me senti confiante usando o sistema</li><br><li>Eu precisei aprender muitas coisas antes de conseguir usar o sistema</li><br></ol><br>Cálculo:<ol><li>Para itens ímpares (1,3,5,7,9): score = resposta - 1</li><br><li>Para itens pares (2,4,6,8,10): score = 5 - resposta</li><br><li>SUS = (soma dos scores) × 2.5</li><br></ol><br>Interpretação:<ol><li>90+ = A+ (Best imaginable)</li><br><li>80-90 = A (Excellent)</li><br><li>70-80 = B (Good)</li><br><li>60-70 = C (Okay)</li><br><li>50-60 = D (Poor)</li><br><li>&lt;50 = F (Fail)</li><br></ol></code></pre></p>\n\n<hr>\n<h2>Ferramentas de Teste de Usabilidade</h2>\n\n<h3>1. Observação Remota</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Características</th><th>Custo</th></tr>\n<tr><td><strong>UserTesting</strong></td><td>Painel de participantes</td><td>$39/sessão</td></tr>\n<tr><td><strong>Optimal Workshop</strong></td><td>Card sorting, tree testing</td><td>$100+/mês</td></tr>\n<tr><td><strong>Hotjar</strong></td><td>Heatmaps, recordings</td><td>Grátis/Pro</td></tr>\n<tr><td><strong>Lookback</strong></td><td>Gravação + entrevistas</td><td>Sob consulta</td></tr>\n<tr><td><strong>Maze</strong></td><td>Testing rápido</td><td>Grátis/Pro</td></tr>\n</table></figure>\n\n<h3>2. Heatmaps e Clickmaps</h3>\n\n<pre><code>// Hotjar Heatmap\n// Tracking automático de:\n// - Movimentos do mouse\n// - Cliques\n// - Scroll depth\n// - Tempo de visão\n\n<p>// Configuração<br>hj(\'heatmap\', {<br>    scrollmap: true,<br>    clickmap: true,<br>    recording: true<br>});<br></code></pre></p>\n\n<h3>3. A/B Testing para UX</h3>\n\n<pre><code>// Google Optimize / VWO\n// Testar variações de UI\n\n<p>// Exemplo de implementação<br>function showABTest() {<br>    const variation = Math.random() &gt; 0.5 ? \'A\' : \'B\';</p>\n\n<p>if (variation === \'A\') {<br>        // Versão atual<br>        document.getElementById(\'cta\').textContent = \'Compre Agora\';<br>    } else {<br>        // Nova versão<br>        document.getElementById(\'cta\').textContent = \'Comece Seu Teste Grátis\';<br>    }</p>\n\n<p>// Rastrear resultado<br>    analytics.track(\'cta_variation\', { variation });<br>}<br></code></pre></p>\n\n<hr>\n<h2>WCAG 2.1 - Acessibilidade</h2>\n\n<h3>4 Princípios (POUR)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Princípio</th><th>Descrição</th></tr>\n<tr><td><strong>Perceivable</strong></td><td>Informations deve ser perceptível</td></tr>\n<tr><td><strong>Operable</strong></td><td>Interface deve ser operável</td></tr>\n<tr><td><strong>Understandable</strong></td><td>Informações e operação compreensíveis</td></tr>\n<tr><td><strong>Robust</strong></td><td>Conteúdo deve ser robusto</td></tr>\n</table></figure>\n\n<h3>Critérios de Conformidade (Resumo)</h3>\n\n<pre><code><h2>Nível A (Básico)</h2>\n\n<p>✓ Alternativas textuais para imagens<br>✓ Captions para vídeos<br>✓ Cor não é único meio de informação<br>✓ Navegação por teclado<br>✓ Sem flash mais que 3x/segundo</p>\n\n<h2>Nível AA (Recomendado)</h2>\n\n<p>✓ Contraste mínimo 4.5:1 (texto), 3:1 (grande)<br>✓ Redimensionamento de texto<br>✓ Multiple ways de encontrar conteúdo<br>✓ Cabeçalhos e labels descritivos<br>✓ Sem timing ajustável</p>\n\n<h2>Nível AAA (Avançado)</h2>\n\n<p>✓ Contraste 7:1<br>✓ Audio description<br>✓ Sign language interpretation<br>✓ Enhanced contrast<br></code></pre></p>\n\n<hr>\n<h2>Checklist de Usabilidade</h2>\n\n<h3>Formulários</h3>\n<ol><li>[ ] Labels visíveis (não só placeholders)</li>\n<li>[ ] Campos com autocomplete</li>\n<li>[ ] Validação inline e helpful</li>\n<li>[ ] Tab order logical</li>\n<li>[ ] Required fields indication</li>\n<li>[ ] Error messages específicos</li>\n<li>[ ] Success confirmation</li>\n</ol>\n<h3>Navegação</h3>\n<ol><li>[ ] Logo retorna para home</li>\n<li>[ ] Menu sempre visível</li>\n<li>[ ] Breadcrumbs quando aplicável</li>\n<li>[ ] Search funcional</li>\n<li>[ ] 404 page útil</li>\n<li>[ ] Consistent header/footer</li>\n</ol>\n<h3>Mobile</h3>\n<ol><li>[ ] Touch targets &gt; 48px</li>\n<li>[ ] No horizontal scroll</li>\n<li>[ ] Viewport configured</li>\n<li>[ ] Font size legível (16px min)</li>\n<li>[ ] Space between links</li>\n<li>[ ] Thumb zone respeitada</li>\n</ol>\n<h3>Performance</h3>\n<ol><li>[ ] First paint &lt; 1.5s</li>\n<li>[ ] Interactive &lt; 3s</li>\n<li>[ ] No layout shift</li>\n<li>[ ] Skeleton loading</li>\n<li>[ ] Progressive enhancement</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de usabilidade são essenciais para criar produtos que usuários amam. As chaves para o sucesso são:<br><ol><li><strong>Testar com usuários reais</strong> - Não presuma, observe</li><br><li><strong>Usar heurísticas</strong> - Checklist estruturado</li><br><li><strong>Medir objetivamente</strong> - Métricas + qualititativo</li><br><li><strong>Priorizar</strong> - Nem tudo pode ser corrigido agora</li><br><li><strong>Iterar</strong> - UX é melhoria contínua</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Quantos usuários preciso testar?</strong>  <br>R: 5-8 para encontrar a maioria dos problemas (Lei dos retornos decrescentes).</p>\n\n<p><strong>P: Quando fazer testes de usabilidade?</strong>  <br>R: Idealmente antes do design (pesquisa) e depois do MVP (validação).</p>\n\n<p><strong>P: Posso fazer testes de usabilidade remotamente?</strong>  <br>R: Sim! Ferramentas como UserTesting e Hotjar permitem testes remotos eficientes.</p>\n\n<p><strong>P: Como medir ROI de UX?</strong>  <br>R: Compare métricas antes/depois: tempo de tarefa, taxa de conclusão, satisfação (SUS).</p>', 'Testes de Usabilidade: Garantindo Excelência na Experiência do Usuário', '', 'inherit', 'closed', 'closed', '', '193-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '193', 'http://localhost:8082/ideiasti/?p=422', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('423', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a implementar testes de regressão eficazes: estratégias de seleção, automação, manutenção e como construir uma suite de regressão sustentável.</p>\n\n<hr>\n<h2>O Que São Testes de Regressão?</h2>\n\n<p>Testes de regressão são executados para garantir que mudanças recentes no código (novas funcionalidades, bug fixes, refactoring) não introduziram novos defeitos ou quebraram funcionalidades existentes.</p>\n\n<h3>Quando Executar Regressão</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Situação</th><th>Recomendação</th></tr>\n<tr><td>Antes de cada release</td><td>Suite completa</td></tr>\n<tr><td>Após hotfix</td><td>Smoke + área afetada</td></tr>\n<tr><td>Antes de deploy</td><td>Critical path</td></tr>\n<tr><td>Semanalmente (CI)</td><td>Suite rápida</td></tr>\n<tr><td>Sob demanda</td><td>Após mudanças críticas</td></tr>\n</table></figure>\n\n<hr>\n<h2>Estratégias de Seleção de Testes</h2>\n\n<h3>1. Regressão Completa</h3>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Quando usar:</strong><br><ul><li>Releases major</li><ol><li>Mudanças arquiteturais</li><br><li>After database migration</li><br><li>Final gate para produção</li><br></ol><br><h3>2. Regressão Parcial (Seletiva)</h3></p>\n\n<p>Seleciona subconjunto baseado em mudanças.</p>\n\n<pre><code># Exemplo: Selecionar testes por área afetada\ndef get_affected_tests(changed_files):\n    \"\"\"Retorna testes que devem ser executados\"\"\"\n\n<p>module_to_tests = {<br>        \'src/auth/\': [\'tests/auth/*.py\', \'tests/conftest.py\'],<br>        \'src/payment/\': [\'tests/payment/*.py\'],<br>        \'src/cart/\': [\'tests/cart/<em>.py\', \'tests/checkout/</em>.py\'],<br>    }</p>\n\n<p>tests = set()<br>    for changed_file in changed_files:<br>        module = extract_module(changed_file)<br>        if module in module_to_tests:<br>            tests.update(module_to_tests[module])</p>\n\n<p>return tests</p>\n\n<p># Executar apenas testes afetados<br>affected_tests = get_affected_tests(get_changed_files())<br>pytest.main(affected_tests)<br></code></pre></p>\n\n<h3>3. Regressão Baseada em Risco</h3>\n\n<p>Prioriza por risco de impacto.</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Prioridade</th><th>Critério</th><th>Execução</th></tr>\n<tr><td><strong>Crítica</strong></td><td>Fluxos de pagamento, auth</td><td>Sempre</td></tr>\n<tr><td><strong>Alta</strong></td><td>Features principais</td><td>Antes de cada release</td></tr>\n<tr><td><strong>Média</strong></td><td>Features secundárias</td><td>Semanalmente</td></tr>\n<tr><td><strong>Baixa</strong></td><td>Edge cases</td><td>Mensalmente</td></tr>\n</table></figure>\n\n<h3>4. Regressão Híbrida</h3>\n\n<p>Combina múltiplas estratégias.</p>\n\n<pre><code># strategy: Hybrid Regression\n\n<p># Nivel 1: Critical (sempre)<ol><li>tests/auth/login*.py</li><br><li>tests/auth/logout*.py</li><br><li>tests/payment/checkout*.py</li><br><li>tests/smoke/*.py</li><br></ol><br># Nivel 2: Based on changes<ol><li>get_affected_tests()</li><br></ol><br># Nivel 3: Risk-based<ol><li>tests/high_risk_features*.py</li><br></ol><br># Nivel 4: Full (releases only)<ol><li>tests/full_suite/*.py</li></ol></ul><br></code></pre></p>\n\n<hr>\n<h2>Automação de Regressão</h2>\n\n<h3>Framework Ideal</h3>\n\n<pre><code>regression_suite/\n├── conftest.py              # Setup global\n├── pytest.ini               # Configuração\n├── requirements.txt         # Dependências\n│\n├── core/\n│   ├── __init__.py\n│   ├── base_page.py         # Page Object base\n│   ├── api_client.py        # Cliente API\n│   └── database.py          # Helpers de DB\n│\n├── pages/                   # Page Objects\n│   ├── login_page.py\n│   ├── dashboard_page.py\n│   └── checkout_page.py\n│\n├── api/                     # API Tests\n│   ├── test_auth.py\n│   ├── test_products.py\n│   └── test_orders.py\n│\n├── ui/                      # UI Tests\n│   ├── test_login.py\n│   ├── test_checkout.py\n│   └── test_profile.py\n│\n├── smoke/                   # Smoke Tests\n│   └── test_critical_path.py\n│\n├── data/                    # Data files\n│   └── users.json\n│\n└── reports/                 # Relatórios\n    └── .gitkeep\n</code></pre>\n\n<h3>Page Object Pattern</h3>\n\n<pre><code># pages/base_page.py\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n<p>class BasePage:<br>    def __init__(self, driver):<br>        self.driver = driver<br>        self.wait = WebDriverWait(driver, 10)</p>\n\n<p>def click(self, locator):<br>        self.wait.until(EC.element_to_be_clickable(locator)).click()</p>\n\n<p>def send_keys(self, locator, text):<br>        element = self.wait.until(EC.presence_of_element_located(locator))<br>        element.clear()<br>        element.send_keys(text)</p>\n\n<p>def get_text(self, locator):<br>        return self.wait.until(EC.presence_of_element_located(locator)).text</p>\n\n<p>def is_visible(self, locator):<br>        try:<br>            return self.wait.until(<br>                EC.visibility_of_element_located(locator)<br>            ).is_displayed()<br>        except:<br>            return False</p>\n\n<p># pages/login_page.py<br>from selenium.webdriver.common.by import By</p>\n\n<p>class LoginPage(BasePage):<br>    URL = \"https://exemplo.com/login\"</p>\n\n<p>EMAIL = (By.ID, \"email\")<br>    PASSWORD = (By.ID, \"password\")<br>    LOGIN_BUTTON = (By.ID, \"login-button\")<br>    ERROR_MESSAGE = (By.CLASS_NAME, \"error-message\")</p>\n\n<p>def load(self):<br>        self.driver.get(self.URL)<br>        return self</p>\n\n<p>def login(self, email, password):<br>        self.send_keys(self.EMAIL, email)<br>        self.send_keys(self.PASSWORD, password)<br>        self.click(self.LOGIN_BUTTON)<br>        return self</p>\n\n<p>def get_error(self):<br>        return self.get_text(self.ERROR_MESSAGE)<br></code></pre></p>\n\n<h3>Execução Paralela</h3>\n\n<pre><code># pytest.ini\n[pytest]\naddopts = -n auto --dist loadscope\n# -n auto: usa todas CPUs disponíveis\n# --dist loadscope: agrupa testes por scope\n</code></pre>\n\n<pre><code># GitHub Actions\nname: Regression Tests\n\n<p>on:<br>  schedule:<br>    - cron: \'0 6 <em> </em> 1\'  # Toda segunda 6h</p>\n\n<p>jobs:<br>  regression:<br>    runs-on: ubuntu-latest<br>    strategy:<br>      matrix:<br>        shard: [1, 2, 3, 4]</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run test shard ${{ matrix.shard }}<br>        run: |<br>          pytest tests/ <br>            --dist loadscope <br>            --maxprocesses 4 <br>            --split=${{ matrix.shard }}/4<br></code></pre></p>\n\n<hr>\n<h2>Manutenção da Suite</h2>\n\n<h3>Identificando Testes Obsoletos</h3>\n\n<pre><code># script: identify_obsolete_tests.py\nimport subprocess\nfrom datetime import datetime\n\n<p>def analyze_test_usage():<br>    \"\"\"Analisa quais testes não foram executados ou falham sempre\"\"\"</p>\n\n<p>results = []</p>\n\n<p># 1. Testes sem execution recent<br>    git_log = subprocess.run(<br>        [\'git\', \'log\', \'--oneline\', \'--all\', \'--\', \'tests/\'],<br>        capture_output=True,<br>        text=True<br>    ).stdout</p>\n\n<p># 2. Testes que sempre falham<br>    # 3. Testes duplicados<br>    # 4. Cobertura redundante</p>\n\n<p>return results</p>\n\n<p># Gerar relatório<br>report = analyze_test_usage()<br>print(\"Testes para revisão:\")<br>for test in report:<br>    print(f\"  - {test[\'name\']}: {test[\'reason\']}\")<br></code></pre></p>\n\n<h3>Indicadores de \"Code Smell\" em Testes</h3>\n\n<pre><code># PROBLEMA: Teste faz muito\ndef test_criar_pedido_completo():\n    # Setup (50 linhas)\n    # Login (10 linhas)\n    # Add produto (15 linhas)\n    # Add outro produto (15 linhas)\n    # Apply cupom (10 linhas)\n    # Calculate shipping (10 linhas)\n    # Checkout (20 linhas)\n    # Payment (30 linhas)\n    # Verify (40 linhas)\n    # Cleanup (20 linhas)\n    # Total: 220 linhas - MUITO PARA UM TESTE!\n\n<p># SOLUÇÃO: Dividir em múltiplos testes focados<br>def test_adicionar_produto_ao_carrinho():<br>    \"\"\"Focado: adiciona produto\"\"\"<br>    pass</p>\n\n<p>def test_aplicar_cupom_desconto():<br>    \"\"\"Focado: aplica cupom\"\"\"<br>    pass</p>\n\n<p>def test_calcular_frete():<br>    \"\"\"Focado: calcula frete\"\"\"<br>    pass</p>\n\n<p>def test_checkout_com_sucesso():<br>    \"\"\"Integração: fluxo completo\"\"\"<br>    pass<br></code></pre></p>\n\n<hr>\n<h2>Métricas de Regressão</h2>\n\n<h3>Dashboard</h3>\n\n<pre><code># Grafana Dashboard - Regression Suite\n\n<p>panels:<br>  - title: \"Test Execution Time\"<br>    type: graph<br>    queries:<br>      - query: \"sum(rate(test_duration_seconds_sum[5m])) / sum(rate(test_duration_seconds_count[5m]))\"</p>\n\n<p>- title: \"Pass/Fail Rate\"<br>    type: piechart<br>    queries:<br>      - query: \"sum by (status) (test_results_total)\"</p>\n\n<p>- title: \"Flaky Tests\"<br>    type: stat<br>    queries:<br>      - query: \"count(test_flaky == 1)\"</p>\n\n<p>- title: \"Coverage Trend\"<br>    type: timeseries<br>    queries:<br>      - query: \"test_coverage_percentage\"<br></code></pre></p>\n\n<h3>KPIs</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Target</th><th>Current</th><th>Trend</th></tr>\n<tr><td>Pass Rate</td><td>&gt; 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>93{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>↑</td></tr>\n<tr><td>Execution Time</td><td>&lt; 30 min</td><td>35 min</td><td>↓</td></tr>\n<tr><td>Flaky Rate</td><td>&lt; 2{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>3{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>→</td></tr>\n<tr><td>Coverage</td><td>&gt; 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>78{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>↑</td></tr>\n<tr><td>Maintenance Effort</td><td>&lt; 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>↓</td></tr>\n</table></figure>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de regressão são a rede de segurança do seu software. Para uma suite eficaz:<br><ol><li><strong>Selecione estrategicamente</strong> - Nem tudo precisa de regressão completa</li><br><li><strong>Automatize</strong> - Regressão manual não escala</li><br><li><strong>Mantenha</strong> - Limpe testes obsoletos regularmente</li><br><li><strong>Monitore</strong> - Métricas guiam melhoria</li><br><li><strong>Priorize</strong> - Risco e impacto guiam execução</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Quantos testes deve ter na suite de regressão?</strong>  <br>R: Depende do projeto. Uma suite saudável cobre funcionalidades críticas com alta cobertura.</p>\n\n<p><strong>P: Como reduzir flaky tests?</strong>  <br>R: Use waits explícitos, isole testes, evite dependências, investigue root cause.</p>\n\n<p><strong>P: Testes de regressão devem ser no CI ou separate job?</strong>  <br>R: Smokes no CI (bloqueante), regressão completa em job separado (não bloqueante).</p>\n\n<p><strong>P: Como saber se a suite precisa de mais testes?</strong>  <br>R: Analise: bugs que passaram, áreas sem cobertura, novos riscos.</p>', 'Testes de Regressão: Garantindo Qualidade Contínua', '', 'inherit', 'closed', 'closed', '', '194-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '194', 'http://localhost:8082/ideiasti/?p=423', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('424', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Entenda como QA se integra às metodologias ágeis: Scrum, Kanban e XP. Aprenda a aplicar práticas de qualidade em equipes ágeis.</p>\n\n<hr>\n<h2>QA em Scrum</h2>\n\n<h3>Cerimônias e QA</h3>\n\n<h4>Sprint Planning</h4>\n<pre><code># Sprint Planning - Input de QA\n\n<h2>Antes da Planning</h2>\n<ul><li>[ ] Backlog priorizado pelo PO</li><ol><li>[ ] User stories com critérios de aceitação</li>\n<li>[ ] Histórias técnicas identificadas</li>\n</ol>\n<h2>Durante Planning</h2>\n<h3>Para cada história</h3><ol><li>PO apresenta requirements</li>\n<li>Devs estimam esforço</li>\n<li>QA identifica:</li>\n</ol>  - Riscos de teste\n  - Dados necessários\n  - Dependências\n  - Complexidade de automação<ol><li>timebox: ~1 hora por sprint</li>\n</ol>\n<h2>Output</h2><ol><li>[ ] Sprint backlog definido</li>\n<li>[ ] Definition of Done clara</li>\n<li>[ ] Dívidas técnicas identificadas</li>\n</ol></code></pre>\n\n<h4>Daily Standup</h4>\n<pre><code># Daily Standup - QA Updates\n\n<h2>Formato: 3 perguntas</h2>\n\n<h3>O que fiz ontem para ajudar o time?</h3><ol><li>\"Finalizei testes da história #123\"</li>\n<li>\"Revisei PR do João\"</li>\n</ol>\n<h3>O que farei hoje?</h3><ol><li>\"Vou testar história #124\"</li>\n<li>\"Vou automatizar teste de login\"</li>\n</ol>\n<h3>Há algum impedimento?</h3><ol><li>\"Aguardando ambiente de staging\"</li>\n<li>\"Preciso de acesso ao banco de produção\"</li>\n</ol>\n<h2>Tips para QA</h2><ol><li>Mantenha updates curtos (~30 segundos)</li>\n<li>Identifique bloqueios rápido</li>\n<li>Ajude devs com code review</li>\n<li>Coordene com outros QAers</li>\n</ol></code></pre>\n\n<h4>Sprint Review</h4>\n<pre><code># Sprint Review - Testing Handoff\n\n<h2>Demo Checklist</h2><ol><li>[ ] Funcionalidades demonstradas</li>\n<li>[ ] Critérios de aceitação cumpridos</li>\n<li>[ ] Testes executados</li>\n<li>[ ] Bugs documentados</li>\n</ol>\n<h2>Demo Format</h2><ol><li>\"O que foi feito?\"</li>\n<li>\"Como funciona?\"</li>\n<li>\"O que não foi feito?\" (e por quê)</li>\n<li>\"Próximos passos\"</li>\n</ol>\n<h2>Feedback de QA</h2><ol><li>Qualidade geral</li>\n<li>Issues encontrados</li>\n<li>Recomendações</li>\n</ol></code></pre>\n\n<h4>Sprint Retrospective</h4>\n<pre><code># Sprint Retrospective - QA Focus\n\n<h2>Start (O que começar a fazer?)</h2><ol><li>\"Começar a fazer BDD com time\"</li>\n<li>\"Começar a documentar testes\"</li>\n</ol>\n<h2>Stop (O que parar de fazer?)</h2><ol><li>\"Parar de fazer testes manuais em features pequenas\"</li>\n<li>\"Parar de aceitar histórias sem critérios de aceitação\"</li>\n</ol>\n<h2>Continue (O que continuar fazendo?)</h2><ol><li>\"Continuar pair testing\"</li>\n<li>\"Continuar code reviews\"</li>\n</ol>\n<h2>Ações para Próximo Sprint</h2><ol><li>[ ] Ação 1 - Responsável: João</li>\n<li>[ ] Ação 2 - Responsável: Maria</li>\n</ol></code></pre>\n\n<h3>Definition of Done (DoD)</h3>\n\n<pre><code># Definition of Done - Checklist\n\n<p>Para uma história ser considerada \"Done\":</p>\n\n<h2>Código</h2><ol><li>[ ] Código implementado</li>\n<li>[ ] Code review aprovado</li>\n<li>[ ] Branch merged to main</li>\n<li>[ ] Sem warnings de linter</li>\n</ol>\n<h2>Testes</h2><ol><li>[ ] Unit tests escritos (&gt; 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} coverage)</li>\n<li>[ ] Testes de integração passando</li>\n<li>[ ] Testes funcionais passando</li>\n<li>[ ] Testes de performance (se aplicável)</li>\n<li>[ ] Accessibility testes (se aplicável)</li>\n</ol>\n<h2>Qualidade</h2><ol><li>[ ] Segurança revisada</li>\n<li>[ ] Performance considerada</li>\n<li>[ ] Responsivo (se web/mobile)</li>\n<li>[ ] Logs implementados</li>\n</ol>\n<h2>Documentação</h2><ol><li>[ ] README atualizado</li>\n<li>[ ] API docs (se aplicável)</li>\n<li>[ ] Swagger/OpenAPI atualizado</li>\n</ol>\n<h2>Deploy</h2><ol><li>[ ] Deploy em staging</li>\n<li>[ ] Smoke tests passando</li>\n<li>[ ] Ready for production</li>\n</ol></code></pre>\n\n<hr>\n<h2>QA em Kanban</h2>\n\n<h3>Quadro Kanban</h3>\n\n<pre><code>┌──────────┬──────────┬──────────┬──────────┬──────────┐\n│  BACKLOG │  READY   │ IN DEV   │  TEST    │   DONE   │\n├──────────┼──────────┼──────────┼──────────┼──────────┤\n│  Story 5 │ Story 1  │ Story 2  │ Story 3  │ Story 4  │\n│  Story 6 │          │          │          │ Story 7  │\n│  Story 8 │          │          │          │          │\n└──────────┴──────────┴──────────┴──────────┴──────────┘\n    ∞            5           3          3           ∞\n</code></pre>\n\n<h3>WIP Limits</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Column</th><th>WIP Limit</th><th>Reason</th></tr>\n<tr><td>Ready</td><td>5</td><td>Capacidade do time</td></tr>\n<tr><td>In Dev</td><td>3</td><td>Focus por developer</td></tr>\n<tr><td>Test</td><td>3</td><td>Capacidade QA</td></tr>\n<tr><td>Review</td><td>2</td><td>Bottlenecks visíveis</td></tr>\n</table></figure>\n\n<h3>Métricas Kanban</h3>\n\n<pre><code># Lead Time e Cycle Time\nimport datetime\n\n<p>def calculate_metrics():<br>    tickets = [<br>        {<br>            \"id\": \"PROD-123\",<br>            \"created\": \"2024-01-01\",<br>            \"ready\": \"2024-01-03\",<br>            \"dev_start\": \"2024-01-05\",<br>            \"dev_done\": \"2024-01-08\",<br>            \"test_start\": \"2024-01-09\",<br>            \"test_done\": \"2024-01-10\",<br>            \"done\": \"2024-01-10\",<br>        }<br>    ]</p>\n\n<p>for ticket in tickets:<br>        created = datetime.datetime.strptime(ticket[\"created\"], \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}Y-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}m-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}d\")<br>        done = datetime.datetime.strptime(ticket[\"done\"], \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}Y-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}m-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}d\")</p>\n\n<p>lead_time = (done - created).days<br>        cycle_time = (done - datetime.datetime.strptime(<br>            ticket[\"dev_start\"], \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}Y-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}m-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}d\"<br>        )).days</p>\n\n<p>print(f\"{ticket[\'id\']}: Lead={lead_time}d, Cycle={cycle_time}d\")</p>\n\n<p># Throughput<br>def throughput(team_tickets):<br>    completed_last_30d = sum(<br>        1 for t in team_tickets <br>        if is_done_recently(t, 30)<br>    )<br>    return completed_last_30d<br></code></pre></p>\n\n<h3>Classes of Service</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Class</th><th>Priority</th><th>WIP</th><th>Lead Time Target</th></tr>\n<tr><td>Expedite</td><td>Crítica</td><td>1</td><td>&lt; 1 dia</td></tr>\n<tr><td>Fixed Date</td><td>Alta</td><td>2</td><td>Na data</td></tr>\n<tr><td>Standard</td><td>Normal</td><td>∞</td><td>&lt; 5 dias</td></tr>\n<tr><td>Intangible</td><td>Baixa</td><td>∞</td><td>Quando possível</td></tr>\n</table></figure>\n\n<hr>\n<h2>XP (Extreme Programming) e QA</h2>\n\n<h3>Práticas XP</h3>\n\n<h4>Pair Programming</h4>\n\n<pre><code># Pair Programming Roles\n\n<h2>Driver</h2><ol><li>Escreve o código</li>\n<li>Focado na implementação</li>\n<li>Compartilha tela</li>\n</ol>\n<h2>Navigator</h2><ol><li>Revisa código em tempo real</li>\n<li>Pensa estrategicamente</li>\n<li>Busca melhorias</li>\n<li>Agenda refatoração</li>\n</ol>\n<h2>Dicas</h2><ol><li>Troque papéis a cada 30-60 minutos</li>\n<li>Mantenha comunicação aberta</li>\n<li>Ambos são responsáveis pela qualidade</li>\n</ol>\n<h2>Benefícios</h2><ol><li>15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} mais lento, mas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos bugs</li>\n<li>Transferência de conhecimento</li>\n<li>Catches bugs em tempo real</li>\n</ol></code></pre>\n\n<h4>TDD em XP</h4>\n\n<pre><code># Ciclo TDD em XP\n# Red -&gt; Green -&gt; Refactor (em pares!)\n\n<p># 1. RED: Escrever teste que falha<br>def test_calcular_imposto():<br>    resultado = calcular_imposto(100, 0.1)<br>    assert resultado == 10</p>\n\n<p># 2. GREEN: Fazer passar (mínimo)<br>def calcular_imposto(valor, taxa):<br>    return 10  # Hardcoded</p>\n\n<p># 3. REFACTOR: Melhorar (em par)<br>def calcular_imposto(valor, taxa):<br>    return valor * taxa<br></code></pre></p>\n\n<h4>Continuous Integration</h4>\n\n<pre><code># CI Pipeline XP Style\nname: XP CI\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  test:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p># 1. Commit pequeno<br>      # 2. Build e test<br>      - run: pip install pytest pytest-cov</p>\n\n<p># 3. Todos testes passando<br>      - run: pytest -v --cov=src --cov-fail-under=80</p>\n\n<p># 4. Integrar frequentemente<br>      - name: Merge if green<br>        if: github.ref == \'main\'<br>        run: echo \"Ready to merge\"<br></code></pre></p>\n\n<hr>\n<h2>Métricas Ágeis de QA</h2>\n\n<h3>Defect Metrics</h3>\n\n<pre><code># Defect Metrics\nclass DefectMetrics:\n    def __init__(self, sprints):\n        self.sprints = sprints\n\n<p>def defect_leakage(self, sprint):<br>        \"\"\"Defeitos encontrados em produção vs. antes\"\"\"<br>        prod_bugs = sprint.bugs_found_in_prod<br>        total_bugs = sprint.total_bugs</p>\n\n<p>return (prod_bugs / total_bugs) * 100 if total_bugs else 0</p>\n\n<p>def defect_densities(self, sprints):<br>        \"\"\"Densidade de defeitos por feature\"\"\"<br>        return {<br>            sprint.name: len(sprint.defects) / sprint.stories_completed<br>            for sprint in sprints<br>        }</p>\n\n<p>def escape_rate(self, sprint):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos que escaparam para prod\"\"\"<br>        escaped = sprint.defects_found_after_release<br>        total = sprint.total_defects</p>\n\n<p>return (escaped / total * 100) if total else 0</p>\n\n<p># Targets<br># Defect Leakage: &lt; 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br># Defect Density: &lt; 0.5 per story<br># Escape Rate: &lt; 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br></code></pre></p>\n\n<h3>Test Velocity</h3>\n\n<pre><code># Test Velocity Metrics\n\n<p>metrics:<br>  - name: \"Tests Written per Sprint\"<br>    target: 50<br>    current: 47</p>\n\n<p>- name: \"Automation Coverage\"<br>    target: \"80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br>    current: \"72{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</p>\n\n<p>- name: \"Test Execution Time\"<br>    target: \"&lt; 30 min&quot;<br>    current: \"35 min\"</p>\n\n<p>- name: \"Test Maintenance Effort\"<br>    target: \"&lt; 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}&quot;<br>    current: \"25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br></code></pre></p>\n\n<hr>\n<h2>Checklist de Práticas Ágeis para QA</h2>\n\n<h3>Sprint</h3><ol><li>[ ] Participar de planning</li>\n<li>[ ] Identificar riscos de teste</li>\n<li>[ ] Atualizar testes para histórias</li>\n<li>[ ] Executar testes</li>\n<li>[ ] Reportar bugs</li>\n<li>[ ] Participar de review</li>\n<li>[ ] Retrospectiva de QA</li>\n</ol>\n<h3>Continuous</h3><ol><li>[ ] Manter testes atualizados</li>\n<li>[ ] Pair testing quando possível</li>\n<li>[ ] Code reviews</li>\n<li>[ ] CI/CD passing</li>\n<li>[ ] Métricas atualizadas</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>QA em agile requer adaptação constante e colaboração. As chaves são:<br><ol><li><strong>Integração</strong> - QA não é fase separada</li><br><li><strong>Comunicação</strong> - Time completo é responsável</li><br><li><strong>Automação</strong> - Habilita velocidade</li><br><li><strong>Métricas</strong> - Medir para melhorar</li><br><li><strong>Melhoria</strong> - Retrospectivas e adaptação</li></ol></p>', 'Metodologias Ágeis e QA: Scrum, Kanban e XP na Prática', '', 'inherit', 'closed', 'closed', '', '195-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '195', 'http://localhost:8082/ideiasti/?p=424', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('425', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a testar bancos de dados: consultas SQL, integridade de dados, migrations, performance e testes de integração com banco de dados.</p>\n\n<hr>\n<h2>Introdução aos Testes de Banco de Dados</h2>\n\n<p>Testar banco de dados é essencial para garantir que dados são armazenados, recuperados e manipulados corretamente. Inclui testes de schema, queries, migrations e performance.</p>\n\n<h3>Por Que Testar Banco de Dados?</h3>\n\n<ul><li>Garantir integridade de dados</li><ol><li>Validar constraints e triggers</li>\n<li>Verificar performance de queries</li>\n<li>Proteger contra regressions</li>\n<li>Validar migrations</li></ol></ul>\n\n<hr>\n<h2>Tipos de Testes de Banco de Dados</h2>\n\n<h3>1. Testes de Schema</h3>\n\n<pre><code># Testes de Schema\ndef test_schema_has_required_tables(postgres):\n    \"\"\"Verifica que tabelas existem\"\"\"\n    result = postgres.run(\"\"\"\n        SELECT table_name \n        FROM information_schema.tables \n        WHERE table_schema = \'public\'\n    \"\"\")\n\n<p>tables = [row[0] for row in result.fetchall()]</p>\n\n<p>assert \'users\' in tables<br>    assert \'products\' in tables<br>    assert \'orders\' in tables</p>\n\n<p>def test_users_table_columns(postgres):<br>    \"\"\"Verifica colunas da tabela users\"\"\"<br>    result = postgres.run(\"\"\"<br>        SELECT column_name, data_type, is_nullable<br>        FROM information_schema.columns<br>        WHERE table_name = \'users\'<br>        ORDER BY ordinal_position<br>    \"\"\")</p>\n\n<p>columns = {row[0]: {\'type\': row[1], \'nullable\': row[2]} <br>               for row in result.fetchall()}</p>\n\n<p>assert \'id\' in columns<br>    assert columns[\'id\'][\'type\'] == \'integer\'<br>    assert \'email\' in columns<br>    assert columns[\'email\'][\'is_nullable\'] == \'NO\'</p>\n\n<p>def test_primary_keys(postgres):<br>    \"\"\"Verifica primary keys\"\"\"<br>    result = postgres.run(\"\"\"<br>        SELECT tc.table_name, kcu.column_name<br>        FROM information_schema.table_constraints tc<br>        JOIN information_schema.key_column_usage kcu<br>            ON tc.constraint_name = kcu.constraint_name<br>        WHERE tc.constraint_type = \'PRIMARY KEY\'<br>    \"\"\")</p>\n\n<p>primary_keys = {row[0]: row[1] for row in result.fetchall()}</p>\n\n<p>assert primary_keys[\'users\'] == \'id\'<br>    assert primary_keys[\'products\'] == \'id\'<br></code></pre></p>\n\n<h3>2. Testes de Constraints</h3>\n\n<pre><code>def test_unique_constraint_email(postgres):\n    \"\"\"Email deve ser único\"\"\"\n    # Insert primeiro usuário\n    postgres.run(\"\"\"\n        INSERT INTO users (name, email, password)\n        VALUES (\'User 1\', \'test@example.com\', \'hash\')\n    \"\"\")\n\n<p># Tentar inserir email duplicado<br>    with pytest.raises(Exception) as exc:<br>        postgres.run(\"\"\"<br>            INSERT INTO users (name, email, password)<br>            VALUES (\'User 2\', \'test@example.com\', \'hash2\')<br>        \"\"\")</p>\n\n<p>assert \'unique constraint\' in str(exc.value).lower()</p>\n\n<p>def test_foreign_key_constraint(postgres):<br>    \"\"\"Order deve referenciar user válido\"\"\"<br>    with pytest.raises(Exception):<br>        postgres.run(\"\"\"<br>            INSERT INTO orders (user_id, total)<br>            VALUES (99999, 100.00)  # user_id não existe<br>        \"\"\")</p>\n\n<p>def test_check_constraint(postgres):<br>    \"\"\"Preço deve ser positivo\"\"\"<br>    with pytest.raises(Exception):<br>        postgres.run(\"\"\"<br>            INSERT INTO products (name, price)<br>            VALUES (\'Invalid Product\', -10.00)<br>        \"\"\")</p>\n\n<p>def test_not_null_constraint(postgres):<br>    \"\"\"Nome do usuário não pode ser nulo\"\"\"<br>    with pytest.raises(Exception):<br>        postgres.run(\"\"\"<br>            INSERT INTO users (email, password)<br>            VALUES (\'test@example.com\', \'hash\')<br>        \"\"\")<br></code></pre></p>\n\n<h3>3. Testes de Queries</h3>\n\n<pre><code>def test_select_users_by_email(postgres):\n    \"\"\"Busca usuário por email\"\"\"\n    # Setup\n    postgres.run(\"\"\"\n        INSERT INTO users (name, email, password)\n        VALUES (\'João Silva\', \'joao@example.com\', \'hash\')\n    \"\"\")\n\n<p># Execute<br>    result = postgres.run(\"\"\"<br>        SELECT name, email <br>        FROM users <br>        WHERE email = \'joao@example.com\'<br>    \"\"\")</p>\n\n<p># Assert<br>    assert len(result.fetchall()) == 1<br>    row = result.fetchone()<br>    assert row[0] == \'João Silva\'<br>    assert row[1] == \'joao@example.com\'</p>\n\n<p>def test_join_orders_with_users(postgres):<br>    \"\"\"Join orders com users\"\"\"<br>    # Setup<br>    user_id = insert_user(postgres, \'João\', \'joao@example.com\')<br>    insert_order(postgres, user_id, 100.00)</p>\n\n<p># Execute<br>    result = postgres.run(\"\"\"<br>        SELECT u.name, u.email, o.total<br>        FROM users u<br>        JOIN orders o ON u.id = o.user_id<br>        WHERE u.id = :user_id<br>    \"\"\", {\'user_id\': user_id})</p>\n\n<p>row = result.fetchone()<br>    assert row[0] == \'João\'<br>    assert row[2] == 100.00</p>\n\n<p>def test_aggregate_query(postgres):<br>    \"\"\"Query com agregação\"\"\"<br>    # Setup<br>    user_id = insert_user(postgres, \'João\', \'joao@example.com\')<br>    insert_order(postgres, user_id, 100.00)<br>    insert_order(postgres, user_id, 200.00)</p>\n\n<p># Execute<br>    result = postgres.run(\"\"\"<br>        SELECT SUM(total) as total_sum, COUNT(*) as order_count<br>        FROM orders<br>        WHERE user_id = :user_id<br>    \"\"\", {\'user_id\': user_id})</p>\n\n<p>row = result.fetchone()<br>    assert row[0] == 300.00<br>    assert row[1] == 2<br></code></pre></p>\n\n<h3>4. Testes de Migrations</h3>\n\n<pre><code>import subprocess\nimport os\n\n<p>def test_migration_up(postgres):<br>    \"\"\"Executa migration up\"\"\"<br>    result = subprocess.run(<br>        [\'python\', \'manage.py\', \'migrate\'],<br>        capture_output=True,<br>        text=True<br>    )</p>\n\n<p>assert result.returncode == 0<br>    assert \'Migration complete\' in result.stdout or \'No migrations to apply\' in result.stdout</p>\n\n<p>def test_migration_down(postgres):<br>    \"\"\"Rollback migration\"\"\"<br>    migration_name = \'add_phone_to_users\'</p>\n\n<p># Rollback<br>    result = subprocess.run(<br>        [\'python\', \'manage.py\', \'migrate\', migration_name, \'down\'],<br>        capture_output=True,<br>        text=True<br>    )</p>\n\n<p>assert result.returncode == 0</p>\n\n<p># Verificar que coluna foi removida<br>    result = postgres.run(\"\"\"<br>        SELECT column_name <br>        FROM information_schema.columns <br>        WHERE table_name = \'users\' AND column_name = \'phone\'<br>    \"\"\")</p>\n\n<p>assert len(result.fetchall()) == 0</p>\n\n<p>def test_data_integrity_after_migration(postgres):<br>    \"\"\"Verifica integridade após migration\"\"\"<br>    # Setup data<br>    postgres.run(\"\"\"<br>        INSERT INTO users (name, email, password)<br>        VALUES (\'Test\', \'test@example.com\', \'hash\')<br>    \"\"\")</p>\n\n<p># Run migration<br>    subprocess.run([\'python\', \'manage.py\', \'migrate\'], check=True)</p>\n\n<p># Verify data intact<br>    result = postgres.run(\"\"\"<br>        SELECT COUNT(*) FROM users WHERE email = \'test@example.com\'<br>    \"\"\")</p>\n\n<p>assert result.fetchone()[0] == 1<br></code></pre></p>\n\n<hr>\n<h2>TestContainers para Testes de DB</h2>\n\n<pre><code># conftest.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\n\n<p>@pytest.fixture(scope=\'session\')<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as pg:<br>        # Setup schema<br>        db_url = pg.get_connection_url()</p>\n\n<p># Run migrations<br>        subprocess.run([\'python\', \'manage.py\', \'migrate\'], check=True)</p>\n\n<p>yield pg</p>\n\n<p># Teardown</p>\n\n<p>@pytest.fixture<br>def clean_db(postgres):<br>    \"\"\"Limpa dados antes de cada teste\"\"\"<br>    db = psycopg2.connect(postgres.get_connection_url())<br>    cursor = db.cursor()</p>\n\n<p># Disable triggers para speed<br>    cursor.execute(\"SET session_replication_role = \'replica\'\")</p>\n\n<p># Truncate tables (exceto immutable)<br>    cursor.execute(\"\"\"<br>        TRUNCATE TABLE orders, users, products CASCADE<br>    \"\"\")</p>\n\n<p>db.commit()<br>    cursor.close()<br>    db.close()</p>\n\n<p>yield</p>\n\n<p>@pytest.fixture<br>def sample_data(postgres, clean_db):<br>    \"\"\"Popula dados de exemplo\"\"\"<br>    db = psycopg2.connect(postgres.get_connection_url())<br>    cursor = db.cursor()</p>\n\n<p># Insert users<br>    cursor.execute(\"\"\"<br>        INSERT INTO users (name, email, password)<br>        VALUES <br>            (\'User 1\', \'user1@example.com\', \'hash1\'),<br>            (\'User 2\', \'user2@example.com\', \'hash2\')<br>        RETURNING id<br>    \"\"\")<br>    user_ids = [row[0] for row in cursor.fetchall()]</p>\n\n<p># Insert products<br>    cursor.execute(\"\"\"<br>        INSERT INTO products (name, price, stock)<br>        VALUES <br>            (\'Product A\', 10.00, 100),<br>            (\'Product B\', 20.00, 50)<br>        RETURNING id<br>    \"\"\")<br>    product_ids = [row[0] for row in cursor.fetchall()]</p>\n\n<p>db.commit()<br>    cursor.close()<br>    db.close()</p>\n\n<p>yield {<br>        \'user_ids\': user_ids,<br>        \'product_ids\': product_ids<br>    }<br></code></pre></p>\n\n<hr>\n<h2>Testes de NoSQL</h2>\n\n<h3>MongoDB</h3>\n\n<pre><code>from pymongo import MongoClient\nfrom datetime import datetime\n\n<p>@pytest.fixture<br>def mongodb():<br>    with MongoDBContainer(\"mongo:7\") as mongo:<br>        client = MongoClient(mongo.get_connection_url())<br>        yield client[\'testdb\']<br>        client.close()</p>\n\n<p>def test_mongodb_insert(mongodb):<br>    \"\"\"Insere e busca documento\"\"\"<br>    result = mongodb.users.insert_one({<br>        \'name\': \'João\',<br>        \'email\': \'joao@example.com\',<br>        \'created_at\': datetime.now()<br>    })</p>\n\n<p>assert result.inserted_id is not None</p>\n\n<p>found = mongodb.users.find_one({\'email\': \'joao@example.com\'})<br>    assert found[\'name\'] == \'João\'</p>\n\n<p>def test_mongodb_aggregation(mongodb):<br>    \"\"\"Testa aggregation pipeline\"\"\"<br>    # Insert orders<br>    mongodb.orders.insert_many([<br>        {\'user_id\': 1, \'total\': 100, \'status\': \'completed\'},<br>        {\'user_id\': 1, \'total\': 200, \'status\': \'completed\'},<br>        {\'user_id\': 2, \'total\': 50, \'status\': \'pending\'},<br>    ])</p>\n\n<p>pipeline = [<br>        {\'$match\': {\'status\': \'completed\'}},<br>        {\'$group\': {\'_id\': \'$user_id\', \'total\': {\'$sum\': \'$total\'}}}<br>    ]</p>\n\n<p>results = list(mongodb.orders.aggregate(pipeline))</p>\n\n<p>assert len(results) == 1<br>    assert results[0][\'total\'] == 300<br></code></pre></p>\n\n<h3>Redis</h3>\n\n<pre><code>import redis\n\n<p>@pytest.fixture<br>def redis_client():<br>    with RedisContainer(\"redis:7\") as redis:<br>        client = redis.get_connection_url(client_class=redis.Redis)<br>        yield client</p>\n\n<p>def test_redis_cache(redis_client):<br>    \"\"\"Testa caching com Redis\"\"\"<br>    # Set value<br>    redis_client.setex(\'user:1:name\', 3600, \'João\')</p>\n\n<p># Get value<br>    name = redis_client.get(\'user:1:name\')</p>\n\n<p>assert name == \'João\'</p>\n\n<p>def test_redis_sorted_set(redis_client):<br>    \"\"\"Testa sorted set para ranking\"\"\"<br>    # Add scores<br>    redis_client.zadd(\'leaderboard\', {\'user1\': 100, \'user2\': 200, \'user3\': 150})</p>\n\n<p># Get top 3<br>    top = redis_client.zrevrange(\'leaderboard\', 0, 2, withscores=True)</p>\n\n<p>assert top[0][0] == \'user2\'<br>    assert top[0][1] == 200<br>    assert len(top) == 3<br></code></pre></p>\n\n<hr>\n<h2>Performance Testing de Queries</h2>\n\n<pre><code>import time\n\n<p>def test_query_performance(postgres, sample_data):<br>    \"\"\"Verifica que query executa em menos de 100ms\"\"\"<br>    start = time.time()</p>\n\n<p>result = postgres.run(\"\"\"<br>        SELECT u.name, COUNT(o.id) as order_count, SUM(o.total) as total<br>        FROM users u<br>        LEFT JOIN orders o ON u.id = o.user_id<br>        GROUP BY u.id<br>        ORDER BY total DESC<br>        LIMIT 100<br>    \"\"\")</p>\n\n<p>elapsed = (time.time() - start) * 1000  # ms</p>\n\n<p>assert elapsed &lt; 100, f&quot;Query took {elapsed}ms, expected &lt; 100ms&quot;</p>\n\n<p># Log para monitoramento<br>    print(f\"Query executed in {elapsed}ms\")</p>\n\n<p>def test_index_usage(postgres):<br>    \"\"\"Verifica que índice está sendo usado\"\"\"<br>    result = postgres.run(\"\"\"<br>        EXPLAIN ANALYZE<br>        SELECT * FROM users WHERE email = \'test@example.com\'<br>    \"\"\")</p>\n\n<p>explain_output = result.fetchall()<br>    explain_text = \' \'.join([row[0] for row in explain_output])</p>\n\n<p>assert \'Index Scan\' in explain_text or \'Bitmap Index Scan\' in explain_text<br>    assert \'Seq Scan\' not in explain_text  # Bad!<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testar banco de dados é crucial para garantir integridade, performance e confiabilidade dos dados. As chaves são:<br><ol><li><strong>Testar schema</strong> - Valide estrutura</li><br><li><strong>Testar constraints</strong> - Garanta regras de negócio</li><br><li><strong>Testar queries</strong> - Verifique funcionalidade</li><br><li><strong>Testar migrations</strong> - Previna regressions</li><br><li><strong>Testar performance</strong> - Queries devem ser rápidas</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Usar TestContainers em vez de DB real?</strong>  <br>R: Sim! TestContainers oferece DB isolado, descartável e rápido para testes.</p>\n\n<p><strong>P: Como testar migrations?</strong>  <br>R: Teste UP e DOWN, verifice integridade de dados após migration.</p>\n\n<p><strong>P: Mock vs DB real para testes?</strong>  <br>R: DB real para queries complexas e joins. Mock para unit tests isolados.</p>', 'Testes de Banco de Dados: SQL, NoSQL e Data Integrity', '', 'inherit', 'closed', 'closed', '', '196-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '196', 'http://localhost:8082/ideiasti/?p=425', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('426', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a implementar testes de integração eficazes: APIs, serviços, bancos de dados e microsserviços. Guia completo com estratégias e exemplos práticos.</p>\n\n<hr>\n<h2>O Que São Testes de Integração?</h2>\n\n<p>Testes de integração verificam que diferentes módulos ou serviços funcionam corretamente quando combinados. São o meio termo entre unit tests (testam unidades isoladas) e E2E tests (testam sistema completo).</p>\n\n<h3>Quando Usar Testes de Integração</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Situação</th><th>Teste Recomendado</th></tr>\n<tr><td>Testar uma função isolada</td><td>Unit</td></tr>\n<tr><td>Testar integração API ↔ Database</td><td>Integração</td></tr>\n<tr><td>Testar múltiplos serviços juntos</td><td>Integração</td></tr>\n<tr><td>Testar fluxo completo do usuário</td><td>E2E</td></tr>\n<tr><td>Testar sistema inteiro em produção-like</td><td>Sistema</td></tr>\n</table></figure>\n\n<hr>\n<h2>Tipos de Testes de Integração</h2>\n\n<h3>1. Testes de Integração de APIs</h3>\n\n<pre><code># test_integration_api.py\nimport requests\nimport pytest\n\n<p>class TestOrderAPI:</p>\n\n<p>@pytest.fixture(autouse=True)<br>    def setup(self):<br>        self.base_url = \"http://localhost:8000/api/v1\"<br>        self.session = requests.Session()</p>\n\n<p># Setup: criar usuário de teste<br>        response = self.session.post(f\"{self.base_url}/users\", json={<br>            \"name\": \"Test User\",<br>            \"email\": f\"test_{uuid.uuid4()}@example.com\",<br>            \"password\": \"testpass123\"<br>        })<br>        self.user_id = response.json()[\"id\"]<br>        self.token = response.json()[\"token\"]<br>        self.session.headers.update({\"Authorization\": f\"Bearer {self.token}\"})</p>\n\n<p>def test_create_order_flow(self):<br>        \"\"\"Testa fluxo completo: criar usuário -&gt; adicionar produto -&gt; fazer pedido\"\"\"</p>\n\n<p># 1. Listar produtos<br>        products_response = self.session.get(f\"{self.base_url}/products\")<br>        assert products_response.status_code == 200<br>        products = products_response.json()[\"items\"]<br>        product_id = products[0][\"id\"]</p>\n\n<p># 2. Adicionar ao carrinho<br>        cart_response = self.session.post(f\"{self.base_url}/cart/items\", json={<br>            \"product_id\": product_id,<br>            \"quantity\": 2<br>        })<br>        assert cart_response.status_code == 201</p>\n\n<p># 3. Verificar carrinho<br>        cart = self.session.get(f\"{self.base_url}/cart\").json()<br>        assert len(cart[\"items\"]) == 1<br>        assert cart[\"items\"][0][\"quantity\"] == 2</p>\n\n<p># 4. Criar pedido<br>        order_response = self.session.post(f\"{self.base_url}/orders\", json={<br>            \"shipping_address\": \"Rua Teste, 123\",<br>            \"payment_method\": \"credit_card\"<br>        })<br>        assert order_response.status_code == 201<br>        order = order_response.json()</p>\n\n<p># 5. Verificar pedido criado<br>        assert order[\"status\"] == \"pending\"<br>        assert order[\"total\"] == products[0][\"price\"] * 2<br></code></pre></p>\n\n<h3>2. Testes de Integração com Banco de Dados</h3>\n\n<pre><code># test_integration_database.py\nimport psycopg2\nfrom decimal import Decimal\n\n<p>@pytest.fixture<br>def db_connection():<br>    connection = psycopg2.connect(<br>        host=\"localhost\",<br>        database=\"testdb\",<br>        user=\"test\",<br>        password=\"test\"<br>    )<br>    yield connection<br>    connection.close()</p>\n\n<p>@pytest.fixture<br>def clean_db(db_connection):<br>    \"\"\"Limpa tabelas antes de cada teste\"\"\"<br>    cursor = db_connection.cursor()</p>\n\n<p>cursor.execute(\"\"\"<br>        TRUNCATE TABLE orders, cart_items, products, users<br>        RESTART IDENTITY CASCADE<br>    \"\"\")<br>    db_connection.commit()<br>    cursor.close()</p>\n\n<p>yield db_connection</p>\n\n<p>def test_user_order_integration(clean_db):<br>    \"\"\"Testa integração usuário -&gt; pedido\"\"\"<br>    cursor = clean_db.cursor()</p>\n\n<p># 1. Criar usuário<br>    cursor.execute(\"\"\"<br>        INSERT INTO users (name, email, password_hash)<br>        VALUES ({6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s)<br>        RETURNING id<br>    \"\"\", (\"João\", \"joao@example.com\", \"hash123\"))<br>    user_id = cursor.fetchone()[0]</p>\n\n<p># 2. Criar produto<br>    cursor.execute(\"\"\"<br>        INSERT INTO products (name, price, stock)<br>        VALUES ({6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s)<br>        RETURNING id<br>    \"\"\", (\"Camiseta\", Decimal(\"49.90\"), 100))<br>    product_id = cursor.fetchone()[0]</p>\n\n<p># 3. Criar pedido<br>    cursor.execute(\"\"\"<br>        INSERT INTO orders (user_id, total, status)<br>        VALUES ({6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s)<br>        RETURNING id<br>    \"\"\", (user_id, Decimal(\"49.90\"), \"pending\"))<br>    order_id = cursor.fetchone()[0]</p>\n\n<p># 4. Verificar integridade<br>    cursor.execute(\"\"\"<br>        SELECT u.name, o.id, o.total<br>        FROM users u<br>        JOIN orders o ON u.id = o.user_id<br>        WHERE u.id = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s<br>    \"\"\", (user_id,))</p>\n\n<p>result = cursor.fetchone()<br>    assert result[0] == \"João\"<br>    assert result[1] == order_id<br>    assert result[2] == Decimal(\"49.90\")</p>\n\n<p>clean_db.commit()</p>\n\n<p>def test_product_inventory_update(clean_db):<br>    \"\"\"Testa que estoque é decrementado\"\"\"<br>    cursor = clean_db.cursor()</p>\n\n<p># Setup: criar produto com estoque 10<br>    cursor.execute(\"\"\"<br>        INSERT INTO products (name, price, stock)<br>        VALUES ({6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s, {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s)<br>        RETURNING id<br>    \"\"\", (\"Tênis\", Decimal(\"199.90\"), 10))<br>    product_id = cursor.fetchone()[0]</p>\n\n<p># Action: decrementar estoque (simula venda)<br>    cursor.execute(\"\"\"<br>        UPDATE products <br>        SET stock = stock - 2<br>        WHERE id = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s<br>    \"\"\", (product_id,))</p>\n\n<p># Assert: estoque correto<br>    cursor.execute(\"SELECT stock FROM products WHERE id = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s\", (product_id,))<br>    assert cursor.fetchone()[0] == 8<br></code></pre></p>\n\n<h3>3. Testes de Microsserviços</h3>\n\n<pre><code># test_integration_microservices.py\nimport requests\nfrom unittest.mock import patch, Mock\n\n<p>class TestOrderServiceIntegration:<br>    \"\"\"Testa integração entre Order Service e Payment/Gateway Service\"\"\"</p>\n\n<p>@pytest.fixture<br>    def mock_payment_gateway(self):<br>        \"\"\"Mock do serviço de pagamento\"\"\"<br>        with patch(\'services.payment_gateway.requests.post\') as mock:<br>            mock.return_value = Mock(<br>                status_code=200,<br>                json=lambda: {<br>                    \"transaction_id\": \"tx_123\",<br>                    \"status\": \"approved\",<br>                    \"amount\": 99.90<br>                }<br>            )<br>            yield mock</p>\n\n<p>def test_order_with_payment(self, mock_payment_gateway):<br>        \"\"\"Testa que pedido processa corretamente com pagamento\"\"\"<br>        # Call order service<br>        response = requests.post(<br>            \"http://localhost:8001/api/orders\",<br>            json={<br>                \"user_id\": 1,<br>                \"items\": [{\"product_id\": 1, \"quantity\": 1}],<br>                \"payment\": {<br>                    \"method\": \"credit_card\",<br>                    \"card_token\": \"tok_test\"<br>                }<br>            }<br>        )</p>\n\n<p>assert response.status_code == 201<br>        order = response.json()</p>\n\n<p># Verifica que pagamento foi chamado<br>        mock_payment_gateway.assert_called_once()</p>\n\n<p># Verifica resultado<br>        assert order[\"status\"] == \"confirmed\"<br>        assert \"transaction_id\" in order[\"payment\"]</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def service_containers():<br>    \"\"\"Start containers para serviços reais\"\"\"<br>    containers = {<br>        \'user_service\': start_container(\'user-service:latest\'),<br>        \'product_service\': start_container(\'product-service:latest\'),<br>        \'order_service\': start_container(\'order-service:latest\'),<br>    }</p>\n\n<p>wait_for_services(containers)</p>\n\n<p>yield containers</p>\n\n<p>stop_containers(containers)<br></code></pre></p>\n\n<h3>4. Testes de Contrato (Consumer-Driven)</h3>\n\n<pre><code># test_contract_consumer.py\nfrom pact import Consumer, Provider\n\n<p>def test_consumer_driven_contract():<br>    \"\"\"Testa contrato definido pelo consumer\"\"\"</p>\n\n<p>pact = Consumer(\'OrderService\').has_pact_with(<br>        Provider(\'ProductService\')<br>    )<br>    pact.start_service()</p>\n\n<p>try:<br>        (pact<br>         .given(\'product with id 1 exists\')<br>         .upon_receiving(\'a request for product details\')<br>         .with_request(\'GET\', \'/products/1\')<br>         .will_respond_with(200, body={<br>             \'id\': 1,<br>             \'name\': \'Test Product\',<br>             \'price\': 99.99,<br>             \'in_stock\': True<br>         })<br>         .with_request(\'GET\', \'/products/999\')<br>         .will_respond_with(404, body={<br>             \'error\': \'Product not found\'<br>         })<br>         .verify())<br>    finally:<br>        pact.stop_service()<br></code></pre></p>\n\n<hr>\n<h2>TestContainers para Integração</h2>\n\n<pre><code># conftest.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\n\n<p>@pytest.fixture(scope=\"module\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as pg:<br>        # Run migrations<br>        run_migrations(pg.get_connection_url())<br>        yield pg</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def redis():<br>    with RedisContainer(\"redis:7\") as rd:<br>        yield rd</p>\n\n<p>@pytest.fixture<br>def integration_app(postgres, redis):<br>    \"\"\"Aplica com todas dependências\"\"\"<br>    app = create_app(<br>        database_url=postgres.get_connection_url(),<br>        redis_url=redis.get_connection_url()<br>    )<br>    app.config[\'TESTING\'] = True</p>\n\n<p>with app.app_context():<br>        yield app</p>\n\n<p>@pytest.fixture<br>def clean_data(postgres):<br>    \"\"\"Limpa dados entre testes\"\"\"<br>    cursor = postgres.get_connection().cursor()<br>    cursor.execute(\"\"\"<br>        TRUNCATE TABLE orders, users, products, sessions<br>        RESTART IDENTITY CASCADE<br>    \"\"\")<br>    postgres.get_connection().commit()<br>    cursor.close()</p>\n\n<p>yield postgres<br></code></pre></p>\n\n<hr>\n<h2>Testes de Integração de Mensageria</h2>\n\n<pre><code># test_integration_messaging.py\nimport pika\nimport json\n\n<p>@pytest.fixture<br>def rabbitmq():<br>    with RabbitMQContainer(\"rabbitmq:3\") as rmq:<br>        yield rmq</p>\n\n<p>def test_message_publishing(rabbitmq):<br>    \"\"\"Testa publicação e consumo de mensagens\"\"\"<br>    connection = pika.BlockingConnection(<br>        pika.URLParameters(rabbitmq.get_connection_url())<br>    )<br>    channel = connection.channel()</p>\n\n<p># Declare queue<br>    channel.queue_declare(queue=\'order_events\', durable=True)</p>\n\n<p># Publish message<br>    message = {<br>        \'event\': \'order_created\',<br>        \'order_id\': 123,<br>        \'user_id\': 456,<br>        \'total\': 99.90<br>    }<br>    channel.basic_publish(<br>        exchange=\'\',<br>        routing_key=\'order_events\',<br>        body=json.dumps(message)<br>    )</p>\n\n<p># Consume message<br>    method, properties, body = channel.basic_get(queue=\'order_events\')<br>    received = json.loads(body)</p>\n\n<p>assert received[\'event\'] == \'order_created\'<br>    assert received[\'order_id\'] == 123</p>\n\n<p>connection.close()<br></code></pre></p>\n\n<hr>\n<h2>Estratégias de Integração</h2>\n\n<h3>Bottom-Up</h3>\n\n<pre><code>[DAL] → [BLL] → [API]\n  ↓\n testes de unidade\n</code></pre>\n\n<h3>Top-Down</h3>\n\n<pre><code>[UI] → [API] → [Services]\n  ↑\n stubs\n</code></pre>\n\n<h3>Sandwich</h3>\n\n<pre><code>[UI] → [API] → [Services] → [DAL]\n   ↑          ↓\n  stubs       drivers\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de integração são essenciais para garantir que componentes funcionam juntos. As chaves são:<br><ol><li><strong>Selecionar escopo adequado</strong> - Nem demais, nem de menos</li><br><li><strong>Usar TestContainers</strong> - Isolamento e repeatability</li><br><li><strong>Testar contratos</strong> - Consumer-driven para microservices</li><br><li><strong>Manter dados limpos</strong> - Setup e teardown</li><br><li><strong>Executar frequentemente</strong> - CI/CD integrado</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Quantos testes de integração devo ter?</strong>  <br>R: Cobertura adequada das interfaces críticas. Priorize integrações com maior risco.</p>\n\n<p><strong>P: Testes de integração são lentos?</strong>  <br>R: Sim, mas TestContainers e paralelização ajudam. Priorize velocidade.</p>\n\n<p><strong>P: Usar mocks ou serviços reais?</strong>  <br>R: Mocks para dependências externas lentas/indisponíveis. Reais para DB e cache locais.</p>', 'Testes de Integração: Conectando Componentes', '', 'inherit', 'closed', 'closed', '', '197-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '197', 'http://localhost:8082/ideiasti/?p=426', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('427', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda mutation testing: técnica avançada para avaliar e melhorar a qualidade dos testes unitários. Ferramentas e implementação prática.</p>\n\n<hr>\n<h2>O Que é Mutation Testing?</h2>\n\n<p>Mutation testing é uma técnica que avalia a qualidade dos testes unitários introduzindo pequenas mudanças (mutações) no código-fonte e verificando se os testes detectam essas mudanças.</p>\n\n<h3>Analogia</h3>\n\n<pre><code>Código Original: if (age &gt;= 18) → permitido\nMutação 1: if (age &gt; 18) → ainda passa? Bug!\nMutação 2: if (age &gt;= 0) → ainda passa? Bug!\n</code></pre>\n\n<p>Se seus testes passam mesmo com mutações, eles não estão realmente testando o código.</p>\n\n<hr>\n<h2>Por Que Mutation Testing?</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Com Coverage Tradicional</th><th>Com Mutation Testing</th></tr>\n<tr><td><strong>O que mede</strong></td><td>Linhas executadas</td><td>Testes que detectam bugs</td></tr>\n<tr><td><strong>Confiança</strong></td><td>Baixa</td><td>Alta</td></tr>\n<tr><td><strong>Bug detection</strong></td><td>Não verifica</td><td>Verifica</td></tr>\n</table></figure>\n\n<h3>Como Funciona</h3>\n<ol><li><strong>Generate Mutations</strong>: Criar variantes do código</li>\n<li><strong>Run Tests</strong>: Executar suite contra cada mutante</li>\n<li><strong>Classify Results</strong>: Identificar se mutante foi \"matado\"</li>\n<li><strong>Calculate Score</strong>: {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de mutantes mortos</li>\n</ol>\n<hr>\n<h2>Tipos de Mutações</h2>\n\n<h3>Arithmetic Mutations</h3>\n\n<pre><code># Original\nresult = a + b\n\n<p># Mutations<br>result = a - b    # +<br>result = a * b    # +<br>result = a / b    # +<br>result = a ** b   # +<br>result = a {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} b    # +<br></code></pre></p>\n\n<h3>Relational Mutations</h3>\n\n<pre><code># Original\nif (x &gt; 10)\n\n<p># Mutations<br>if (x &gt;= 10)    # &gt;<br>if (x <br>if (x <br>if (x == 10)    # &gt;<br>if (x != 10)    # &gt;<br></code></pre></p>\n\n<h3>Logical Mutations</h3>\n\n<pre><code># Original\nif (is_valid and has_permission)\n\n<p># Mutations<br>if (is_valid or has_permission)      # and → or<br>if (not is_valid and has_permission) # negação<br>if (is_valid and not has_permission) # negação<br></code></pre></p>\n\n<h3>Conditional Boundary</h3>\n\n<pre><code># Original\nwhile (count &lt; 100)\n\n<p># Mutations<br>while (count &lt;= 100)    # &lt; → &lt;=<br>while (count &gt; 100)     # <br></code></pre></p>\n\n<hr>\n<h2>Ferramentas de Mutation Testing</h2>\n\n<h3>Para Diferentes Linguagens</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Ferramentas</th></tr>\n<tr><td><strong>Python</strong></td><td>mutmut, Cosmic Ray, mutatest</td></tr>\n<tr><td><strong>Java</strong></td><td>PITest (pitest)</td></tr>\n<tr><td><strong>JavaScript</strong></td><td>Stryker Mutator</td></tr>\n<tr><td><strong>C#</strong></td><td>NinjaTurtles, Pitest.NET</td></tr>\n<tr><td><strong>Ruby</strong></td><td>Mutant</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementação Prática</h2>\n\n<h3>Python com mutmut</h3>\n\n<pre><code># Instalação\npip install mutmut\n\n<p># Configuração (pyproject.toml ou .mutmut.toml)<br>[mutmut]<br>paths_to_mutate = src/<br>test_command = pytest -x<br>backup_command = git checkout<br></code></pre></p>\n\n<pre><code># Executar mutation testing\nmutmut run\n\n<p># Ver resultados<br>mutmut results</p>\n\n<p># Mostrar mutants sobrevientes<br>mutmut show survived<br></code></pre></p>\n\n<pre><code># Exemplo: Código a ser testado\n# src/calculator.py\ndef calcular_desconto(valor: float, percentual: float) -&gt; float:\n    \"\"\"Aplica desconto percentual a um valor.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual não pode exceder 100\")\n\n<p>desconto = valor * (percentual / 100)<br>    return valor - desconto</p>\n\n<p># src/test_calculator.py<br>import pytest<br>from calculator import calcular_desconto</p>\n\n<p>def test_desconto_basico():<br>    \"\"\"Testa desconto simples de 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\"\"<br>    assert calcular_desconto(100, 10) == 90.0</p>\n\n<p>def test_desconto_zero():<br>    \"\"\"Testa que desconto de 0{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} mantém valor\"\"\"<br>    assert calcular_desconto(100, 0) == 100.0</p>\n\n<p>def test_desconto_100_porcento():<br>    \"\"\"Testa que desconto de 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} retorna 0\"\"\"<br>    assert calcular_desconto(100, 100) == 0.0</p>\n\n<p>def test_desconto_negativo_deve_falhar():<br>    \"\"\"Desconto negativo deve lançar erro\"\"\"<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, -10)</p>\n\n<p>def test_desconto_acima_100_deve_falhar():<br>    \"\"\"Desconto acima de 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} deve lançar erro\"\"\"<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 110)<br></code></pre></p>\n\n<h3>Java com PITest</h3>\n\n<pre><code><!-- pom.xml -->\n\n    org.pitest\n    pitest-maven\n    1.15.8\n    \n        \n            org.pitest\n            pitest-junit5-plugin\n            1.15.8\n        \n    \n    \n        \n            com.example.*\n        \n        \n            com.example.*Test\n        \n    \n\n</code></pre>\n\n<pre><code># Executar\nmvn org.pitest:pitest-maven:mutationCoverage\n</code></pre>\n\n<h3>JavaScript com Stryker</h3>\n\n<pre><code># Instalação\nnpm install -D @stryker-mutator/core\n\n<p># Configuração (stryker.conf.js)<br>module.exports = {<br>  testRunner: \'jest\',<br>  mutate: [\'src/<em>*/</em>.js\'],<br>  reporters: [\'html\', \'clear-text\'],<br>  jest: {<br>    projectType: \'react\'<br>  }<br>}<br></code></pre></p>\n\n<pre><code># Executar\nnpx stryker run\n</code></pre>\n\n<hr>\n<h2>Interpretando Resultados</h2>\n\n<h3>Score de Mutação</h3>\n\n<pre><code>Mutation Score = (Mutantes Mortos / Total de Mutantes) × 100\n\n<p>Interpretação:<br><ul><li>90-100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: Excelente (muitos bugs detectados)</li><ol><li>80-90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: Bom</li><br><li>60-80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: Precisa melhorar</li><br><li>&lt;60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: Suite fraca</li><br></ol></code></pre></p>\n\n<h3>Exemplo de Relatório</h3>\n\n<pre><code>=============== MUTATION TESTING ===============\n\n<p>Total Mutants: 25<br>Killed: 23<br>Survived: 2<br>Timeout: 0<br>Skipped: 0</p>\n\n<p>Score: 92{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</p>\n\n<p>=============== SURVIVING MUTANTS ===============<br><ol><li>src/calculator.py:32</li><br></ol>   - Changed &gt; to &gt;=<br>   - Still passes: test_desconto_100_porcento<br>   <ol><li>src/validator.py:45</li><br></ol>   - Changed &amp;&amp; to ||<br>   - Still passes: test_validate_multiple_conditions</p>\n\n<p>=============== RECOMMENDATIONS ===============<br><ol><li>Adicione teste para valor exatamente 18</li><br><li>Teste edge case para validação AND/OR</li></ol></ul><br></code></pre></p>\n\n<hr>\n<h2>Melhores Práticas</h2>\n\n<h3>1. Combine com Code Coverage</h3>\n\n<pre><code># Mutation testing complementa coverage\n# Coverage 100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} não significa testes bons\n# Mutation testing revela gaps\n</code></pre>\n\n<h3>2. Priorize Módulos Críticos</h3>\n\n<pre><code># Execute mutation testing em módulos críticos\nmutmut run --paths src/payment/,src/auth/\n</code></pre>\n\n<h3>3. Corrija Mutantes Sobrevientes</h3>\n\n<pre><code># Mutante sobreviente indica teste fraco\ndef test_critical_path():\n    # Este teste não detecta mudança de &gt; para &gt;=\n    result = processar_idade(18)\n    assert result == \"adulto\"  # Passa mesmo com &gt;=\n\n<p># Adicione edge case<br>def test_critical_path_18_anos():<br>    result = processar_idade(18)<br>    assert result == \"adulto\"<br>    assert processar_idade(17) != \"adulto\"  # Detecta mudança &gt; para &gt;=<br></code></pre></p>\n\n<h3>4. Automatize no CI</h3>\n\n<pre><code># GitHub Actions\nname: Mutation Testing\n\n<p>on:<br>  schedule:<br>    - cron: \'0 2 <em> </em> 0\'  # Semanalmente</p>\n\n<p>jobs:<br>  mutation:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run mutation tests<br>        run: |<br>          pip install mutmut<br>          mutmut run --paths-to-mutate src/<br>          mutmut results</p>\n\n<p>- name: Check score<br>        run: |<br>          SCORE=$(mutmut results --only-result)<br>          if [ \"$SCORE\" -lt 80 ]; then<br>            echo \"Mutation score below 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}: $SCORE\"<br>            exit 1<br>          fi<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Mutation testing é uma técnica poderosa para avaliar qualidade real dos testes. As chaves são:<br><ol><li><strong>Entender conceito</strong> - Muta código, verifica se testes detectam</li><br><li><strong>Usar ferramentas</strong> - mutmut, PITest, Stryker</li><br><li><strong>Interpretar resultados</strong> - Score alto = testes fortes</li><br><li><strong>Criar testes para mutantes sobrevientes</strong> - Melhoria contínua</li><br><li><strong>Automatizar</strong> - Execute regularmente no CI</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Mutation testing substitui coverage?</strong>  <br>R: Não. Coverage mostra linhas executadas; mutation mostra se testes detectam bugs.</p>\n\n<p><strong>P: É lento?</strong>  <br>R: Sim! Pode ser 10-100x mais lento que testes normais. Use CI/discrete.</p>\n\n<p><strong>P: Qual score é bom?</strong>  <br>R: 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}+ é bom, 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}+ é excelente.</p>\n\n<p><strong>P: Vale o esforço?</strong>  <br>R: Para código crítico, sim. Para código simples, talvez não.</p>', 'Mutation Testing: Melhorando a Qualidade dos Testes', '', 'inherit', 'closed', 'closed', '', '198-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '198', 'http://localhost:8082/ideiasti/?p=427', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('428', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda visual regression testing: screenshots comparison, ferramentas como Applitools, Percy e Cypress Percy. Como detectar mudanças visuais automaticamente.</p>\n\n<hr>\n<h2>O Que É Visual Regression Testing?</h2>\n\n<p>Visual regression testing captura screenshots de interfaces e os compara com baselines para detectar mudanças visuais não intencionais (regressões).</p>\n\n<h3>Por Que Importa?</h3>\n\n<ul><li>Detectar mudanças em CSS/HTML</li><ol><li>Prevenir \"pixel perfect\" regressions</li>\n<li>Garantir consistência cross-browser</li>\n<li>Automatizar verificação de design</li></ol></ul>\n\n<hr>\n<h2>Abordagens</h2>\n\n<h3>1. Pixel-to-Pixel Comparison</h3>\n\n<pre><code># Simple screenshot comparison\nimport PIL.Image\nimport numpy as np\n\n<p>def compare_images(baseline_path, current_path):<br>    baseline = PIL.Image.open(baseline_path)<br>    current = PIL.Image.open(current_path)</p>\n\n<p># Convert to numpy arrays<br>    baseline_array = np.array(baseline)<br>    current_array = np.array(current)</p>\n\n<p># Calculate difference<br>    diff = np.abs(baseline_array.astype(float) - current_array.astype(float))</p>\n\n<p># Count different pixels<br>    different_pixels = np.sum(diff &gt; 0)<br>    total_pixels = diff.size</p>\n\n<p>change_percentage = (different_pixels / total_pixels) * 100</p>\n\n<p>return {<br>        \'match\': change_percentage &lt; 0.1,  # Less than 0.1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} change<br>        \'change_percentage\': change_percentage,<br>        \'different_pixels\': different_pixels<br>    }<br></code></pre></p>\n\n<h3>2. DOM-based Comparison</h3>\n\n<pre><code>// Playwright com screenshot comparison\nconst { chromium } = require(\'playwright\');\n\n<p>async function compareScreenshots(page, url, selector) {<br>    // Baseline<br>    await page.goto(url);<br>    await page.waitForSelector(selector);<br>    const baseline = await page.locator(selector).screenshot();</p>\n\n<p>// Current<br>    await page.goto(url);<br>    await page.waitForSelector(selector);<br>    const current = await page.locator(selector).screenshot();</p>\n\n<p>// Compare<br>    return await page.evaluate(([b, c]) =&gt; {<br>        // Canvas comparison<br>        const canvas = document.createElement(\'canvas\');<br>        // ... comparison logic<br>    }, [baseline, current]);<br>}<br></code></pre></p>\n\n<hr>\n<h2>Ferramentas</h2>\n\n<h3>Applitools (Líder de Mercado)</h3>\n\n<pre><code># pytest + Applitools\nfrom applitools.selenium import Eyes, RunnerOptions\nfrom selenium import webdriver\n\n<p>@pytest.fixture<br>def eyes():<br>    eyes = Eyes(RunnerOptions().test_name(\"Login Page\"))<br>    eyes.api_key = \"YOUR_API_KEY\"<br>    eyes.force_full_page_screenshot = True<br>    yield eyes</p>\n\n<p>@pytest.fixture<br>def driver(eyes):<br>    driver = webdriver.Chrome()<br>    driver.get(\"https://example.com\")<br>    yield driver<br>    eyes.abort_async()<br>    driver.quit()</p>\n\n<p>def test_login_page_visual(driver, eyes):<br>    eyes.open(driver, \"MyApp\", \"Login Page Test\")<br>    driver.get(\"https://example.com/login\")<br>    eyes.check_window(\"Login Form\")<br>    eyes.close_async()<br></code></pre></p>\n\n<pre><code>// Java/Selenium + Applitools\nimport com.applitools.eyes.selenium.Eyes;\nimport org.openqa.selenium.WebDriver;\n\n<p>@ExtendWith(ApplitoolsFieldExtension.class)<br>class VisualTests {</p>\n\n<p>@Eyes<br>    Eyes eyes;</p>\n\n<p>@Test<br>    void loginPageTest(WebDriver driver) {<br>        driver.get(\"https://example.com/login\");<br>        eyes.checkWindow(\"Login Form\");</p>\n\n<p>// Fill form<br>        driver.findElement(By.id(\"email\")).sendKeys(\"test@example.com\");<br>        eyes.checkWindow(\"Form Filled\");</p>\n\n<p>// Submit<br>        driver.findElement(By.id(\"submit\")).click();<br>        eyes.checkWindow(\"After Submit\");<br>    }<br>}<br></code></pre></p>\n\n<h3>Cypress Percy</h3>\n\n<pre><code># Instalação\nnpm install @percy/cypress --save-dev\n</code></pre>\n\n<pre><code>// cypress/integration/visual.spec.js\nimport { percySnapshot } from \'@percy/cypress\';\n\n<p>describe(\'Visual Regression\', () =&gt; {<br>    it(\'homepage looks correct\', () =&gt; {<br>        cy.visit(\'/\');<br>        percySnapshot(\'Homepage\');<br>    });</p>\n\n<p>it(\'login page\', () =&gt; {<br>        cy.visit(\'/login\');<br>        percySnapshot(\'Login Page\', { widths: [768, 1280, 1920] });<br>    });</p>\n\n<p>it(\'product page with different themes\', () =&gt; {<br>        cy.visit(\'/product/1\');</p>\n\n<p>// Light theme<br>        percySnapshot(\'Product Page - Light\');</p>\n\n<p>// Dark theme<br>        cy.get(\'[data-theme=\"dark\"]\').click();<br>        percySnapshot(\'Product Page - Dark\');<br>    });<br>});<br></code></pre></p>\n\n<h3>Playwright + Screenshot Comparison</h3>\n\n<pre><code>// playwright.config.js\nconst { defineConfig } = require(\'@playwright/test\');\n\n<p>module.exports = defineConfig({<br>    testDir: \'./visual-tests\',<br>    screenshotDir: \'./screenshots\',<br>    updateSnapshots: process.argv.includes(\'--update-snapshots\')<br>});</p>\n\n<p>// visual-tests/homepage.spec.js<br>const { test, expect } = require(\'@playwright/test\');</p>\n\n<p>test(\'homepage visual\', async ({ page }) =&gt; {<br>    await page.goto(\'https://example.com\');<br>    await page.waitForLoadState(\'networkidle\');</p>\n\n<p>const screenshot = await page.screenshot();</p>\n\n<p>// Compare with baseline<br>    const baseline = await page.goto(\'https://example.com\');<br>    const baselineScreenshot = await baseline.screenshot();</p>\n\n<p>const match = await page.evaluate(<br>        ([current, baseline]) =&gt; {<br>            // Simple diff percentage<br>            return current.length === baseline.length;<br>        },<br>        [screenshot, baselineScreenshot]<br>    );</p>\n\n<p>expect(match).toBeTruthy();<br>});<br></code></pre></p>\n\n<hr>\n<h2>Configuração por Framework</h2>\n\n<h3>Cypress com cypress-image-snapshot</h3>\n\n<pre><code>npm install --save-dev cypress-image-snapshot\n</code></pre>\n\n<pre><code>// cypress/support/index.js\nconst { addMatchImageSnapshotCommand } = require(\'cypress-image-snapshot/command\');\naddMatchImageSnapshotCommand({\n    failureThreshold: 0.03,\n    failureThresholdType: \'percent\',\n    customSnapshotsDir: \'./cypress/snapshots\'\n});\n\n<p>Cypress.Commands.add(\'getByTestId\', (testId) =&gt; {<br>    return cy.get(<code>[data-testid=\"${testId}\"]</code>);<br>});<br></code></pre></p>\n\n<pre><code>// cypress/integration/button.spec.js\ndescribe(\'Button Component\', () =&gt; {\n    it(\'primary button renders correctly\', () =&gt; {\n        cy.visit(\'/button\');\n        cy.getByTestId(\'primary-button\')\n            .matchImageSnapshot(\'primary-button-default\');\n    });\n\n<p>it(\'button hover state\', () =&gt; {<br>        cy.visit(\'/button\');<br>        cy.getByTestId(\'primary-button\')<br>            .trigger(\'mouseover\')<br>            .matchImageSnapshot(\'primary-button-hover\');<br>    });</p>\n\n<p>it(\'button disabled state\', () =&gt; {<br>        cy.visit(\'/button?disabled=true\');<br>        cy.getByTestId(\'primary-button\')<br>            .matchImageSnapshot(\'primary-button-disabled\');<br>    });<br>});<br></code></pre></p>\n\n<h3>Jest com jest-image-snapshot</h3>\n\n<pre><code>npm install --save-dev jest-image-snapshot\n</code></pre>\n\n<pre><code>// setupTests.js\nconst { toMatchImageSnapshot } = require(\'jest-image-snapshot\');\n\n<p>expect.extend({ toMatchImageSnapshot });</p>\n\n<p>// Component.test.jsx<br>import { render } from \'@testing-library/react\';<br>import Button from \'./Button\';</p>\n\n<p>test(\'Button renders correctly\', () =&gt; {<br>    const { container } = render(<Button>Click me</Button>);</p>\n\n<p>expect(container.firstChild).toMatchImageSnapshot({<br>        customSnapshotIdentifier: \'button-default\'<br>    });<br>});<br></code></pre></p>\n\n<hr>\n<h2>Estratégias de Visual Testing</h2>\n\n<h3>1. Full Page vs Component</h3>\n\n<pre><code>// Full page - everything\ncy.visit(\'/homepage\');\ncy.percySnapshot(\'Homepage Full\');\n\n<p>// Specific component<br>cy.visit(\'/homepage\');<br>cy.percySnapshot(\'Homepage Header\', {<br>    blackout: [\'.ads\', \'.sidebar\']  // Ignore dynamic content<br>});</p>\n\n<p>// Specific element<br>cy.get(\'.main-content\')<br>    .percySnapshotElement(\'Main Content Only\');<br></code></pre></p>\n\n<h3>2. Responsive Testing</h3>\n\n<pre><code>const viewports = [\n    { name: \'mobile\', width: 375, height: 667 },\n    { name: \'tablet\', width: 768, height: 1024 },\n    { name: \'desktop\', width: 1280, height: 720 },\n    { name: \'large\', width: 1920, height: 1080 }\n];\n\n<p>viewports.forEach(viewport =&gt; {<br>    it(<code>renders correctly on ${viewport.name}</code>, () =&gt; {<br>        cy.viewport(viewport.width, viewport.height);<br>        cy.visit(\'/\');<br>        cy.percySnapshot(<code>${viewport.name}-homepage</code>);<br>    });<br>});<br></code></pre></p>\n\n<h3>3. Ignore Dynamic Content</h3>\n\n<pre><code>// Applitools - Ignore regions\neyes.checkWindow(\'Dashboard\', {\n    ignore: [\n        { element: \'#dynamic-widget-1\' },\n        { element: \'#ads-banner\' },\n        { region: { left: 0, top: 0, width: 200, height: 100 } }\n    ]\n});\n\n<p>// Percy - Blackout<br>cy.percySnapshot(\'Dashboard\', {<br>    blackout: [\'[data-testid=\"ad-banner\"]\', \'.cookie-consent\']<br>});<br></code></pre></p>\n\n<hr>\n<h2>CI/CD Integration</h2>\n\n<pre><code># GitHub Actions\nname: Visual Regression Tests\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  visual-tests:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Percy<br>        uses: browser-actions/run-percy@latest<br>        with:<br>          percy-token: ${{ secrets.PERCY_TOKEN }}</p>\n\n<p>- name: Run visual tests<br>        run: npm run test:visual</p>\n\n<p>- name: Upload snapshots<br>        uses: actions/upload-artifact@v4<br>        if: failure()<br>        with:<br>          name: visual-diffs<br>          path: visual-test-results/<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Visual regression testing detecta mudanças visuais automaticamente. As chaves são:<br><ol><li><strong>Escolher ferramenta</strong> - Applitools, Percy, oubuilt-in</li><br><li><strong>Configurar ignores</strong> - Ignorar conteúdo dinâmico</li><br><li><strong>Testar responsivo</strong> - Múltiplos viewports</li><br><li><strong>Integrar CI</strong> - Executar em cada PR</li><br><li><strong>Revisar diffs</strong> - Aprovar ou corrigir</li><br></ol><br><hr><br><h3>FAQ</h3></p>\n\n<p><strong>P: Como lidar com conteúdo dinâmico?</strong>  <br>R: Use blackout/ignore para elementos variáveis.</p>\n\n<p><strong>P: Qual threshold usar?</strong>  <br>R: 0.1-3{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dependendo da tolerância. Testes strict = 0{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}.</p>\n\n<p><strong>P: Atualizar snapshots automaticamente?</strong>  <br>R: Apenas quando mudanças são intencionais, com code review.</p>', 'Visual Regression Testing: Detectando Mudanças Visuais', '', 'inherit', 'closed', 'closed', '', '199-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '199', 'http://localhost:8082/ideiasti/?p=428', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('429', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Domine Selenium WebDriver: setup, locators, Page Objects, waits, debugging e melhores práticas para automação de testes web.</p>\n\n<hr>\n<h2>Introdução ao Selenium WebDriver</h2>\n\n<p>Selenium WebDriver é a ferramenta mais popular para automação de testes web. Permite controlar browsers programaticamente para executar ações e verificar resultados.</p>\n\n<h3>Arquitetura</h3>\n\n<pre><code>┌─────────────┐    JSON Wire Protocol    ┌─────────────┐\n│    Tests    │ ←──────────────────────→ │   Browser   │\n│  (Python)   │                          │  (Chrome)   │\n└─────────────┘                          └─────────────┘\n       ↑                                        ↑\n       │                                        │\n       └────────── WebDriver API ───────────────┘\n</code></pre>\n\n<hr>\n<h2>Setup</h2>\n\n<h3>Instalação</h3>\n\n<pre><code># Python\npip install selenium webdriver-manager\n\n<p># Java<br><br>    org.seleniumhq.selenium<br>    selenium-java<br>    4.15.0<br></p>\n\n<p># JavaScript<br>npm install selenium-webdriver<br></code></pre></p>\n\n<h3>Setup Rápido</h3>\n\n<pre><code>from selenium import webdriver\nfrom selenium.webdriver.chrome.service import Service\nfrom webdriver_manager.chrome import ChromeDriverManager\n\n<p># Setup automático<br>driver = webdriver.Chrome(<br>    service=Service(ChromeDriverManager().install())<br>)</p>\n\n<p>driver.get(\"https://example.com\")<br>print(driver.title)<br>driver.quit()<br></code></pre></p>\n\n<hr>\n<h2>Locators</h2>\n\n<h3>Priority de Locators</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Prioridade</th><th>Locator</th><th>Exemplo</th><th>Confiabilidade</th></tr>\n<tr><td>1</td><td>ID</td><td><code>By.ID, \"username\"</code></td><td>Mais confiável</td></tr>\n<tr><td>2</td><td>Name</td><td><code>By.NAME, \"email\"</code></td><td>Bom</td></tr>\n<tr><td>3</td><td>Data Test ID</td><td><code>By.CSS, \"[data-testid=\'btn\']\"</code></td><td>Excelente</td></tr>\n<tr><td>4</td><td>Class</td><td><code>By.CLASS_NAME, \"btn-primary\"</code></td><td>Médio</td></tr>\n<tr><td>5</td><td>XPath</td><td><code>By.XPATH, \"//button[@id=\'submit\']\"</code></td><td>Flexível</td></tr>\n<tr><td>6</td><td>CSS</td><td><code>By.CSS_SELECTOR, \"#submit\"</code></td><td>Rápido</td></tr>\n<tr><td>7</td><td>Link Text</td><td><code>By.LINK_TEXT, \"Click here\"</code></td><td>Texto âncora</td></tr>\n<tr><td>8</td><td>Partial Link</td><td><code>By.PARTIAL_LINK_TEXT, \"here\"</code></td><td>Texto parcial</td></tr>\n</table></figure>\n\n<h3>Exemplos de Locators</h3>\n\n<pre><code>from selenium.webdriver.common.by import By\n\n<p># By ID (mais rápido)<br>driver.find_element(By.ID, \"username\")<br>driver.find_element(By.ID, \"password\")<br>driver.find_element(By.ID, \"login-button\")</p>\n\n<p># By Name<br>driver.find_element(By.NAME, \"email\")<br>driver.find_element(By.NAME, \"search\")</p>\n\n<p># By XPath (absoluto - evitar)<br>driver.find_element(By.XPATH, \"/html/body/div[2]/form/input[1]\")</p>\n\n<p># XPath relativo (preferir)<br>driver.find_element(By.XPATH, \"//input[@id=\'username\']\")<br>driver.find_element(By.XPATH, \"//button[contains(text(), \'Login\')]\")<br>driver.find_element(By.XPATH, \"//div[@class=\'form\']//input[@name=\'email\']\")</p>\n\n<p># XPath com múltiplas condições<br>driver.find_element(By.XPATH, <br>    \"//button[@type=\'submit\' and contains(@class, \'btn-primary\')]\")</p>\n\n<p># CSS Selector<br>driver.find_element(By.CSS_SELECTOR, \"#username\")<br>driver.find_element(By.CSS_SELECTOR, \".form-group .form-control\")<br>driver.find_element(By.CSS_SELECTOR, \"input[name=\'email\']\")<br>driver.find_element(By.CSS_SELECTOR, \"button[type=\'submit\']\")</p>\n\n<p># Link Text<br>driver.find_element(By.LINK_TEXT, \"Forgot Password?\")<br>driver.find_element(By.PARTIAL_LINK_TEXT, \"Forgot\")</p>\n\n<p># Data Test ID (recomendado para testes)<br>driver.find_element(By.CSS_SELECTOR, \"[data-testid=\'login-button\']\")<br></code></pre></p>\n\n<p>###Locator Strategies</p>\n\n<pre><code># Hierarquia de preferências\nLOCATOR_STRATEGY = [\n    (\"data-testid\", lambda x: By.CSS_SELECTOR, f\"[data-testid=\'{x}\']\"),\n    (\"id\", lambda x: By.ID, x),\n    (\"name\", lambda x: By.NAME, x),\n    (\"aria-label\", lambda x: By.CSS_SELECTOR, f\"[aria-label=\'{x}\']\"),\n    (\"text\", lambda x: By.XPATH, f\"//*[contains(text(), \'{x}\')]\"),\n    (\"css\", lambda x: By.CSS_SELECTOR, x),\n]\n\n<p>def find_element(driver, locator_type, locator_value):<br>    \"\"\"Encontra elemento usando estratégia otimizada\"\"\"<br>    by, value = LOCATOR_STRATEGY<a href=\"locator_value\">locator_type</a><br>    return driver.find_element(by, value)<br></code></pre></p>\n\n<hr>\n<h2>Interações Básicas</h2>\n\n<pre><code># Navegação\ndriver.get(\"https://example.com\")\ndriver.back()\ndriver.forward()\ndriver.refresh()\ndriver.title  # Page title\ndriver.current_url  # Current URL\n\n<p># Localizar e interagir<br>element = driver.find_element(By.ID, \"username\")<br>element.send_keys(\"user@example.com\")<br>element.clear()</p>\n\n<p># Click<br>driver.find_element(By.ID, \"submit-button\").click()</p>\n\n<p># Dropdowns<br>from selenium.webdriver.support.ui import Select</p>\n\n<p>dropdown = Select(driver.find_element(By.ID, \"country\"))<br>dropdown.select_by_visible_text(\"Brazil\")<br>dropdown.select_by_value(\"br\")<br>dropdown.select_by_index(1)</p>\n\n<p># Checkboxes<br>checkbox = driver.find_element(By.ID, \"accept-terms\")<br>if not checkbox.is_selected():<br>    checkbox.click()</p>\n\n<p># Radio buttons<br>radio = driver.find_element(By.CSS_SELECTOR, \"input[name=\'plan\'][value=\'premium\']\")<br>if not radio.is_selected():<br>    radio.click()<br></code></pre></p>\n\n<hr>\n<h2>Waits</h2>\n\n<h3>Wait Implícito vs Explícito</h3>\n\n<pre><code># ❌ NÃO USE: Wait implícito (global, aplicado a todos)\ndriver.implicitly_wait(10)  # Espera 10s para cada elemento\n\n<p># ✅ USE: Wait explícito (específico por situação)<br>from selenium.webdriver.support.ui import WebDriverWait<br>from selenium.webdriver.support import expected_conditions as EC</p>\n\n<p># Espera elemento ficar clicável<br>button = WebDriverWait(driver, 10).until(<br>    EC.element_to_be_clickable((By.ID, \"submit\"))<br>)<br>button.click()<br></code></pre></p>\n\n<h3>Expected Conditions</h3>\n\n<pre><code>from selenium.webdriver.support import expected_conditions as EC\n\n<p># Elemento presente no DOM<br>EC.presence_of_element_located((By.ID, \"username\"))</p>\n\n<p># Elemento visível<br>EC.visibility_of_element_located((By.ID, \"welcome-message\"))</p>\n\n<p># Elemento clicável<br>EC.element_to_be_clickable((By.ID, \"submit-button\"))</p>\n\n<p># Texto presente<br>EC.text_to_be_present_in_element((By.CLASS_NAME, \"message\"), \"Success\")</p>\n\n<p># URL contém<br>EC.url_contains(\"dashboard\")</p>\n\n<p># Título contém<br>EC.title_contains(\"Dashboard\")</p>\n\n<p># Nova janela abre<br>EC.new_window_is_opened(original_handles)</p>\n\n<p># Alerta presente<br>EC.alert_is_present()</p>\n\n<p># Loading spinners disappear<br>EC.invisibility_of_element_located((By.CLASS_NAME, \"spinner\"))<br></code></pre></p>\n\n<h3>Wait Customizado</h3>\n\n<pre><code># Wait para elemento com texto específico\ndef wait_for_text(driver, locator, text, timeout=10):\n    \"\"\"Espera até elemento conter texto específico\"\"\"\n    return WebDriverWait(driver, timeout).until(\n        EC.text_to_be_present_in_element(locator, text)\n    )\n\n<p># Wait para página carregar completamente<br>def wait_for_page_load(driver, timeout=30):<br>    \"\"\"Espera documento.readyState ser \'complete\'\"\"\"<br>    def document_ready(driver):<br>        return driver.execute_script(\"return document.readyState\") == \"complete\"<br>    WebDriverWait(driver, timeout).until(document_ready)</p>\n\n<p># Wait para requisição AJAX<br>def wait_for_ajax(driver, timeout=10):<br>    \"\"\"Espera requisições AJAX terminarem\"\"\"<br>    def ajax_complete(driver):<br>        return driver.execute_script(<br>            \"return jQuery.active == 0\"<br>        )<br>    WebDriverWait(driver, timeout).until(ajax_complete)<br></code></pre></p>\n\n<hr>\n<h2>Page Object Pattern</h2>\n\n<pre><code># pages/base_page.py\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n<p>class BasePage:<br>    def __init__(self, driver):<br>        self.driver = driver<br>        self.wait = WebDriverWait(driver, 10)</p>\n\n<p>def _find(self, locator):<br>        return self.wait.until(<br>            EC.presence_of_element_located(locator)<br>        )</p>\n\n<p>def _click(self, locator):<br>        self.wait.until(<br>            EC.element_to_be_clickable(locator)<br>        ).click()</p>\n\n<p>def _input(self, locator, text):<br>        element = self.wait.until(<br>            EC.presence_of_element_located(locator)<br>        )<br>        element.clear()<br>        element.send_keys(text)</p>\n\n<p>def _get_text(self, locator):<br>        return self.wait.until(<br>            EC.visibility_of_element_located(locator)<br>        ).text</p>\n\n<p>def is_displayed(self, locator):<br>        try:<br>            return self.wait.until(<br>                EC.visibility_of_element_located(locator)<br>            ).is_displayed()<br>        except:<br>            return False</p>\n\n<p># pages/login_page.py<br>from selenium.webdriver.common.by import By<br>from .base_page import BasePage</p>\n\n<p>class LoginPage(BasePage):<br>    URL = \"https://example.com/login\"</p>\n\n<p># Locators<br>    EMAIL_INPUT = (By.ID, \"email\")<br>    PASSWORD_INPUT = (By.ID, \"password\")<br>    LOGIN_BUTTON = (By.ID, \"login-button\")<br>    ERROR_MESSAGE = (By.CLASS_NAME, \"error-message\")<br>    FORGOT_PASSWORD_LINK = (By.LINK_TEXT, \"Forgot Password?\")</p>\n\n<p>def load(self):<br>        self.driver.get(self.URL)<br>        return self</p>\n\n<p>def login(self, email, password):<br>        self._input(self.EMAIL_INPUT, email)<br>        self._input(self.PASSWORD_INPUT, password)<br>        self._click(self.LOGIN_BUTTON)<br>        from pages.dashboard_page import DashboardPage<br>        return DashboardPage(self.driver)</p>\n\n<p>def get_error_message(self):<br>        return self._get_text(self.ERROR_MESSAGE)</p>\n\n<p>def click_forgot_password(self):<br>        self._click(self.FORGOT_PASSWORD_LINK)<br>        from pages.forgot_password_page import ForgotPasswordPage<br>        return ForgotPasswordPage(self.driver)</p>\n\n<p># pages/dashboard_page.py<br>from .base_page import BasePage<br>from selenium.webdriver.common.by import By</p>\n\n<p>class DashboardPage(BasePage):<br>    WELCOME_MESSAGE = (By.CLASS_NAME, \"welcome-message\")<br>    USER_NAME = (By.CSS_SELECTOR, \"[data-testid=\'user-name\']\")<br>    LOGOUT_BUTTON = (By.ID, \"logout-button\")</p>\n\n<p>def get_welcome_message(self):<br>        return self._get_text(self.WELCOME_MESSAGE)</p>\n\n<p>def get_user_name(self):<br>        return self._get_text(self.USER_NAME)</p>\n\n<p>def logout(self):<br>        self._click(self.LOGOUT_BUTTON)<br>        from pages.login_page import LoginPage<br>        return LoginPage(self.driver)<br></code></pre></p>\n\n<hr>\n<h2>Testando Exemplos</h2>\n\n<pre><code># tests/test_login.py\nimport pytest\nfrom pages.login_page import LoginPage\nfrom pages.dashboard_page import DashboardPage\n\n<p>class TestLogin:</p>\n\n<p>@pytest.fixture(autouse=True)<br>    def setup(self, driver):<br>        self.driver = driver<br>        self.login_page = LoginPage(driver)</p>\n\n<p>def test_login_with_valid_credentials(self):<br>        \"\"\"Deve fazer login e ir para dashboard\"\"\"<br>        dashboard = self.login_page.load().login(<br>            email=\"user@example.com\",<br>            password=\"password123\"<br>        )</p>\n\n<p>assert dashboard.get_welcome_message() == \"Welcome!\"<br>        assert dashboard.get_user_name() == \"John Doe\"</p>\n\n<p>def test_login_with_invalid_credentials(self):<br>        \"\"\"Deve exibir mensagem de erro\"\"\"<br>        self.login_page.load()<br>        self.login_page.login(<br>            email=\"invalid@example.com\",<br>            password=\"wrongpassword\"<br>        )</p>\n\n<p>assert \"Invalid credentials\" in self.login_page.get_error_message()</p>\n\n<p>def test_forgot_password_flow(self):<br>        \"\"\"Deve navegar para recuperação de senha\"\"\"<br>        forgot_page = self.login_page.load().click_forgot_password()</p>\n\n<p>assert forgot_page.is_displayed()<br>        assert \"Reset Password\" in forgot_page.get_title()<br></code></pre></p>\n\n<hr>\n<h2>Headless Mode</h2>\n\n<pre><code>from selenium.webdriver.chrome.options import Options\n\n<p>options = Options()<br>options.add_argument(\"--headless\")<br>options.add_argument(\"--no-sandbox\")<br>options.add_argument(\"--disable-dev-shm-usage\")<br>options.add_argument(\"--disable-gpu\")</p>\n\n<p>driver = webdriver.Chrome(options=options)<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Selenium WebDriver é poderoso para automação web. As chaves são:<br><ol><li><strong>Use locators estáveis</strong> - data-testid &gt; ID &gt; XPath</li><br><li><strong>Waits explícitos</strong> - Sempre prefira sobre implícitos</li><br><li><strong>Page Objects</strong> - Separe locators e ações</li><br><li><strong>Evite sleeps</strong> - Use expected conditions</li><br><li><strong>Debug com screenshots</strong> - Capture estado em falhas</li></ol></p>', 'Selenium WebDriver: Guia Completo para Automação Web', '', 'inherit', 'closed', 'closed', '', '200-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '200', 'http://localhost:8082/ideiasti/?p=429', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('430', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a configurar CI/CD para QA: GitHub Actions, GitLab CI, Jenkins. Automação de testes, quality gates e deploy contínuo.</p>\n\n<hr>\n<h2>O Que é CI/CD?</h2>\n\n<h3>Continuous Integration (CI)</h3>\n\n<p>Desenvolvedores commitam código frequentemente (diariamente ou mais). Cada commit triggers build automático e suite de testes.</p>\n\n<h3>Continuous Delivery (CD)</h3>\n\n<p>Código que passa em todos os testes é automaticamente deployado para staging/produção.</p>\n\n<hr>\n<h2>GitHub Actions</h2>\n\n<h3>Estrutura Básica</h3>\n\n<pre><code># .github/workflows/ci.yml\nname: CI Pipeline\n\n<p>on:<br>  push:<br>    branches: [main, develop]<br>  pull_request:<br>    branches: [main]</p>\n\n<p>env:<br>  NODE_VERSION: \'18\'</p>\n\n<p>jobs:<br>  lint:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Node<br>        uses: actions/setup-node@v4<br>        with:<br>          node-version: ${{ env.NODE_VERSION }}<br>          cache: \'npm\'</p>\n\n<p>- name: Install dependencies<br>        run: npm ci</p>\n\n<p>- name: Run linter<br>        run: npm run lint</p>\n\n<p>- name: Run type check<br>        run: npm run type-check</p>\n\n<p>test:<br>    needs: lint<br>    runs-on: ubuntu-latest<br>    services:<br>      postgres:<br>        image: postgres:15<br>        env:<br>          POSTGRES_DB: test<br>          POSTGRES_USER: test<br>          POSTGRES_PASSWORD: test<br>        ports:<br>          - 5432:5432<br>        options: &gt;-<br>          --health-cmd pg_isready<br>          --health-interval 10s<br>          --health-timeout 5s<br>          --health-retries 5</p>\n\n<p>redis:<br>        image: redis:7<br>        ports:<br>          - 6379:6379</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Node<br>        uses: actions/setup-node@v4<br>        with:<br>          node-version: ${{ env.NODE_VERSION }}<br>          cache: \'npm\'</p>\n\n<p>- name: Install dependencies<br>        run: npm ci</p>\n\n<p>- name: Run unit tests<br>        run: npm run test:unit -- --coverage</p>\n\n<p>- name: Run integration tests<br>        env:<br>          DATABASE_URL: postgresql://test:test@localhost:5432/test<br>          REDIS_URL: redis://localhost:6379<br>        run: npm run test:integration</p>\n\n<p>- name: Upload coverage<br>        uses: codecov/codecov-action@v3<br>        with:<br>          files: ./coverage/lcov.info<br>          fail_ci_if_error: true</p>\n\n<p>e2e:<br>    needs: test<br>    runs-on: ubuntu-latest<br>    if: github.event_name == \'push\'</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup Node<br>        uses: actions/setup-node@v4<br>        with:<br>          node-version: ${{ env.NODE_VERSION }}</p>\n\n<p>- name: Install dependencies<br>        run: npm ci</p>\n\n<p>- name: Install Playwright<br>        run: npx playwright install --with-deps</p>\n\n<p>- name: Run E2E tests<br>        run: npm run test:e2e</p>\n\n<p>- name: Upload test results<br>        uses: actions/upload-artifact@v4<br>        if: always()<br>        with:<br>          name: playwright-report<br>          path: playwright-report/</p>\n\n<p>security:<br>    needs: test<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Snyk<br>        uses: snyk/actions/node@master<br>        env:<br>          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}</p>\n\n<p>- name: Run SonarCloud<br>        uses: SonarSource/sonarcloud-github-action@master<br>        env:<br>          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}</p>\n\n<p>deploy-staging:<br>    needs: [test, security, e2e]<br>    runs-on: ubuntu-latest<br>    if: github.ref == \'refs/heads/develop\'<br>    environment: staging</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Deploy to Staging<br>        run: |<br>          echo \"Deploying to staging...\"<br>          kubectl apply -f k8s/staging/</p>\n\n<p>- name: Smoke tests<br>        run: |<br>          sleep 30<br>          curl -f https://staging.exemplo.com/health</p>\n\n<p>deploy-production:<br>    needs: [deploy-staging]<br>    runs-on: ubuntu-latest<br>    if: github.ref == \'refs/heads/main\'<br>    environment: production</p>\n\n<p>steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Deploy to Production<br>        run: |<br>          echo \"Deploying to production...\"<br>          kubectl apply -f k8s/production/<br></code></pre></p>\n\n<hr>\n<h2>GitLab CI</h2>\n\n<pre><code># .gitlab-ci.yml\nstages:\n  - lint\n  - test\n  - security\n  - deploy\n\n<p>variables:<br>  NODE_VERSION: \'18\'<br>  POSTGRES_DB: test<br>  POSTGRES_USER: test<br>  POSTGRES_PASSWORD: test</p>\n\n<p>lint:<br>  stage: lint<br>  image: node:$NODE_VERSION<br>  before_script:<br>    - npm ci<br>  script:<br>    - npm run lint<br>    - npm run type-check<br>  allow_failure: false</p>\n\n<p>test:unit:<br>  stage: test<br>  image: node:$NODE_VERSION<br>  services:<br>    - postgres:15<br>  before_script:<br>    - npm ci<br>  script:<br>    - npm run test:unit -- --coverage<br>  coverage: \'/Liness<em>:s</em>(d+.d+){6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}/\'<br>  artifacts:<br>    reports:<br>      junit: junit.xml<br>      coverage_report:<br>        coverage_format: cobertura<br>        path: coverage/cobertura-coverage.xml</p>\n\n<p>test:integration:<br>  stage: test<br>  image: node:$NODE_VERSION<br>  services:<br>    - postgres:15<br>    - redis:7<br>  before_script:<br>    - npm ci<br>  script:<br>    - npm run test:integration<br>  dependencies:<br>    - test:unit</p>\n\n<p>test:e2e:<br>  stage: test<br>  image: node:$NODE_VERSION<br>  before_script:<br>    - npm ci<br>    - npx playwright install --with-deps<br>  script:<br>    - npm run test:e2e<br>  dependencies:<br>    - test:integration<br>  allow_failure: true</p>\n\n<p>security:dependency-scanning:<br>  stage: security<br>  image: alpine:latest<br>  before_script:<br>    - apk add --no-cache curl<br>  script:<br>    - curl -sL https://getsentry.com/snippets/snyk-gitlab.sh | bash</p>\n\n<p>deploy:staging:<br>  stage: deploy<br>  script:<br>    - echo \"Deploying to staging\"<br>    - kubectl config use-context staging<br>    - kubectl apply -f k8s/staging/<br>  environment:<br>    name: staging<br>  only:<br>    - develop</p>\n\n<p>deploy:production:<br>  stage: deploy<br>  script:<br>    - echo \"Deploying to production\"<br>    - kubectl config use-context production<br>    - kubectl apply -f k8s/production/<br>  environment:<br>    name: production<br>  when: manual<br>  only:<br>    - main<br></code></pre></p>\n\n<hr>\n<h2>Quality Gates</h2>\n\n<h3>Implementação</h3>\n\n<pre><code>quality-gates:\n  stage: quality\n  image: node:$NODE_VERSION\n  before_script:\n    - npm ci\n  script:\n    - |\n      # Check coverage\n      COVERAGE=$(cat coverage/coverage.json | jq \'.total.lines.pct\')\n      echo \"Coverage: $COVERAGE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\n\n<p>if (( $(echo \"$COVERAGE &lt; 80&quot; | bc -l) )); then<br>        echo \"Coverage below 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} threshold\"<br>        exit 1<br>      fi</p>\n\n<p># Check test pass rate<br>      PASS_RATE=$(cat test-results.json | jq \'.passed / .total * 100\')<br>      echo \"Pass rate: $PASS_RATE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</p>\n\n<p>if (( $(echo \"$PASS_RATE &lt; 95&quot; | bc -l) )); then<br>        echo \"Pass rate below 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} threshold\"<br>        exit 1<br>      fi</p>\n\n<p># Check security<br>      if grep -q \"high|critical\" security-report.json; then<br>        echo \"Security vulnerabilities found\"<br>        exit 1<br>      fi</p>\n\n<p>echo \"All quality gates passed\"<br>  needs:<br>    - test<br>  allow_failure: false<br></code></pre></p>\n\n<hr>\n<h2>Test Reports</h2>\n\n<h3>JUnit XML Format</h3>\n\n<pre><code>\n\n  \n  \n    assert \'token\' not in response\n  \n\n</code></pre>\n\n<h3>GitHub Actions Upload</h3>\n\n<pre><code>- name: Upload JUnit test results\n  uses: actions/upload-artifact@v4\n  with:\n    name: test-results\n    path: test-results/junit.xml\n\n<ul><li>name: Publish Test Results</li></ul>\n  uses: dorny/test-reporter@v1\n  with:\n    name: Test Results\n    path: test-results/*.xml\n    reporter: java-junit\n    fail-on: test failures\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>CI/CD robusto é essencial para QA moderno. As chaves são:<br><ol><li><strong>Automação completa</strong> - Build, test, deploy</li><br><li><strong>Quality gates</strong> - Critérios objetivos para avançar</li><br><li><strong>Feedback rápido</strong> - Resultados em minutos</li><br><li><strong>Parallel execution</strong> - Speed up pipelines</li><br><li><strong>Reliable reporting</strong> - JUnit XML, cobertura, etc.</li></ol></p>', 'CI/CD para QA: Automação do Pipeline de Testes', '', 'inherit', 'closed', 'closed', '', '202-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '202', 'http://localhost:8082/ideiasti/?p=430', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('431', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda testes de carga e stress: JMeter, k6, Gatling. Como simular milhares de usuários e identificar gargalos de performance.</p>\n\n<hr>\n<h2>Tipos de Teste de Carga</h2>\n\n<h3>Load Testing</h3>\n\n<p>Verifica comportamento sob carga esperada.</p>\n\n<pre><code>Carga: 1000 usuários simultâneos\nDuração: 30 minutos\nMétrica: P95 &lt; 500ms\n</code></pre>\n\n<h3>Stress Testing</h3>\n\n<p>Vai além dos limites normais.</p>\n\n<pre><code>Carga: 1000 → 2000 → 5000 usuários\nObjetivo: Encontrar ponto de quebra\n</code></pre>\n\n<h3>Spike Testing</h3>\n\n<p>Picos súbitos de carga.</p>\n\n<pre><code>Normal: 500 usuários\nSpike: 5000 usuários em 5 segundos\nRecovery: 500 usuários\n</code></pre>\n\n<h3>Soak Testing</h3>\n\n<p>Carga sustentada por longo período.</p>\n\n<pre><code>Carga: 1000 usuários\nDuração: 8 horas\nObjetivo: Memory leaks, degradação\n</code></pre>\n\n<hr>\n<h2>k6 - Modern Load Testing</h2>\n\n<h3>Instalação</h3>\n\n<pre><code># macOS\nbrew install k6\n\n<p># Linux<br>sudo apt install k6</p>\n\n<p># Windows<br>choco install k6<br></code></pre></p>\n\n<h3>Script Básico</h3>\n\n<pre><code>// load-test.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },   // Ramp-up<br>    { duration: \'5m\', target: 100 },   // Steady<br>    { duration: \'2m\', target: 200 },   // Stress<br>    { duration: \'5m\', target: 200 },   // Steady<br>    { duration: \'2m\', target: 0 },     // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // &lt; 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} errors<br>    checks: [\'rate&gt;0.95\'],              // &gt; 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} checks pass<br>  },<br>};</p>\n\n<p>const BASE_URL = \'https://api.exemplo.com\';</p>\n\n<p>export default function () {<br>  // Login<br>  const loginRes = http.post(<code>${BASE_URL}/auth/login</code>, {<br>    email: \'user@example.com\',<br>    password: \'password123\',<br>  });</p>\n\n<p>check(loginRes, {<br>    \'login status 200\': (r) =&gt; r.status === 200,<br>    \'has token\': (r) =&gt; r.json(\'token\') !== undefined,<br>  });</p>\n\n<p>const token = loginRes.json(\'token\');</p>\n\n<p>// Get products<br>  const productsRes = http.get(<code>${BASE_URL}/products</code>, {<br>    headers: { \'Authorization\': <code>Bearer ${token}</code> },<br>  });</p>\n\n<p>check(productsRes, {<br>    \'products status 200\': (r) =&gt; r.status === 200,<br>    \'has products\': (r) =&gt; r.json(\'items\').length &gt; 0,<br>  });</p>\n\n<p>sleep(1);<br>}<br></code></pre></p>\n\n<h3>Cenários Complexos</h3>\n\n<pre><code>// scenarios.js\nimport http from \'k6/http\';\nimport { check, group } from \'k6/http\';\nimport { Rate, Trend } from \'k6/metrics\';\n\n<p>const errorRate = new Rate(\'errors\');<br>const apiLatency = new Trend(\'api_latency\');</p>\n\n<p>export const options = {<br>  scenarios: {<br>    // Smoke test<br>    smoke: {<br>      executor: \'constant-vus\',<br>      vus: 10,<br>      duration: \'1m\',<br>      tags: { test_type: \'smoke\' },<br>    },</p>\n\n<p>// Load test<br>    load: {<br>      executor: \'ramping-vus\',<br>      startVUs: 0,<br>      stages: [<br>        { duration: \'2m\', target: 100 },<br>        { duration: \'5m\', target: 100 },<br>        { duration: \'2m\', target: 0 },<br>      ],<br>      tags: { test_type: \'load\' },<br>    },</p>\n\n<p>// Stress test<br>    stress: {<br>      executor: \'ramping-arrival-rate\',<br>      startRate: 1,<br>      timeUnit: \'1s\',<br>      preAllocatedVUs: 100,<br>      maxVUs: 500,<br>      stages: [<br>        { duration: \'2m\', target: 10 },<br>        { duration: \'5m\', target: 50 },<br>        { duration: \'2m\', target: 100 },<br>        { duration: \'1m\', target: 0 },<br>      ],<br>      tags: { test_type: \'stress\' },<br>    },</p>\n\n<p>// Spike test<br>    spike: {<br>      executor: \'ramping-vus\',<br>      startVUs: 0,<br>      stages: [<br>        { duration: \'30s\', target: 100 },<br>        { duration: \'1m\', target: 1000 },  // Spike!<br>        { duration: \'30s\', target: 1000 },<br>        { duration: \'2m\', target: 0 },<br>      ],<br>      tags: { test_type: \'spike\' },<br>    },<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/health\');</p>\n\n<p>errorRate.add(res.status !== 200);<br>  apiLatency.add(res.timings.duration);<br>}<br></code></pre></p>\n\n<hr>\n<h2>JMeter - Enterprise Load Testing</h2>\n\n<h3>Instalação</h3>\n\n<pre><code># Download\nwget https://jmeter.apache.org/download_jmeter.cgi\n\n<p># Run<br>./bin/jmeter.sh<br></code></pre></p>\n\n<h3>Plano de Teste (GUI)</h3>\n\n<pre><code>Test Plan\n├── Thread Group (100 users, 10s ramp-up, loop 10)\n│   ├── HTTP Request Defaults\n│   │   └── Server: api.exemplo.com\n│   │\n│   ├── Once Only Controller\n│   │   └── Login Request\n│   │       └── POST /auth/login\n│   │\n│   ├── Recording Controller\n│   │   └── GET /products\n│   │   └── GET /products/{id}\n│   │   └── POST /orders\n│   │\n│   └── Listeners\n│       ├── Summary Report\n│       ├── View Results Tree\n│       ├── Aggregate Report\n│       └── Graph Results\n</code></pre>\n\n<h3>JMeter CLI</h3>\n\n<pre><code># Run non-GUI\njmeter -n -t test-plan.jmx -l results.jtl -e -o html-report\n\n<p># With specific properties<br>jmeter -n -t api-test.jmx <br>  -Jthreads=100 <br>  -Jrampup=10 <br>  -Jduration=300 <br>  -l results.jtl<br></code></pre></p>\n\n<h3>Distributed Testing</h3>\n\n<pre><code># jmeter-server (on slave machines)\njmeter-server -Djava.rmi.server.hostname=192.168.1.100\n\n<p># Run distributed<br>jmeter -n -t test.jmx <br>  -R192.168.1.100,192.168.1.101,192.168.1.102 <br>  -l results.jtl<br></code></pre></p>\n\n<hr>\n<h2>Gatling - Scala-based Load Testing</h2>\n\n<h3>Instalação</h3>\n\n<pre><code># Download\nwget https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/3.10.5/gatling-charts-highcharts-bundle-3.10.5.zip\nunzip gatling-charts-highcharts-bundle-3.10.5.zip\n</code></pre>\n\n<h3>Script Scala</h3>\n\n<pre><code>// src/test/scala/LoadSimulation.scala\npackage simulations\n\n<p>import io.gatling.core.Predef._<br>import io.gatling.http.Predef._<br>import io.gatling.jdbc.Predef._<br>import io.gatling.core.structure.ScenarioBuilder</p>\n\n<p>class ApiLoadSimulation extends Simulation {</p>\n\n<p>val httpProtocol = http<br>    .baseUrl(\"https://api.exemplo.com\")<br>    .acceptHeader(\"application/json\")<br>    .contentTypeHeader(\"application/json\")<br>    .disableCaching</p>\n\n<p>val userFeeder = csv(\"users.csv\").circular.random</p>\n\n<p>val loginScenario: ScenarioBuilder = scenario(\"Login Flow\")<br>    .feed(userFeeder)<br>    .exec(<br>      http(\"Login\")<br>        .post(\"/auth/login\")<br>        .body(StringBody(<br>          \"\"\"{\"email\":\"${email}\",\"password\":\"${password}\"}\"\"\"<br>        )).asJson<br>        .check(jsonPath(\"$.token\").saveAs(\"authToken\"))<br>    )<br>    .pause(1)<br>    .exec(<br>      http(\"Get Products\")<br>        .get(\"/products\")<br>        .header(\"Authorization\", \"Bearer ${authToken}\")<br>        .check(status.is(200))<br>    )<br>    .pause(1)<br>    .exec(<br>      http(\"Create Order\")<br>        .post(\"/orders\")<br>        .header(\"Authorization\", \"Bearer ${authToken}\")<br>        .body(StringBody(<br>          \"\"\"{\"productId\":1,\"quantity\":2}\"\"\"<br>        )).asJson<br>        .check(status.is(201))<br>    )</p>\n\n<p>setUp(<br>    loginScenario<br>      .inject(<br>        rampUsers(100).during(30.seconds),<br>        constantUsersPerSec(50).during(5.minutes),<br>        rampUsers(100).during(30.seconds)<br>      )<br>      .protocols(httpProtocol)<br>  )<br>  .assertions(<br>    global.responseTime.percentile(95).lt(500),<br>    global.successfulRequests.percent.gt(99)<br>  )<br>  .thresholds(<br>    http(\"Login\").responseTime.percentile(99).lt(1000)<br>  )<br>}<br></code></pre></p>\n\n<hr>\n<h2>Interpreting Results</h2>\n\n<h3>Key Metrics</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Significado</th><th>Target</th></tr>\n<tr><td><strong>P95 Latency</strong></td><td>95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições</td><td>&lt; 500ms</td></tr>\n<tr><td><strong>P99 Latency</strong></td><td>99{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições</td><td>&lt; 1s</td></tr>\n<tr><td><strong>Throughput</strong></td><td>Req/s</td><td>&gt; 1000</td></tr>\n<tr><td><strong>Error Rate</strong></td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} falhas</td><td>&lt; 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>CPU</strong></td><td>Utilização</td><td>&lt; 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td><strong>Memory</strong></td><td>Utilização</td><td>&lt; 85{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n</table></figure>\n\n<h3>Finding Bottlenecks</h3>\n\n<pre><code>// k6 com métricas customizadas\nimport { Trend } from \'k6/metrics\';\n\n<p>const dbLatency = new Trend(\'db_query_duration\');<br>const externalLatency = new Trend(\'external_api_duration\');</p>\n\n<p>export default function () {<br>  const start = Date.now();<br>  // DB query<br>  const dbRes = http.get(<code>${BASE_URL}/db</code>);<br>  dbLatency.add(Date.now() - start);</p>\n\n<p>// External API<br>  const extStart = Date.now();<br>  const extRes = http.get(\'https://external-api.com/data\');<br>  externalLatency.add(Date.now() - extStart);<br>}<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes de carga são essenciais para garantir performance. As chaves são:<br><ol><li><strong>Definir objetivos claros</strong> - SLAs e thresholds</li><br><li><strong>Simular realista</strong> - Dados e comportamento reais</li><br><li><strong>Monitorar infra</strong> - CPU, memória, rede</li><br><li><strong>Analisar resultados</strong> - P95, P99, throughput</li><br><li><strong>Testar regularmente</strong> - CI/CD integrado</li></ol></p>', 'Testes de Load/Stress: Garantindo Performance sob Carga', '', 'inherit', 'closed', 'closed', '', '203-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '203', 'http://localhost:8082/ideiasti/?p=431', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('432', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a testar aplicações em Kubernetes: Helm, deployments, services, configmaps e como integrar testes ao ciclo de deploy em K8s.</p>\n\n<hr>\n<h2>Kubernetes para QA</h2>\n\n<h3>Por Que Kubernetes?</h3>\n\n<ul><li><strong>Isolamento</strong> - Cada ambiente isolado</li><ol><li><strong>Reproducibilidade</strong> - Ambientes idênticos</li>\n<li><strong>Escalabilidade</strong> - Teste com múltiplas réplicas</li>\n<li><strong>Orquestração</strong> - Deploys atômicos</li></ol></ul>\n\n<hr>\n<h2>Recursos Kubernetes</h2>\n\n<h3>Pod</h3>\n\n<pre><code># pod.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: api-test-pod\n  labels:\n    app: api\n    env: test\nspec:\n  containers:\n  - name: api\n    image: api:latest\n    ports:\n    - containerPort: 8080\n    env:\n    - name: DATABASE_URL\n      valueFrom:\n        secretKeyRef:\n          name: api-secrets\n          key: database-url\n    resources:\n      requests:\n        memory: \"256Mi\"\n        cpu: \"250m\"\n      limits:\n        memory: \"512Mi\"\n        cpu: \"500m\"\n    readinessProbe:\n      httpGet:\n        path: /health\n        port: 8080\n      initialDelaySeconds: 5\n      periodSeconds: 10\n    livenessProbe:\n      httpGet:\n        path: /health\n        port: 8080\n      initialDelaySeconds: 15\n      periodSeconds: 20\n</code></pre>\n\n<h3>Deployment</h3>\n\n<pre><code># deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: api-deployment\nspec:\n  replicas: 3\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxSurge: 1\n      maxUnavailable: 0\n  selector:\n    matchLabels:\n      app: api\n  template:\n    metadata:\n      labels:\n        app: api\n    spec:\n      containers:\n      - name: api\n        image: api:v1.0.0\n        ports:\n        - containerPort: 8080\n        env:\n        - name: ENV\n          value: \"production\"\n        livenessProbe:\n          httpGet:\n            path: /health\n            port: 8080\n        readinessProbe:\n          httpGet:\n            path: /ready\n            port: 8080\n</code></pre>\n\n<h3>Service</h3>\n\n<pre><code># service.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: api-service\nspec:\n  type: ClusterIP\n  selector:\n    app: api\n  ports:\n  - port: 80\n    targetPort: 8080\n    name: http\n</code></pre>\n\n<hr>\n<h2>Helm - Gerenciamento de Charts</h2>\n\n<h3>Estrutura</h3>\n\n<pre><code>myapp/\n├── Chart.yaml\n├── values.yaml\n├── charts/\n├── templates/\n│   ├── deployment.yaml\n│   ├── service.yaml\n│   ├── ingress.yaml\n│   ├── _helpers.tpl\n│   └── tests/\n│       └── test-connection.yaml\n└── README.md\n</code></pre>\n\n<h3>Chart.yaml</h3>\n\n<pre><code># Chart.yaml\napiVersion: v2\nname: myapp\ndescription: A Helm chart for MyApp\ntype: application\nversion: 1.0.0\nappVersion: \"1.0.0\"\nkeywords:\n  - web\n  - api\nhome: https://myapp.com\nmaintainers:\n  - name: DevOps Team\n    email: devops@myapp.com\ndependencies:\n  - name: postgresql\n    version: \"12.x\"\n    repository: \"https://charts.bitnami.com/bitnami\"\n    condition: postgresql.enabled\n</code></pre>\n\n<h3>values.yaml</h3>\n\n<pre><code># values.yaml\nreplicaCount: 3\n\n<p>image:<br>  repository: myapp/api<br>  tag: latest<br>  pullPolicy: IfNotPresent</p>\n\n<p>service:<br>  type: ClusterIP<br>  port: 80</p>\n\n<p>ingress:<br>  enabled: true<br>  className: \"nginx\"<br>  annotations:<br>    cert-manager.io/cluster-issuer: \"letsencrypt-prod\"<br>  hosts:<br>    - host: api.myapp.com<br>      paths:<br>        - path: /<br>          pathType: Prefix<br>  tls:<br>    - secretName: api-tls<br>      hosts:<br>        - api.myapp.com</p>\n\n<p>resources:<br>  limits:<br>    cpu: 500m<br>    memory: 512Mi<br>  requests:<br>    cpu: 100m<br>    memory: 256Mi</p>\n\n<p>autoscaling:<br>  enabled: true<br>  minReplicas: 2<br>  maxReplicas: 10<br>  targetCPUUtilizationPercentage: 70</p>\n\n<p>postgresql:<br>  enabled: true<br>  auth:<br>    database: myapp<br>    username: myapp<br>    password: changeme</p>\n\n<p>tests:<br>  enabled: true<br>  image: curlimages/curl:latest<br></code></pre></p>\n\n<h3>Test Template</h3>\n\n<pre><code># templates/tests/test-connection.yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: \"{{ include \"myapp.fullname\" . }}-test-connection\"\n  labels:\n    helm.sh/hook: test\n    helm.sh/hook-delete-policy: before-hook-creation\n  annotations:\n    \"helm.sh/hook\": test\nspec:\n  containers:\n  - name: wget\n    image: \"{{ .Values.tests.image }}\"\n    command: [\'sh\', \'-c\']\n    args:\n      - |\n        echo \"Testing API health endpoint...\"\n        response=$(curl -f http://{{ include \"myapp.fullname\" . }}:{{ .Values.service.port }}/health || echo \"FAILED\")\n        echo \"Response: $response\"\n        if [ \"$response\" != \"OK\" ]; then\n          exit 1\n        fi\n  restartPolicy: Never\n</code></pre>\n\n<hr>\n<h2>Testando no Kubernetes</h2>\n\n<h3>Testes de Integração com Kind</h3>\n\n<pre><code># Criar cluster Kind\nkind create cluster --name qa-tests\n\n<p># Deploy app<br>kubectl apply -f deployment.yaml</p>\n\n<p># Run tests<br>kubectl run test-runner --image=myapp/test-runner -- curl http://api-service/health</p>\n\n<p># Ver resultado<br>kubectl logs test-runner</p>\n\n<p># Cleanup<br>kind delete cluster --name qa-tests<br></code></pre></p>\n\n<h3>kubectl Testing Commands</h3>\n\n<pre><code># Verificar pods\nkubectl get pods -l app=api\n\n<p># Ver logs<br>kubectl logs -l app=api --tail=100</p>\n\n<p># Port-forward para teste local<br>kubectl port-forward svc/api-service 8080:80</p>\n\n<p># Executar testes<br>kubectl exec -it api-pod -- python -m pytest tests/</p>\n\n<p># Ver events<br>kubectl get events --sort-by=\'.lastTimestamp\'<br></code></pre></p>\n\n<h3>Teste com cURL</h3>\n\n<pre><code>#!/bin/bash\n# test-api.sh\n\n<p>API_URL=\"http://api-service\"</p>\n\n<p>echo \"Testing API endpoints...\"</p>\n\n<p># Health check<br>echo \"1. Health check...\"<br>response=$(curl -s -o /dev/null -w \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}{http_code}\" $API_URL/health)<br>if [ \"$response\" != \"200\" ]; then<br>  echo \"FAILED: Health check returned $response\"<br>  exit 1<br>fi<br>echo \"OK\"</p>\n\n<p># Teste de endpoint<br>echo \"2. GET /users...\"<br>response=$(curl -s $API_URL/users)<br>if echo \"$response\" | grep -q \"users\"; then<br>  echo \"OK\"<br>else<br>  echo \"FAILED\"<br>  exit 1<br>fi</p>\n\n<p>echo \"All tests passed!\"<br></code></pre></p>\n\n<hr>\n<h2>CI/CD com Kubernetes</h2>\n\n<h3>GitHub Actions</h3>\n\n<pre><code># .github/workflows/k8s-tests.yml\nname: Kubernetes Tests\n\n<p>on:<br>  push:<br>    branches: [main, develop]</p>\n\n<p>jobs:<br>  test:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Setup kubectl<br>        uses: azure/setup-kubectl@v3</p>\n\n<p>- name: Configure kubectl<br>        run: |<br>          echo \"${{ secrets.KUBE_CONFIG }}\" | base64 -d &gt; kubeconfig<br>          export KUBECONFIG=kubeconfig</p>\n\n<p>- name: Deploy to test<br>        run: |<br>          helm upgrade --install myapp ./chart <br>            --namespace test <br>            --create-namespace <br>            --values ./chart/values-test.yaml <br>            --wait --timeout 5m</p>\n\n<p>- name: Wait for pods<br>        run: |<br>          kubectl wait --for=condition=ready pod -l app=myapp <br>            -n test --timeout=300s</p>\n\n<p>- name: Run API tests<br>        run: |<br>          kubectl exec -n test deploy/myapp -- <br>            python -m pytest tests/ -v --junit-xml=/tmp/results.xml</p>\n\n<p>- name: Run integration tests<br>        run: |<br>          kubectl run test-runner -n test <br>            --image=myapp/test-runner <br>            --rm -it --restart=Never <br>            -- curl -f http://myapp/health</p>\n\n<p>- name: Collect test results<br>        uses: actions/upload-artifact@v4<br>        with:<br>          name: test-results<br>          path: /tmp/results.xml</p>\n\n<p>- name: Cleanup<br>        if: always()<br>        run: helm uninstall myapp -n test<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Kubernetes facilita testes em ambientes controlados. As chaves são:<br><ol><li><strong>Containerização</strong> - Ambientes reproduzíveis</li><br><li><strong>Helm charts</strong> - Deploys versionados</li><br><li><strong>Test hooks</strong> - Testes no ciclo de deploy</li><br><li><strong>CI/CD integration</strong> - Automação completa</li><br><li><strong>Monitoring</strong> - Observabilidade em testes</li></ol></p>', 'Kubernetes e QA: Testes em Ambientes Containerizados', '', 'inherit', 'closed', 'closed', '', '204-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '204', 'http://localhost:8082/ideiasti/?p=432', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('433', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a monitorar qualidade de software: métricas de QA, dashboards de teste, KPIs deDevOps e como usar dados para melhoria contínua.</p>\n\n<hr>\n<h2>Por Que Monitorar Qualidade?</h2>\n\n<ul><li><strong>Visibilidade</strong> - Entender estado atual</li><ol><li><strong>Tendências</strong> - Identificar melhoras/pioras</li>\n<li><strong>Decisões</strong> - Base para ação</li>\n<li><strong>Accountability</strong> - Responsabilidade clara</li>\n</ol>\n<hr>\n<h2>Métricas de QA</h2>\n\n<h3>Cobertura de Testes</h3>\n\n<pre><code># Métricas de cobertura\nmetrics = {\n    \"line_coverage\": calculate_line_coverage(),\n    \"branch_coverage\": calculate_branch_coverage(),\n    \"function_coverage\": calculate_function_coverage(),\n\n<p>\"covered_lines\": 450,<br>    \"total_lines\": 500,<br>    \"uncovered_lines\": [12, 45, 78],  # Linhas críticas</p>\n\n<p>\"coverage_trend\": {<br>        \"week_1\": 65,<br>        \"week_2\": 68,<br>        \"week_3\": 72,<br>        \"week_4\": 78<br>    }<br>}</p>\n\n<p># Dashboard metrics<br>def calculate_coverage_metrics():<br>    return {<br>        \"current\": get_current_coverage(),<br>        \"target\": 80,<br>        \"delta\": get_current_coverage() - 80,<br>        \"trend\": get_coverage_trend(weeks=4)<br>    }<br></code></pre></p>\n\n<h3>Defect Metrics</h3>\n\n<pre><code>class DefectMetrics:\n    def __init__(self, sprint_data):\n        self.sprint = sprint_data\n\n<p>def defect_leakage_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos encontrados em produção\"\"\"<br>        prod = len([d for d in self.sprint.defects if d.found_in == \'production\'])<br>        total = len(self.sprint.defects)<br>        return (prod / total) * 100 if total &gt; 0 else 0</p>\n\n<p>def defect_density(self):<br>        \"\"\"Defeitos por story point\"\"\"<br>        return len(self.sprint.defects) / self.sprint.story_points_completed</p>\n\n<p>def mean_time_to_detect(self):<br>        \"\"\"Tempo médio para detectar defeito\"\"\"<br>        return sum(d.time_to_detect for d in self.sprint.defects) / len(self.sprint.defects)</p>\n\n<p>def mean_time_to_fix(self):<br>        \"\"\"Tempo médio para corrigir\"\"\"<br>        return sum(d.time_to_fix for d in self.sprint.defects) / len(self.sprint.defects)</p>\n\n<p>def escape_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos escapados para produção\"\"\"<br>        escaped = len([d for d in self.sprint.defects if d.escaped_to_prod])<br>        total = len(self.sprint.defects)<br>        return (escaped / total) * 100 if total &gt; 0 else 0</p>\n\n<p>def defect_by_severity(self):<br>        return {<br>            \"critical\": len([d for d in self.sprint.defects if d.severity == \'critical\']),<br>            \"high\": len([d for d in self.sprint.defects if d.severity == \'high\']),<br>            \"medium\": len([d for d in self.sprint.defects if d.severity == \'medium\']),<br>            \"low\": len([d for d in self.sprint.defects if d.severity == \'low\'])<br>        }</p>\n\n<p>def defect_by_type(self):<br>        return {<br>            \"functional\": len([d for d in self.sprint.defects if d.type == \'functional\']),<br>            \"performance\": len([d for d in self.sprint.defects if d.type == \'performance\']),<br>            \"security\": len([d for d in self.sprint.defects if d.type == \'security\']),<br>            \"ux\": len([d for d in self.sprint.defects if d.type == \'ux\'])<br>        }<br></code></pre></p>\n\n<h3>Test Execution Metrics</h3>\n\n<pre><code>class TestExecutionMetrics:\n    def __init__(self, execution_history):\n        self.history = execution_history\n\n<p>def pass_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de testes passando\"\"\"<br>        passed = len([t for t in self.history if t.status == \'passed\'])<br>        total = len(self.history)<br>        return (passed / total) * 100 if total &gt; 0 else 0</p>\n\n<p>def flaky_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de testes flaky\"\"\"<br>        flaky = len([t for t in self.history if t.is_flaky])<br>        total = len(self.history)<br>        return (flaky / total) * 100 if total &gt; 0 else 0</p>\n\n<p>def execution_time(self):<br>        \"\"\"Tempo de execução total\"\"\"<br>        return sum(t.duration for t in self.history)</p>\n\n<p>def execution_time_trend(self):<br>        \"\"\"Tendência de tempo de execução\"\"\"<br>        return self.history.group_by(\'date\').avg(\'duration\')</p>\n\n<p>def coverage_trend(self):<br>        \"\"\"Tendência de cobertura\"\"\"<br>        return self.history.group_by(\'date\').avg(\'coverage\')</p>\n\n<p>def blocked_tests(self):<br>        \"\"\"Testes bloqueados\"\"\"<br>        return [t for t in self.history if t.status == \'blocked\']</p>\n\n<p>def skipped_tests(self):<br>        \"\"\"Testes pulados\"\"\"<br>        return [t for t in self.history if t.status == \'skipped\']<br></code></pre></p>\n\n<hr>\n<h2>DORA Metrics</h2>\n\n<h3>Deployment Frequency</h3>\n\n<pre><code>def deployment_frequency():\n    \"\"\"\n    Target: On-demand ou múltiplas vezes por dia\n    \"\"\"\n    deployments = get_deployments(last_30_days=True)\n\n<p>return {<br>        \"count\": len(deployments),<br>        \"frequency\": len(deployments) / 30,  # por dia<br>        \"target\": \"&gt;1/day\",<br>        \"status\": \"elite\" if len(deployments) &gt;= 30 else \"high\" if len(deployments) &gt;= 5 else \"medium\"<br>    }<br></code></pre></p>\n\n<h3>Lead Time for Changes</h3>\n\n<pre><code>def lead_time_for_changes():\n    \"\"\"\n    Target: &lt;1 hora (elite)\n    &quot;&quot;&quot;\n    changes = get_code_changes()\n\n<p>lead_times = []<br>    for change in changes:<br>        commit_time = change.commit_timestamp<br>        deploy_time = change.deployed_timestamp<br>        lead_time = (deploy_time - commit_time).total_seconds() / 3600  # horas<br>        lead_times.append(lead_time)</p>\n\n<p>return {<br>        \"median_hours\": statistics.median(lead_times),<br>        \"p95_hours\": statistics.quantiles(lead_times, n=20)[18],  # P95<br>        \"target\": \"&lt;1 hour&quot;,<br>        \"status\": \"elite\" if statistics.median(lead_times) &lt; 1 else &quot;high&quot;<br>    }<br></code></pre></p>\n\n<h3>Time to Restore</h3>\n\n<pre><code>def time_to_restore():\n    \"\"\"\n    Target: &lt;1 hora (elite)\n    &quot;&quot;&quot;\n    incidents = get_incidents(last_30_days=True)\n\n<p>restore_times = []<br>    for incident in incidents:<br>        restore_hours = (incident.resolved_at - incident.detected_at).total_seconds() / 3600<br>        restore_times.append(restore_hours)</p>\n\n<p>return {<br>        \"median_hours\": statistics.median(restore_times),<br>        \"p99_hours\": max(restore_times),  # P99 worst case<br>        \"target\": \"&lt;1 hour&quot;,<br>        \"incidents_count\": len(incidents)<br>    }<br></code></pre></p>\n\n<h3>Change Failure Rate</h3>\n\n<pre><code>def change_failure_rate():\n    \"\"\"\n    Target: &lt;15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} (elite)\n    &quot;&quot;&quot;\n    deployments = get_deployments(last_30_days=True)\n    failed = len([d for d in deployments if d.failed or d.rolled_back])\n\n<p>return {<br>        \"failed_count\": failed,<br>        \"total_count\": len(deployments),<br>        \"rate_percent\": (failed / len(deployments)) * 100 if deployments else 0,<br>        \"target\": \"&lt;15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}&quot;,<br>        \"status\": \"elite\" if failed / len(deployments) &lt; 0.15 else &quot;high&quot;<br>    }<br></code></pre></p>\n\n<hr>\n<h2>Dashboard Design</h2>\n\n<h3>Grafana Dashboard</h3>\n\n<pre><code># dashboard.json\n{\n  \"dashboard\": {\n    \"title\": \"QA Metrics Dashboard\",\n    \"panels\": [\n      {\n        \"title\": \"Test Pass Rate\",\n        \"type\": \"stat\",\n        \"targets\": [\n          {\n            \"expr\": \"sum(test_results{status=\'passed\'}) / sum(test_results) * 100\"\n          }\n        ],\n        \"fieldConfig\": {\n          \"defaults\": {\n            \"unit\": \"percent\",\n            \"thresholds\": {\n              \"mode\": \"absolute\",\n              \"steps\": [\n                {\"value\": 0, \"color\": \"red\"},\n                {\"value\": 90, \"color\": \"yellow\"},\n                {\"value\": 95, \"color\": \"green\"}\n              ]\n            }\n          }\n        }\n      },\n      {\n        \"title\": \"Test Execution Time\",\n        \"type\": \"timeseries\",\n        \"targets\": [\n          {\n            \"expr\": \"rate(test_execution_seconds_sum[5m]) / rate(test_execution_seconds_count[5m])\"\n          }\n        ],\n        \"fieldConfig\": {\n          \"defaults\": {\n            \"unit\": \"s\",\n            \"custom\": {\n              \"lineWidth\": 2,\n              \"fillOpacity\": 10\n            }\n          }\n        }\n      },\n      {\n        \"title\": \"Coverage Trend\",\n        \"type\": \"timeseries\",\n        \"targets\": [\n          {\n            \"expr\": \"test_coverage_percent\",\n            \"legendFormat\": \"Coverage {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\n          }\n        ]\n      },\n      {\n        \"title\": \"DORA Metrics\",\n        \"type\": \"table\",\n        \"targets\": [\n          {\n            \"expr\": \"deployment_frequency\"\n          },\n          {\n            \"expr\": \"lead_time_hours\"\n          },\n          {\n            \"expr\": \"time_to_restore_hours\"\n          },\n          {\n            \"expr\": \"change_failure_rate_percent\"\n          }\n        ]\n      },\n      {\n        \"title\": \"Defect Trends\",\n        \"type\": \"timeseries\",\n        \"targets\": [\n          {\n            \"expr\": \"rate(defects_created_total[1h])\",\n            \"legendFormat\": \"Created\"\n          },\n          {\n            \"expr\": \"rate(defects_resolved_total[1h])\",\n            \"legendFormat\": \"Resolved\"\n          }\n        ]\n      },\n      {\n        \"title\": \"Flaky Tests\",\n        \"type\": \"table\",\n        \"targets\": [\n          {\n            \"expr\": \"flaky_tests\",\n            \"format\": \"table\"\n          }\n        ]\n      }\n    ],\n    \"refresh\": \"5m\",\n    \"time\": {\n      \"from\": \"now-7d\",\n      \"to\": \"now\"\n    }\n  }\n}\n</code></pre>\n\n<hr>\n<h2>Relatórios</h2>\n\n<h3>Sprint Quality Report</h3>\n\n<pre><code># Sprint Quality Report - Sprint 42\n\n<h2>Resumo Executivo</h2><ol><li>Sprint durou: 14 dias</li>\n<li>Velocity: 42 story points</li>\n<li>Defect density: 0.4/story point</li>\n</ol>\n<h2>Métricas de Teste</h2>\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Sprint Atual</th><th>Sprint Anterior</th><th>Target</th></tr>\n<tr><td>Test Pass Rate</td><td>97{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&gt;95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Coverage</td><td>78{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>75{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&gt;80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Execution Time</td><td>25 min</td><td>28 min</td><td>&lt;30 min</td></tr>\n<tr><td>Flaky Tests</td><td>2{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>3{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>&lt;2{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n</table></figure>\n\n<h2>DORA Metrics</h2>\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Valor</th><th>Status</th></tr>\n<tr><td>Deployment Frequency</td><td>12/day</td><td>Elite</td></tr>\n<tr><td>Lead Time</td><td>2h</td><td>High</td></tr>\n<tr><td>MTTR</td><td>45min</td><td>Elite</td></tr>\n<tr><td>Change Failure Rate</td><td>8{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td><td>Elite</td></tr>\n</table></figure>\n\n<h2>Defeitos</h2><ol><li>Total criados: 17</li>\n<li>Total resolvidos: 15</li>\n<li>Em aberto: 2 (1 medium, 1 low)</li>\n<li>Em produção: 1</li>\n</ol>\n<h2>Riscos</h2>\n⚠️ Cobertura abaixo do target\n⚠️ 1 defeito crítico em produção\n\n<h2>Ações</h2><ol><li>[ ] Aumentar cobertura para 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</li>\n<li>[ ] Investigar causa do defeito em produção</li>\n<li>[ ] Revisar testes flaky</li></ol></ul>\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Monitoramento é essencial para melhoria contínua. As chaves são:<br><ol><li><strong>Definir métricas certas</strong> - Alinhadas com objetivos</li><br><li><strong>Coletar automaticamente</strong> - CI/CD integration</li><br><li><strong>Visualizar claramente</strong> - Dashboards efetivos</li><br><li><strong>Analisar tendências</strong> - Não apenas snapshots</li><br><li><strong>Agir sobre dados</strong> - Métricas sem ação não valem nada</li></ol></p>', 'Monitoramento de Qualidade: Métricas e Dashboards', '', 'inherit', 'closed', 'closed', '', '205-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '205', 'http://localhost:8082/ideiasti/?p=433', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('434', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda GitOps: infraestrutura como código, testes de infraestrutura, Terraform, Ansible e como garantir qualidade em configs.</p>\n\n<hr>\n<h2>O Que é GitOps?</h2>\n\n<p>GitOps usa Git como fonte única de verdade para infraestrutura e configurações. Changes são feitos via Git commits, não manualmente.</p>\n\n<h3>Princípios</h3>\n<ol><li><strong>Tudo no Git</strong> - Código, configs, infraestrutura</li>\n<li><strong>Automação</strong> - CI/CD reconcile com Git</li>\n<li><strong>Idempotência</strong> - mesmo resultado sempre</li>\n<li><strong>Auditoria</strong> - histórico completo de mudanças</li>\n</ol>\n<hr>\n<h2>Terraform - Infraestrutura como Código</h2>\n\n<h3>Setup</h3>\n\n<pre><code># main.tf\nterraform {\n  required_version = \"&gt;= 1.0\"\n\n<p>required_providers {<br>    aws = {<br>      source  = \"hashicorp/aws\"<br>      version = \"~&gt; 5.0\"<br>    }<br>  }</p>\n\n<p>backend \"s3\" {<br>    bucket = \"my-terraform-state\"<br>    key    = \"prod/terraform.tfstate\"<br>    region = \"us-east-1\"<br>  }<br>}</p>\n\n<p>provider \"aws\" {<br>  region = var.aws_region<br>}</p>\n\n<p># Variables<br>variable \"aws_region\" {<br>  description = \"AWS region\"<br>  type        = string<br>  default     = \"us-east-1\"<br>}</p>\n\n<p>variable \"environment\" {<br>  description = \"Environment name\"<br>  type        = string<br>  validation {<br>    condition     = contains([\"dev\", \"staging\", \"prod\"], var.environment)<br>    error_message = \"Environment must be dev, staging, or prod.\"<br>  }<br>}<br></code></pre></p>\n\n<h3>Recursos</h3>\n\n<pre><code># modules/api-service/main.tf\nvariable \"environment\" {}\nvariable \"app_name\" {}\nvariable \"desired_count\" { default = 2 }\nvariable \"instance_type\" { default = \"t3.micro\" }\n\n<p>resource \"aws_ecs_cluster\" \"main\" {<br>  name = \"${var.app_name}-${var.environment}\"</p>\n\n<p>setting {<br>    name  = \"containerInsights\"<br>    value = \"enabled\"<br>  }<br>}</p>\n\n<p>resource \"aws_ecs_task_definition\" \"api\" {<br>  family                   = \"${var.app_name}-api\"<br>  network_mode             = \"awsvpc\"<br>  requires_compatibilities = [\"FARGATE\"]<br>  cpu                      = \"256\"<br>  memory                   = \"512\"</p>\n\n<p>container_definitions = jsonencode([<br>    {<br>      name      = \"api\"<br>      image     = \"${var.app_name}:latest\"<br>      essential = true</p>\n\n<p>portMappings = [{<br>        containerPort = 8080<br>        protocol      = \"tcp\"<br>      }]</p>\n\n<p>environment = [<br>        { name = \"ENV\", value = var.environment }<br>      ]</p>\n\n<p>logConfiguration = {<br>        logDriver = \"awslogs\"<br>        options = {<br>          \"awslogs-group\"         = \"/ecs/${var.app_name}\"<br>          \"awslogs-region\"        = \"us-east-1\"<br>          \"awslogs-stream-prefix\" = \"ecs\"<br>        }<br>      }<br>    }<br>  ])<br>}</p>\n\n<p>resource \"aws_ecs_service\" \"api\" {<br>  name            = \"${var.app_name}-api-${var.environment}\"<br>  cluster         = aws_ecs_cluster.main.id<br>  task_definition = aws_ecs_task_definition.api.arn<br>  desired_count   = var.desired_count</p>\n\n<p>deployment_controller {<br>    type = \"ECS\"<br>  }</p>\n\n<p>deployment_maximum_percent         = 200<br>  deployment_minimum_healthy_percent = 100</p>\n\n<p>load_balancer {<br>    target_group_arn = aws_lb_target_group.api.arn<br>    container_name   = \"api\"<br>    container_port   = 8080<br>  }</p>\n\n<p>depends_on = [aws_lb.api]<br>}<br></code></pre></p>\n\n<hr>\n<h2>Testando Infraestrutura</h2>\n\n<h3>Terratest (Go)</h3>\n\n<pre><code>// api_service_test.go\npackage test\n\n<p>import (<br>    \"testing\"<br>    \"github.com/gruntwork-io/terratest/modules/terraform\"<br>    \"github.com/stretchr/testify/assert\"<br>    \"github.com/gruntwork-io/terratest/modules/aws\"<br>    \"time\"<br>)</p>\n\n<p>func TestAPIService(t *testing.T) {<br>    // Setup<br>    terraformOptions := &amp;terraform.Options{<br>        TerraformDir: \"../modules/api-service\",<br>        Vars: map[string]interface{}{<br>            \"environment\": \"test\",<br>            \"app_name\":    \"myapp\",<br>            \"desired_count\": 2,<br>        },<br>        BackendConfig: map[string]interface{}{<br>            \"bucket\": \"my-test-tfstate\",<br>            \"key\":    \"test/terraform.tfstate\",<br>        },<br>    }</p>\n\n<p>defer terraform.Destroy(t, terraformOptions)<br>    terraform.InitAndApply(t, terraformOptions)</p>\n\n<p>// Get outputs<br>    clusterName := terraform.Output(t, terraformOptions, \"cluster_name\")<br>    serviceName := terraform.Output(t, terraformOptions, \"service_name\")</p>\n\n<p>// Assertions<br>    assert.NotEmpty(t, clusterName)<br>    assert.NotEmpty(t, serviceName)</p>\n\n<p>// Wait for service to be stable<br>    aws.WaitForServiceToStabilize(t, \"us-east-1\", clusterName, serviceName, 10*time.Minute)</p>\n\n<p>// Get service details<br>    service := aws.GetEcsServiceDetails(t, \"us-east-1\", clusterName, serviceName)<br>    assert.Equal(t, int32(2), *service.DesiredCount)</p>\n\n<p>// Verify load balancer<br>    lbArn := terraform.Output(t, terraformOptions, \"lb_arn\")<br>    assert.NotEmpty(t, lbArn)<br>}<br></code></pre></p>\n\n<h3>Checkov (Security Scanning)</h3>\n\n<pre><code># .github/workflows/security-scan.yml\nname: Infrastructure Security Scan\n\n<p>on:<br>  pull_request:<br>    paths:<br>      - \'**.tf\'<br>      - \'<strong>/terrform/</strong>\'</p>\n\n<p>jobs:<br>  security-scan:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Checkov<br>        uses: bridgecrewio/checkov-action@master<br>        with:<br>          directory: .<br>          framework: terraform<br>          output_format: sarif<br>          output_file_path: results.sarif</p>\n\n<p>- name: Upload to GitHub Security<br>        uses: github/codeql-action/upload-sarif@v2<br>        with:<br>          sarif_file: results.sarif<br></code></pre></p>\n\n<pre><code># CLI\ncheckov -d ./infrastructure --framework terraform\n\n<p># Com fail<br>checkov -d ./infrastructure --check CK_VPC_SG_1</p>\n\n<p># Skip específico<br>checkov -d ./infrastructure --skip-check CK_VPC_SG_1<br></code></pre></p>\n\n<h3>Sentinel (Policy as Code)</h3>\n\n<pre><code># policies/api-service.sentinel\nimport \"tfplan/v2\" as tfplan\n\n<p># Validate environment<br>validate_environment = func() {<br>    violations = []</p>\n\n<p>for tfplan.resource_changes as rc {<br>        if rc.type is \"aws_ecs_service\" {<br>            environment = rc.change.after.environment<br>            if environment is \"production\" {<br>                desired_count = rc.change.after.desired_count<br>                if desired_count &lt; 2 {<br>                    append(violations, rc.name)<br>                }<br>            }<br>        }<br>    }</p>\n\n<p>return violations<br>}</p>\n\n<p>main = rule {<br>    validate_environment() is []<br>}<br></code></pre></p>\n\n<hr>\n<h2>Ansible - Configuração</h2>\n\n<h3>Playbook</h3>\n\n<pre><code># playbooks/deploy-api.yml\n<hr>\n<ul><li>name: Deploy API Service</li></ul>\n  hosts: api_servers\n  become: yes\n  vars:\n    app_version: \"1.2.3\"\n    deploy_path: \"/opt/myapp\"\n\n<p>tasks:<br>    - name: Ensure deploy directory exists<br>      file:<br>        path: \"{{ deploy_path }}\"<br>        state: directory<br>        owner: www-data<br>        group: www-data<br>        mode: \'0755\'</p>\n\n<p>- name: Deploy application<br>      template:<br>        src: \"app.conf.j2\"<br>        dest: \"{{ deploy_path }}/config.conf\"<br>        owner: www-data<br>        group: www-data<br>        mode: \'0644\'<br>      notify: Restart API</p>\n\n<p>- name: Pull latest image<br>      docker_image:<br>        name: myapp/api<br>        tag: \"{{ app_version }}\"<br>        source: pull<br>        force_source: yes</p>\n\n<p>- name: Ensure API is running<br>      docker_container:<br>        name: api<br>        image: \"myapp/api:{{ app_version }}\"<br>        state: started<br>        restart_policy: always<br>        ports:<br>          - \"8080:8080\"<br>        env:<br>          ENV: \"{{ app_environment }}\"<br>          DATABASE_URL: \"{{ db_connection_string }}\"<br>        volumes:<br>          - \"{{ deploy_path }}/config.conf:/app/config.conf:ro\"</p>\n\n<p>- name: Wait for API to be healthy<br>      uri:<br>        url: \"http://localhost:8080/health\"<br>        status_code: 200<br>      register: result<br>      until: result.status == 200<br>      retries: 30<br>      delay: 5</p>\n\n<p>handlers:<br>    - name: Restart API<br>      docker_container:<br>        name: api<br>        state: restarted<br></code></pre></p>\n\n<h3>Molecule (Testing Ansible)</h3>\n\n<pre><code># molecule/default/molecule.yml\n<hr>\ndependency:\n  name: galaxy\ndriver:\n  name: docker\nplatforms:\n  - name: instance\n    image: \"geerlingguy/docker-${MOLECULE_DISTRO:-centos7}\"\n    command: \"\"\n    volumes:\n      - /sys/fs/cgroup:/sys/fs/cgroup:ro\n    privileged: true\nprovisioner:\n  name: ansible\n  lint: |\n    ansible-lint\nverifier:\n  name: testinfra\n  lint:\n    - flake8\n</code></pre>\n\n<pre><code># molecule/default/tests/test_default.py\nimport os\nimport pytest\n\n<p>def test_api_installed(host):<br>    api = host.file(\"/opt/myapp\")<br>    assert api.exists<br>    assert api.is_directory</p>\n\n<p>def test_api_config(host):<br>    config = host.file(\"/opt/myapp/config.conf\")<br>    assert config.exists<br>    assert config.user == \"www-data\"</p>\n\n<p>def test_api_service(host):<br>    service = host.service(\"api\")<br>    assert service.is_running<br>    assert service.is_enabled</p>\n\n<p>def test_api_health(host):<br>    response = host.run(\"curl -f http://localhost:8080/health\")<br>    assert response.rc == 0<br>    assert \"healthy\" in response.stdout<br></code></pre></p>\n\n<hr>\n<h2>ArgoCD - GitOps</h2>\n\n<h3>Application</h3>\n\n<pre><code># argocd/application.yaml\napiVersion: argoproj.io/v1alpha1\nkind: Application\nmetadata:\n  name: myapp-api\n  namespace: argocd\n  finalizers:\n    - resources-finalizer.argocd.argoproj.io\nspec:\n  project: default\n  source:\n    repoURL: https://github.com/myorg/manifests.git\n    targetRevision: HEAD\n    path: apps/api-service/overlays/production\n  destination:\n    server: https://kubernetes.default.svc\n    namespace: production\n  syncPolicy:\n    automated:\n      prune: true\n      selfHeal: true\n      allowEmpty: false\n    syncOptions:\n      - CreateNamespace=true\n      - PruneLast=true\n    retry:\n      limit: 5\n      backoff:\n        duration: 5s\n        factor: 2\n        maxDuration: 3m\n  ignoreDifferences:\n    - group: apps\n      kind: Deployment\n      jsonPointers:\n        - /spec/replicas\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>GitOps garante infraestrutura versionada e testável. As chaves são:<br><ol><li><strong>Tudo no Git</strong> - Audit trail completo</li><br><li><strong>Testar infraestrutura</strong> - Terratest, Checkov, Molecule</li><br><li><strong>Automação</strong> - ArgoCD reconcile</li><br><li><strong>Policy as Code</strong> - Validate with Sentinel</li><br><li><strong>Drift detection</strong> - Detect unauthorized changes</li></ol></p>', 'GitOps e Qualidade: Infraestrutura como Código Testável', '', 'inherit', 'closed', 'closed', '', '206-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '206', 'http://localhost:8082/ideiasti/?p=434', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('435', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a testar acessibilidade: WCAG 2.1, ARIA, screen readers, testes automatizados e manuais para garantir que seu site é acessível a todos.</p>\n\n<hr>\n<h2>O Que é Acessibilidade?</h2>\n\n<p>Acessibilidade web garante que pessoas com deficiências podem usar websites. No Brasil, a <strong>Lei Brasileira de Inclusão (Lei 13.146/2015)</strong> exige acessibilidade em sites públicos e de empresas.</p>\n\n<h3>Por Que Importa?</h3>\n\n<ul><li><strong>Inclusão</strong>: 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} da população tem algum tipo de deficiência</li><ol><li><strong>Legal</strong>: Conformidade com LGPD e leis</li>\n<li><strong>SEO</strong>: Sites acessíveis rankeiam melhor</li>\n<li><strong>UX</strong>: Boas práticas beneficiam todos</li>\n</ol>\n<hr>\n<h2>WCAG 2.1 - 4 Princípios</h2>\n\n<h3>1. Perceivable (Perceptível)</h3>\n\n<pre><code><!-- Imagens com alt text -->\n<img src=\"logo.png\" alt=\"Empresa X - Página inicial\">\n\n<p><!-- Vídeos com legendas --><br><video><br>  <track kind=\"subtitles\" src=\"legendas.vtt\" srclang=\"pt\" label=\"Português\"><br></video></p>\n\n<p><!-- Contrast adequado --><br><br>  .text {<br>    color: #1a1a1a;        /<em> Pior: #767676 = 4.5:1 em fundo branco </em>/<br>    background: #ffffff;   /<em> Melhor: #1a1a1a = 21:1 em fundo branco </em>/<br>  }<br><br></code></pre></p>\n\n<h3>2. Operable (Operável)</h3>\n\n<pre><code><!-- Navegação por teclado -->\n<nav>\n  <a href=\"#main\" class=\"skip-link\">Pular para conteúdo principal</a>\n  <a href=\"#menu\">Menu</a>\n  <a href=\"#search\">Busca</a>\n</nav>\n\n<p><br>.skip-link {<br>  position: absolute;<br>  top: -40px;<br>  left: 0;<br>  background: #000;<br>  color: #fff;<br>  padding: 8px;<br>  z-index: 100;<br>}<br>.skip-link:focus {<br>  top: 0;<br>}<br></p>\n\n<p><!-- Focus visível --><br>:focus {<br>  outline: 3px solid #005fcc;<br>  outline-offset: 2px;<br>}<br></code></pre></p>\n\n<h3>3. Understandable (Compreensível)</h3>\n\n<pre><code><!-- Labels em inputs -->\n<label for=\"email\">Email</label>\n\n<span id=\"email-hint\">Formato: usuario@dominio.com</span>\n\n<p><!-- Erros claros --><br><div class=\"error\" role=\"alert\"><br>  <span id=\"password-error\">Senha deve ter:</span><br>  <ul aria-labelledby=\"password-error\"><br>    <li id=\"error-length\">Mínimo 8 caracteres</li><br>    <li id=\"error-number\">Pelo menos 1 número</li><br>  </ul><br></div><br></code></pre></p>\n\n<h3>4. Robust (Robusto)</h3>\n\n<pre><code><!-- HTML semântico -->\n<header role=\"banner\">\n  <nav role=\"navigation\" aria-label=\"Menu principal\">\n  <main role=\"main\">\n  <article role=\"article\">\n  <aside role=\"complementary\">\n  <footer role=\"contentinfo\">\n</code></pre>\n\n<hr>\n<h2>ARIA - Accessible Rich Internet Applications</h2>\n\n<h3>Roles</h3>\n\n<pre><code><!-- Landmarks -->\n<header role=\"banner\">\n<nav role=\"navigation\">\n<main role=\"main\">\n<aside role=\"complementary\">\n<footer role=\"contentinfo\">\n\n<p><!-- Widgets --><br><button role=\"button\" aria-expanded=\"false\"><br><div role=\"menu\" aria-label=\"Menu\"><br><div role=\"menuitem\"><br><div role=\"tablist\"><br><div role=\"tab\"><br><div role=\"tabpanel\"><br><div role=\"dialog\" aria-labelledby=\"dialog-title\"><br></code></pre></p>\n\n<h3>Estados e Propriedades</h3>\n\n<pre><code><!-- Expanded/Collapsed -->\n<button aria-expanded=\"false\" aria-controls=\"menu-content\">\n<div id=\"menu-content\" hidden>\n\n<p><!-- Selected --><br><br></p>\n\n<p><!-- Disabled --><br><button></p>\n\n<p><!-- Live Regions --><br><div aria-live=\"polite\">Notificação</div><br><div aria-live=\"assertive\">Erro</div><br><div><br></code></pre></p>\n\n<hr>\n<h2>Testes Automatizados</h2>\n\n<h3>axe-core</h3>\n\n<pre><code>// Playwright + axe\nconst { test, expect } = require(\'@playwright/test\');\nconst AxeBuilder = require(\'@axe-core/playwright\').default;\n\n<p>test(\'accessibility on login page\', async ({ page }) =&gt; {<br>  await page.goto(\'/login\');</p>\n\n<p>const accessibilityScanResults = await new AxeBuilder({ page })<br>    .withTags([\'wcag2a\', \'wcag2aa\', \'wcag21a\', \'wcag21aa\'])<br>    .analyze();</p>\n\n<p>// Log violations<br>  if (accessibilityScanResults.violations.length &gt; 0) {<br>    console.log(\'Violations found:\');<br>    accessibilityScanResults.violations.forEach(v =&gt; {<br>      console.log(<code>  - ${v.id}: ${v.description}</code>);<br>    });<br>  }</p>\n\n<p>// Fail if critical violations<br>  const critical = accessibilityScanResults.violations.filter(<br>    v =&gt; v.impact === \'critical\'<br>  );<br>  expect(critical.length, <code>${critical.length} critical violations</code>).toBe(0);<br>});<br></code></pre></p>\n\n<pre><code># pytest + axe\nimport pytest\nfrom playwright.sync_api import Page\n\n<p>def test_accessibility(page: Page):<br>    page.goto(\'/login\')</p>\n\n<p>results = page.run_axe()</p>\n\n<p>critical_violations = [<br>        v for v in results[\'violations\']<br>        if v[\'impact\'] in [\'critical\', \'serious\']<br>    ]</p>\n\n<p>assert len(critical_violations) == 0, (<br>        f\"Found {len(critical_violations)} critical accessibility violations\"<br>    )<br></code></pre></p>\n\n<h3>Lighthouse CI</h3>\n\n<pre><code># .github/workflows/a11y.yml\nname: Accessibility Tests\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  accessibility:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Run Lighthouse CI<br>        uses: treosh/lighthouse-ci-action@v10<br>        with:<br>          urls: |<br>            https://example.com/<br>            https://example.com/login<br>          budgetPath: ./lighthouse-budget.json<br>          uploadArtifacts: true<br>          temporaryPublicStorage: true</p>\n\n<p># lighthouse-budget.json<br>{<br>  \"ci\": {<br>    \"collect\": {<br>      \"startServerCommand\": \"npm run start\",<br>      \"url\": [<br>        \"http://localhost:8080/\"<br>      ]<br>    },<br>    \"assert\": {<br>      \"assertions\": {<br>        \"categories:accessibility\": [\"error\", {\"minScore\": 0.9}]<br>      }<br>    }<br>  }<br>}<br></code></pre></p>\n\n<hr>\n<h2>Testes Manuais</h2>\n\n<h3>Checklist de Testes Manuais</h3>\n\n<pre><code># Accessibility Testing Checklist\n\n<h2>Navegação por Teclado</h2><ol><li>[ ] Tab percorre todos os elementos interativos</li>\n<li>[ ] ordem de foco faz sentido</li>\n<li>[ ] Focus é sempre visível</li>\n<li>[ ] Links úteis no topo (skip link)</li>\n<li>[ ] ESC fecha modais</li>\n<li>[ ] Enter ativa botões e links</li>\n</ol>\n<h2>Imagens</h2><ol><li>[ ] Todas imagens têm alt text</li>\n<li>[ ] Alt text descreve conteúdo/função</li>\n<li>[ ] Imagens decorativas têm alt=\"\"</li>\n<li>[ ] Textos em imagens evitados</li>\n</ol>\n<h2>Contrastes</h2><ol><li>[ ] Texto normal: 4.5:1 mínimo</li>\n<li>[ ] Texto grande (18pt+): 3:1 mínimo</li>\n<li>[ ] Gráficos: 3:1</li>\n</ol>\n<h2>Formulários</h2><ol><li>[ ] Labels associados a inputs</li>\n<li>[ ] Erros descritos claramente</li>\n<li>[ ] Campos obrigatórios marcados</li>\n<li>[ ] Autocomplete quando aplicável</li>\n</ol>\n<h2>Semântica</h2><ol><li>[ ] Cabeçalhos em ordem (h1 &gt; h2 &gt; h3)</li>\n<li>[ ] Listas usam <ul>/<ol></li>\n<li>[ ] Tabelas têm headers</li>\n<li>[ ] Landmarks definidos</li>\n</ol>\n<h2>ARIA</h2><ol><li>[ ] ARIA usado quando HTML não é suficiente</li>\n<li>[ ] ARIA não sobrepõe semântica nativa</li>\n<li>[ ] Live regions atualizam corretamente</li>\n</ol></code></pre>\n\n<h3>Screen Reader Testing</h3>\n\n<pre><code># Screen Reader Testing\n\n<h2>VoiceOver (macOS)</h2><ol><li>Cmd + F5: Ativar VoiceOver</li>\n<li>Tab/Cmd + Option + Setas: Navegar</li>\n<li>Cmd + Option + U: Rotor</li>\n</ol>\n<h2>NVDA (Windows)</h2><ol><li>Insert + D: Ler documento</li>\n<li>Tab: Próximo elemento</li>\n<li>Insert + Espaço: Modo foco</li>\n</ol>\n<h2>Verificar:</h2><ol><li>[ ] Ordem de leitura faz sentido</li>\n<li>[ ] Imagens descritas</li>\n<li>[ ] Links têm contexto</li>\n<li>[ ] Formulários etiquetados</li>\n<li>[ ] Tabelas fazem sentido</li>\n<li>[ ] Headings navegáveis</li></ol></ul>\n</code></pre>\n\n<hr>\n<h2>Ferramentas</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Custo</th></tr>\n<tr><td><strong>axe DevTools</strong></td><td>Browser Extension</td><td>Grátis</td></tr>\n<tr><td><strong>WAVE</strong></td><td>Browser Extension</td><td>Grátis</td></tr>\n<tr><td><strong>Lighthouse</strong></td><td>DevTools/CLI</td><td>Grátis</td></tr>\n<tr><td><strong>AXE-core</strong></td><td>Library</td><td>Grátis</td></tr>\n<tr><td><strong>SiteImprove</strong></td><td>SaaS</td><td>Pago</td></tr>\n<tr><td><strong>Deque aXe</strong></td><td>Enterprise</td><td>Pago</td></tr>\n<tr><td><strong>Tenon.io</strong></td><td>API</td><td>Pago</td></tr>\n</table></figure>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Acessibilidade é fundamental para inclusão. As chaves são:<br><ol><li><strong>Semântica primeiro</strong> - Use HTML correto</li><br><li><strong>Teste automatizado</strong> - Capture issues rapidamente</li><br><li><strong>Teste manual</strong> - Screen readers e teclado</li><br><li><strong>WCAG compliance</strong> - Atingir nível AA mínimo</li><br><li><strong>Continuous testing</strong> - Integre ao CI/CD</li></ol></p>', 'Accessibility Testing: Garantindo Inclusão e Conformidade WCAG', '', 'inherit', 'closed', 'closed', '', '207-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '207', 'http://localhost:8082/ideiasti/?p=435', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('436', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a usar Docker para QA: imagens otimizadas, docker-compose, multi-stage builds, e como containerizar sua suite de testes.</p>\n\n<hr>\n<h2>Por Que Docker para QA?</h2>\n\n<ul><li><strong>Ambientes consistentes</strong> - Same in dev, CI, prod</li><ol><li><strong>Isolamento</strong> - Testes não afetam sistema host</li>\n<li><strong>Reproducibilidade</strong> - Resultados consistentes</li>\n<li><strong>Escalabilidade</strong> - Múltiplos containers de teste</li>\n<li><strong>CI/CD integration</strong> - Fáceis de automatizar</li></ol></ul>\n\n<hr>\n<h2>Dockerfile para Testes</h2>\n\n<h3>Multi-Stage Build</h3>\n\n<pre><code># syntax=docker/dockerfile:1\n\n<p># Stage 1: Build<br>FROM node:18-alpine AS builder<br>WORKDIR /app</p>\n\n<p>COPY package*.json ./<br>RUN npm ci --only=production</p>\n\n<p>COPY . .<br>RUN npm run build</p>\n\n<p># Stage 2: Test<br>FROM node:18-alpine AS test<br>WORKDIR /app</p>\n\n<p># Copy dependencies only (layer caching)<br>COPY package*.json ./<br>RUN npm ci</p>\n\n<p># Copy source<br>COPY . .</p>\n\n<p># Install test dependencies<br>RUN npm ci --prefix .</p>\n\n<p># Copy built artifacts<br>COPY --from=builder /app/dist ./dist<br>COPY --from=builder /app/node_modules ./node_modules</p>\n\n<p># Run tests<br>CMD [\"npm\", \"test\"]</p>\n\n<p># Stage 3: Production<br>FROM node:18-alpine AS production<br>WORKDIR /app</p>\n\n<p>COPY --from=builder /app/dist ./dist<br>COPY --from=builder /app/node_modules ./node_modules<br>COPY --from=builder /app/package*.json ./</p>\n\n<p>USER node<br>EXPOSE 8080</p>\n\n<p>CMD [\"node\", \"dist/index.js\"]<br></code></pre></p>\n\n<h3>Python Tests</h3>\n\n<pre><code>FROM python:3.11-slim\n\n<p>WORKDIR /app</p>\n\n<p># Install system dependencies<br>RUN apt-get update &amp;&amp; apt-get install -y --no-install-recommends <br>    build-essential <br>    libpq-dev <br>    &amp;&amp; rm -rf /var/lib/apt/lists/*</p>\n\n<p># Copy requirements first (layer caching)<br>COPY requirements.txt .<br>RUN pip install --no-cache-dir -r requirements.txt</p>\n\n<p># Copy application<br>COPY . .</p>\n\n<p># Run tests with coverage<br>CMD [\"pytest\", \"-v\", \"--cov=src\", \"--cov-report=xml\", \"--cov-report=html\"]<br></code></pre></p>\n\n<hr>\n<h2>Docker Compose para Ambientes</h2>\n\n<h3>Desenvolvimento Local</h3>\n\n<pre><code># docker-compose.yml\nversion: \'3.8\'\n\n<p>services:<br>  app:<br>    build:<br>      context: .<br>      dockerfile: Dockerfile<br>    ports:<br>      - \"3000:3000\"<br>    environment:<br>      - NODE_ENV=development<br>      - DATABASE_URL=postgres://test:test@db:5432/test<br>      - REDIS_URL=redis://cache:6379<br>    depends_on:<br>      db:<br>        condition: service_healthy<br>      cache:<br>        condition: service_started<br>    volumes:<br>      - .:/app<br>      - /app/node_modules<br>    command: npm run dev</p>\n\n<p>db:<br>    image: postgres:15-alpine<br>    environment:<br>      POSTGRES_DB: test<br>      POSTGRES_USER: test<br>      POSTGRES_PASSWORD: test<br>    ports:<br>      - \"5432:5432\"<br>    volumes:<br>      - postgres_data:/var/lib/postgresql/data<br>      - ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init.sql<br>    healthcheck:<br>      test: [\"CMD-SHELL\", \"pg_isready -U test -d test\"]<br>      interval: 5s<br>      timeout: 5s<br>      retries: 5</p>\n\n<p>cache:<br>    image: redis:7-alpine<br>    ports:<br>      - \"6379:6379\"<br>    volumes:<br>      - redis_data:/data</p>\n\n<p>test:<br>    build:<br>      context: .<br>      dockerfile: Dockerfile.test<br>    environment:<br>      - DATABASE_URL=postgres://test:test@db:5432/test<br>      - REDIS_URL=redis://cache:6379<br>    depends_on:<br>      db:<br>        condition: service_healthy<br>      cache:<br>        condition: service_started<br>    volumes:<br>      - ./test-results:/app/test-results<br>    command: pytest -v --junitxml=/app/test-results/results.xml</p>\n\n<p>volumes:<br>  postgres_data:<br>  redis_data:<br></code></pre></p>\n\n<h3>CI Environment</h3>\n\n<pre><code># docker-compose.ci.yml\nversion: \'3.8\'\n\n<p>services:<br>  app:<br>    build:<br>      context: .<br>      target: test<br>    depends_on:<br>      postgres:<br>        condition: service_healthy<br>      redis:<br>        condition: service_started<br>    environment:<br>      DATABASE_URL: postgres://test:test@postgres:5432/test<br>      REDIS_URL: redis://redis:6379<br>    command: pytest -v --cov=src --cov-report=xml --cov-fail-under=80</p>\n\n<p>postgres:<br>    image: postgres:15-alpine<br>    environment:<br>      POSTGRES_DB: test<br>      POSTGRES_USER: test<br>      POSTGRES_PASSWORD: test<br>    healthcheck:<br>      test: [\"CMD-SHELL\", \"pg_isready -U test\"]<br>      interval: 5s<br>      timeout: 5s<br>      retries: 5</p>\n\n<p>redis:<br>    image: redis:7-alpine<br></code></pre></p>\n\n<hr>\n<h2>Testcontainers</h2>\n\n<pre><code># testcontainers_example.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\nfrom testcontainers.compose import DockerCompose\nimport psycopg2\n\n<p>@pytest.fixture(scope=\"module\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15\") as pg:<br>        yield pg</p>\n\n<p>@pytest.fixture(scope=\"module\")<br>def redis():<br>    with RedisContainer(\"redis:7\") as rd:<br>        yield rd</p>\n\n<p>@pytest.fixture<br>def db_connection(postgres):<br>    conn = psycopg2.connect(postgres.get_connection_url())<br>    yield conn<br>    conn.close()</p>\n\n<p>def test_with_containers(postgres, redis):<br>    \"\"\"Test usando bancos containerizados\"\"\"<br>    # Use containers<br>    db_url = postgres.get_connection_url()<br>    redis_url = redis.get_connection_url()</p>\n\n<p># Your test logic here<br>    conn = psycopg2.connect(db_url)<br>    cursor = conn.cursor()<br>    cursor.execute(\"SELECT version();\")<br>    result = cursor.fetchone()<br>    assert \"PostgreSQL\" in result[0]<br></code></pre></p>\n\n<hr>\n<h2>Docker para Selenium Grid</h2>\n\n<pre><code># selenium-grid.yml\nversion: \'3.8\'\n\n<p>services:<br>  selenium-hub:<br>    image: selenium/hub:4.15<br>    ports:<br>      - \"4442:4442\"<br>      - \"4443:4443\"<br>      - \"4444:4444\"<br>    environment:<br>      SE_EVENT_BUS_HOST: selenium-hub<br>      SE_EVENT_BUS_PUBLISH_PORT: 4442<br>      SE_EVENT_BUS_SUBSCRIBE_PORT: 4443</p>\n\n<p>chrome:<br>    image: selenium/node-chrome:4.15<br>    depends_on:<br>      - selenium-hub<br>    environment:<br>      SE_EVENT_BUS_HOST: selenium-hub<br>      SE_EVENT_BUS_PUBLISH_PORT: 4442<br>      SE_EVENT_BUS_SUBSCRIBE_PORT: 4443<br>      SE_NODE_MAX_SESSIONS: 5<br>    shm_size: \'2gb\'</p>\n\n<p>firefox:<br>    image: selenium/node-firefox:4.15<br>    depends_on:<br>      - selenium-hub<br>    environment:<br>      SE_EVENT_BUS_HOST: selenium-hub<br>      SE_EVENT_BUS_PUBLISH_PORT: 4442<br>      SE_EVENT_BUS_SUBSCRIBE_PORT: 4443<br>      SE_NODE_MAX_SESSIONS: 3</p>\n\n<p>edge:<br>    image: selenium/node-edge:4.15<br>    depends_on:<br>      - selenium-hub<br>    environment:<br>      SE_EVENT_BUS_HOST: selenium-hub<br>      SE_EVENT_BUS_PUBLISH_PORT: 4442<br>      SE_EVENT_BUS_SUBSCRIBE_PORT: 4443<br>      SE_NODE_MAX_SESSIONS: 3<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Docker é essencial para QA moderno. As chaves são:<br><ol><li><strong>Multi-stage builds</strong> - Imagens otimizadas</li><br><li><strong>Docker Compose</strong> - Ambientes completos</li><br><li><strong>Testcontainers</strong> - DBs containerizados para testes</li><br><li><strong>Layer caching</strong> - Builds mais rápidos</li><br><li><strong>CI integration</strong> - Automação simplificada</li></ol></p>', 'Docker para QA: Containers para Testes e Ambientes', '', 'inherit', 'closed', 'closed', '', '208-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '208', 'http://localhost:8082/ideiasti/?p=436', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('437', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda a criar e usar fake services: mocking de APIs, databases, message queues. Como testar sem dependências externas.</p>\n\n<hr>\n<h2>Por Que Usar Fakes e Mocks?</h2>\n\n<ul><li><strong>Isolamento</strong>: Testes não dependem de serviços externos</li><ol><li><strong>Velocidade</strong>: Mocks são mais rápidos que serviços reais</li>\n<li><strong>Confiabilidade</strong>: Não há flaky tests por dependências</li>\n<li><strong>Cobertura</strong>: Testar edge cases difíceis de reproduzir</li></ol></ul>\n\n<hr>\n<h2>Tipos de Fakes</h2>\n\n<h3>1. Fake Objects</h3>\n\n<p>Simulam comportamento de objetos reais.</p>\n\n<pre><code># fakes/user_repository.py\nclass FakeUserRepository:\n    def __init__(self):\n        self.users = {}\n        self._id_counter = 1\n\n<p>def save(self, user):<br>        if not user.id:<br>            user.id = self._id_counter<br>            self._id_counter += 1<br>        self.users[user.id] = user<br>        return user</p>\n\n<p>def find_by_id(self, id):<br>        return self.users.get(id)</p>\n\n<p>def find_by_email(self, email):<br>        for user in self.users.values():<br>            if user.email == email:<br>                return user<br>        return None</p>\n\n<p>def delete(self, id):<br>        if id in self.users:<br>            del self.users[id]<br>            return True<br>        return False</p>\n\n<p># Uso em testes<br>def test_create_user():<br>    repo = FakeUserRepository()<br>    service = UserService(repo)</p>\n\n<p>user = service.create_user(\"João\", \"joao@example.com\")</p>\n\n<p>assert user.id is not None<br>    assert user.name == \"João\"<br>    assert repo.find_by_email(\"joao@example.com\") == user<br></code></pre></p>\n\n<h3>2. Fake APIs</h3>\n\n<p>Simulam endpoints HTTP.</p>\n\n<pre><code># fakes/http_fake.py\nimport json\nfrom http.server import HTTPServer, BaseHTTPRequestHandler\nfrom threading import Thread\nfrom typing import Dict, Callable\n\n<p>class FakeAPIHandler(BaseHTTPRequestHandler):<br>    routes: Dict[str, Callable] = {}</p>\n\n<p>def do_GET(self):<br>        self._handle_request(\'GET\')</p>\n\n<p>def do_POST(self):<br>        self._handle_request(\'POST\')</p>\n\n<p>def do_PUT(self):<br>        self._handle_request(\'PUT\')</p>\n\n<p>def do_DELETE(self):<br>        self._handle_request(\'DELETE\')</p>\n\n<p>def _handle_request(self, method):<br>        handler = self.routes.get((method, self.path))<br>        if handler:<br>            response = handler(self)<br>            self._send_response(response)<br>        else:<br>            self._send_response({\'error\': \'Not found\'}, 404)</p>\n\n<p>def _send_response(self, data, status=200):<br>        self.send_response(status)<br>        self.send_header(\'Content-Type\', \'application/json\')<br>        self.end_headers()<br>        self.wfile.write(json.dumps(data).encode())</p>\n\n<p>def log_message(self, format, *args):<br>        pass  # Silenciar logs</p>\n\n<p>class FakeAPIServer:<br>    def __init__(self, port=8080):<br>        self.port = port<br>        self.server = None<br>        self.thread = None<br>        self.routes = {}</p>\n\n<p>def register(self, method, path, handler):<br>        self.routes[(method, path)] = handler<br>        FakeAPIHandler.routes = self.routes</p>\n\n<p>def start(self):<br>        self.server = HTTPServer((\'localhost\', self.port), FakeAPIHandler)<br>        self.thread = Thread(target=self.server.serve_forever)<br>        self.thread.daemon = True<br>        self.thread.start()</p>\n\n<p>def stop(self):<br>        if self.server:<br>            self.server.shutdown()</p>\n\n<p># Uso<br>def payment_handler(request):<br>    return {<br>        \'transaction_id\': \'tx_123\',<br>        \'status\': \'approved\',<br>        \'amount\': 99.90<br>    }</p>\n\n<p>fake_api = FakeAPIServer(8080)<br>fake_api.register(\'POST\', \'/api/payment\', payment_handler)<br>fake_api.start()</p>\n\n<p># Seus testes aqui</p>\n\n<p>fake_api.stop()<br></code></pre></p>\n\n<h3>3. Fake Databases (SQLite)</h3>\n\n<pre><code># fakes/database.py\nimport sqlite3\nimport os\n\n<p>class FakeDatabase:<br>    def __init__(self, in_memory=True):<br>        if in_memory:<br>            self.conn = sqlite3.connect(\':memory:\')<br>        else:<br>            self.db_path = \'test.db\'<br>            self.conn = sqlite3.connect(self.db_path)</p>\n\n<p>self.conn.row_factory = sqlite3.Row<br>        self._create_tables()</p>\n\n<p>def _create_tables(self):<br>        cursor = self.conn.cursor()<br>        cursor.execute(\'\'\'<br>            CREATE TABLE users (<br>                id INTEGER PRIMARY KEY AUTOINCREMENT,<br>                name TEXT NOT NULL,<br>                email TEXT UNIQUE NOT NULL<br>            )<br>        \'\'\')<br>        cursor.execute(\'\'\'<br>            CREATE TABLE products (<br>                id INTEGER PRIMARY KEY AUTOINCREMENT,<br>                name TEXT NOT NULL,<br>                price REAL NOT NULL<br>            )<br>        \'\'\')<br>        self.conn.commit()</p>\n\n<p>def execute(self, query, params=None):<br>        cursor = self.conn.cursor()<br>        if params:<br>            cursor.execute(query, params)<br>        else:<br>            cursor.execute(query)<br>        self.conn.commit()<br>        return cursor</p>\n\n<p>def fetchone(self, query, params=None):<br>        cursor = self.execute(query, params)<br>        return cursor.fetchone()</p>\n\n<p>def fetchall(self, query, params=None):<br>        cursor = self.execute(query, params)<br>        return cursor.fetchall()</p>\n\n<p>def close(self):<br>        self.conn.close()<br>        if hasattr(self, \'db_path\') and os.path.exists(self.db_path):<br>            os.remove(self.db_path)</p>\n\n<p># Uso<br>def test_user_crud():<br>    db = FakeDatabase()</p>\n\n<p># Create<br>    db.execute(<br>        \'INSERT INTO users (name, email) VALUES (?, ?)\',<br>        (\'João\', \'joao@example.com\')<br>    )</p>\n\n<p># Read<br>    user = db.fetchone(\'SELECT * FROM users WHERE email = ?\', (\'joao@example.com\',))<br>    assert user[\'name\'] == \'João\'</p>\n\n<p>db.close()<br></code></pre></p>\n\n<hr>\n<h2>Mocking Libraries</h2>\n\n<h3>unittest.mock (Python)</h3>\n\n<pre><code>from unittest.mock import Mock, patch, MagicMock\n\n<p># Mock básico<br>def test_payment():<br>    mock_gateway = Mock()<br>    mock_gateway.charge.return_value = {\'status\': \'success\'}</p>\n\n<p>result = process_payment(100, mock_gateway)</p>\n\n<p>mock_gateway.charge.assert_called_once_with(100)<br>    assert result == \'success\'</p>\n\n<p># Patch<br>@patch(\'myapp.services.payment_gateway\')<br>def test_with_patch(mock_gateway):<br>    mock_gateway.charge.return_value = {\'status\': \'success\'}</p>\n\n<p>result = process_payment(100)</p>\n\n<p>mock_gateway.charge.assert_called_once()</p>\n\n<p># Spy (partial mock)<br>def test_spy():<br>    real_service = PaymentService()<br>    spy_service = Mock(wraps=real_service)</p>\n\n<p>spy_service.process(100)</p>\n\n<p>assert spy_service.process.called<br>    assert real_service.internal_method.called  # Real method foi chamado<br></code></pre></p>\n\n<h3>WireMock (Java/Server)</h3>\n\n<pre><code>// Java WireMock\nimport com.github.tomakehurst.wiremock.WireMockServer;\nimport static com.github.tomakehurst.wiremock.client.WireMock.*;\n\n<p>WireMockServer wireMock = new WireMockServer(8080);<br>wireMock.start();</p>\n\n<p>// Stub<br>wireMock.stubFor(post(urlEqualTo(\"/api/payment\"))<br>    .withRequestBody(containing(\"amount\"))<br>    .willReturn(aResponse()<br>        .withStatus(200)<br>        .withHeader(\"Content-Type\", \"application/json\")<br>        .withBody(\"{\"transaction_id\":\"tx_123\",\"status\":\"approved\"}\")));</p>\n\n<p>// Test<br>RestAssured.given()<br>    .contentType(\"application/json\")<br>    .body(\"{\"amount\":100}\")<br>.when()<br>    .post(\"http://localhost:8080/api/payment\")<br>.then()<br>    .statusCode(200)<br>    .body(\"status\", equalTo(\"approved\"));</p>\n\n<p>wireMock.stop();<br></code></pre></p>\n\n<h3>MSW (Mock Service Worker)</h3>\n\n<pre><code>// Mock API com MSW\nimport { setupWorker, rest } from \'msw\';\n\n<p>const handlers = [<br>  rest.post(\'/api/payment\', (req, res, ctx) =&gt; {<br>    return res(<br>      ctx.status(200),<br>      ctx.json({<br>        transaction_id: \'tx_123\',<br>        status: \'approved\',<br>        amount: req.body.amount<br>      })<br>    );<br>  }),</p>\n\n<p>rest.get(\'/api/users/:id\', (req, res, ctx) =&gt; {<br>    return res(<br>      ctx.status(200),<br>      ctx.json({<br>        id: req.params.id,<br>        name: \'João Silva\',<br>        email: \'joao@example.com\'<br>      })<br>    );<br>  }),</p>\n\n<p>rest.post(\'/api/users\', (req, res, ctx) =&gt; {<br>    return res(<br>      ctx.status(201),<br>      ctx.json({<br>        id: \'new-user-id\',<br>        ...req.body<br>      })<br>    );<br>  })<br>];</p>\n\n<p>export const worker = setupWorker(...handlers);</p>\n\n<p>// No test<br>import { worker } from \'./mocks/browser\';</p>\n\n<p>beforeAll(() =&gt; worker.start());<br>afterAll(() =&gt; worker.stop());</p>\n\n<p>test(\'payment flow\', async () =&gt; {<br>  render();</p>\n\n<p>// MSW intercepta requisição<br>  await userEvent.type(screen.getByLabelText(\'Valor\'), \'100\');<br>  await userEvent.click(screen.getByRole(\'button\', { name: /pagar/i }));</p>\n\n<p>expect(await screen.findByText(/transação aprovada/i)).toBeInTheDocument();<br>});<br></code></pre></p>\n\n<hr>\n<h2>TestContainers vs Fakes</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Aspecto</th><th>TestContainers</th><th>Fakes</th></tr>\n<tr><td><strong>Fidelidade</strong></td><td>Real service</td><td>Simulado</td></tr>\n<tr><td><strong>Velocidade</strong></td><td>Lento (minutos)</td><td>Rápido (ms)</td></tr>\n<tr><td><strong>Complexidade</strong></td><td>Alta</td><td>Baixa</td></tr>\n<tr><td><strong>Bugs encontrados</strong></td><td>Mais realistas</td><td>Menos</td></tr>\n<tr><td><strong>Manutenção</strong></td><td>Baixa</td><td>Alta (manter fakes)</td></tr>\n</table></figure>\n\n<h3>Quando Usar Cada</h3>\n\n<pre><code># Use FAKE quando:\n# - Precisa de respostas específicas/edge cases\n# - Performance é crítica\n# - Serviço externo é lento/não disponível\n# - Quer testar comportamento, não implementação\n\n<p># Use TestContainers quando:<br># - Precisa de comportamento real<br># - Testando integrações complexas<br># - Quer detectar problemas realistas<br># - Manutenção do fake seria muito complexa<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Mocks e fakes são essenciais para testes isolados. As chaves são:<br><ol><li><strong>Isolar</strong> - Testes não devem depender de externos</li><br><li><strong>Velocidade</strong> - Fakes são rápidos</li><br><li><strong>Verossimilhança</strong> - Fakes devem ser realistas</li><br><li><strong>Manutenção</strong> - Mocks automáticos vs manuais</li><br><li><strong>Combinar</strong> - Fakes + TestContainers quando necessário</li></ol></p>', 'Fake Services e Mocking: Isolando Dependências Externas', '', 'inherit', 'closed', 'closed', '', '209-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '209', 'http://localhost:8082/ideiasti/?p=437', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('438', '0', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '<p><strong>Meta Description:</strong> Aprenda testes de acessibilidade: WCAG 2.1, axe-core, Lighthouse, testes manuais e como garantir que seus apps são acessíveis.</p>\n\n<hr>\n<h2>Por Que Acessibilidade Importa?</h2>\n\n<ul><li><strong>1.3 bilhões</strong> de pessoas com deficiência no mundo</li><ol><li><strong>Leis</strong> como ADA, LGPD, EU Accessibility Act</li>\n<li><strong>SEO</strong> - Google prioriza sites acessíveis</li>\n<li><strong>Reputação</strong> - Marca inclusiva</li>\n<li><strong>Mercado</strong> - P público que você está excluindo</li>\n</ol>\n<hr>\n<h2>WCAG 2.1 - Princípios</h2>\n\n<h3>4 Princípios (POUR)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Princípio</th><th>Descrição</th></tr>\n<tr><td><strong>Perceivable</strong></td><td>Informações devem ser perceptíveis</td></tr>\n<tr><td><strong>Operable</strong></td><td>Interface deve ser operável</td></tr>\n<tr><td><strong>Understandable</strong></td><td>Informações e interface compreensíveis</td></tr>\n<tr><td><strong>Robust</strong></td><td>Conteúdo deve funcionar com tecnologias assistivas</td></tr>\n</table></figure>\n\n<h3>Níveis de Conformidade</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Nível</th><th>Significado</th><th>Requisito</th></tr>\n<tr><td><strong>A</strong></td><td>Básico</td><td>Mínimo, deve atender</td></tr>\n<tr><td><strong>AA</strong></td><td>Padrão</td><td>Recomendado, maioria das leis</td></tr>\n<tr><td><strong>AAA</strong></td><td>Avançado</td><td>Mais rigoroso, poucos достигают</td></tr>\n</table></figure>\n\n<hr>\n<h2>Ferramentas Automatizadas</h2>\n\n<h3>axe-core</h3>\n\n<pre><code>// Npm\nnpm install @axe-core/playwright\n\n<p>// Playwright integration<br>const { chromium } = require(\'playwright\');<br>const AxeBuilder = require(\'@axe-core/playwright\').default;</p>\n\n<p>async function runAccessibilityTest() {<br>    const browser = await chromium.launch();<br>    const page = await browser.newPage();</p>\n\n<p>await page.goto(\'https://example.com\');</p>\n\n<p>const results = await new AxeBuilder({ page })<br>        .withTags([\'wcag2a\', \'wcag2aa\', \'wcag21aa\'])<br>        .analyze();</p>\n\n<p>console.log(\'Violations:\', results.violations.length);<br>    results.violations.forEach(v =&gt; {<br>        console.log(<code>- ${v.id}: ${v.description}</code>);<br>    });</p>\n\n<p>await browser.close();<br>}<br></code></pre></p>\n\n<h3>Lighthouse CI</h3>\n\n<pre><code># GitHub Actions<ol><li>name: Lighthouse</li>\n</ol>  uses: treosh/lighthouse-ci-action@v10\n  with:\n    urls: https://example.com\n    budgetPath: ./lighthouserc.json\n    uploadArtifacts: true\n</code></pre>\n\n<pre><code>// lighthouserc.json\n{\n  \"ci\": {\n    \"collect\": {\n      \"settings\": {\n        \"staticDistDir\": \"./dist\"\n      }\n    },\n    \"assert\": {\n      \"assertions\": {\n        \"categories:accessibility\": [\"error\", {\"minScore\": 0.9}],\n        \"first-contentful-paint\": [\"warn\", { \"maxNumericValue\": 2000 }],\n        \"uses-passive-event-listeners\": \"off\"\n      }\n    }\n  }\n}\n</code></pre>\n\n<hr>\n<h2>Testes Manuais</h2>\n\n<h3>Checklist de Teclado</h3>\n\n<pre><code><h2>Navegação por Teclado</h2>\n\n<h3>Essential</h3><ol><li>[ ] Tab avança logicamente entre elementos</li>\n<li>[ ] Shift+Tab retorna ao elemento anterior</li>\n<li>[ ] Enter ativa botões e links</li>\n<li>[ ] Space ativa botões e checkboxes</li>\n<li>[ ] Escape fecha modais e dropdowns</li>\n<li>[ ] Setas navegam em menus</li>\n</ol>\n<h3>Skip Links</h3><ol><li>[ ] Link \"Skip to main content\" existe</li>\n<li>[ ] Link é visível quando focado</li>\n<li>[ ] Link funciona corretamente</li>\n</ol>\n<h3>Focus Indicators</h3><ol><li>[ ] Focus é sempre visível</li>\n<li>[ ] Estilo de focus não é apenas cor</li>\n<li>[ ] Focus não desaparece em nenhum elemento</li>\n</ol></code></pre>\n\n<h3>Checklist de Screen Reader</h3>\n\n<pre><code><h2>Screen Reader Testing</h2>\n\n<h3>Imagens</h3><ol><li>[ ] Alt text em todas imagens informativas</li>\n<li>[ ] Alt text é descritivo e útil</li>\n<li>[ ] Imagens decorativas têm alt=\"\"</li>\n<li>[ ] SVG complexos têm descriptions</li>\n</ol>\n<h3>Formulários</h3><ol><li>[ ] Labels associados corretamente (for/id)</li>\n<li>[ ] Placeholder não substitui label</li>\n<li>[ ] Erros anunciados</li>\n<li>[ ] Required fields marcados</li>\n</ol>\n<h3>Heading Structure</h3><ol><li>[ ] h1 é único na página</li>\n<li>[ ] Hierarquia lógica (h1 &gt; h2 &gt; h3)</li>\n<li>[ ] Sem saltos (h1 &gt; h3, pulando h2)</li>\n<li>[ ] Headings não são só visuais</li>\n</ol>\n<h3>Links e Botões</h3><ol><li>[ ] Links fazem sentido fora de contexto</li>\n<li>[ ] Botões descrevem ação</li>\n<li>[ ] Links novos/abrem em nova aba avisados</li></ol></ul>\n</code></pre>\n\n<hr>\n<h2>Implementando Acessibilidade</h2>\n\n<h3>ARIA Basics</h3>\n\n<pre><code><!-- Botão com acessibilidade -->\n<button aria-label=\"Fechar modal\" aria-expanded=\"false\" aria-controls=\"modal-content\">\n  <span aria-hidden=\"true\">×</span>\n</button>\n\n<p><!-- Modal com ARIA --><br>&lt;div <br>  role=\"dialog\" <br>  aria-labelledby=\"modal-title\"<br>  aria-describedby=\"modal-desc\"<br>  aria-modal=\"true\"<br>&gt;<br>  <h2 id=\"modal-title\">Confirmação</h2><br>  <p id=\"modal-desc\">Tem certeza que deseja excluir?</p><br>  <button>Cancelar</button><br>  <button>Excluir</button><br></div></p>\n\n<p><!-- Live region para updates --><br><div aria-live=\"polite\"><br>  <!-- Conteúdo atualizado dinamicamente --><br></div></p>\n\n<p><!-- Error message --><br><label for=\"email\">Email</label><br><br><span id=\"email-error\" class=\"error\" role=\"alert\"><br>  Email inválido<br></span><br></code></pre></p>\n\n<h3>CSS para Acessibilidade</h3>\n\n<pre><code>/<em> Focus visível </em>/\n*:focus {\n  outline: 3px solid #005fcc;\n  outline-offset: 2px;\n}\n\n<p>/<em> Esconde visualmente mas mantém para screen readers </em>/<br>.sr-only {<br>  position: absolute;<br>  width: 1px;<br>  height: 1px;<br>  padding: 0;<br>  margin: -1px;<br>  overflow: hidden;<br>  clip: rect(0, 0, 0, 0);<br>  white-space: nowrap;<br>  border: 0;<br>}</p>\n\n<p>/<em> Skip link </em>/<br>.skip-link {<br>  position: absolute;<br>  top: -40px;<br>  left: 0;<br>  background: #000;<br>  color: #fff;<br>  padding: 8px;<br>  z-index: 100;<br>}</p>\n\n<p>.skip-link:focus {<br>  top: 0;<br>}</p>\n\n<p>/<em> Contraste adequado </em>/<br>.text-primary {<br>  color: #1a1a1a; /<em> Não use #777777 com fundo branco </em>/<br>}</p>\n\n<p>/<em> Touch target mínimo </em>/<br>button, a, input[type=\"checkbox\"] {<br>  min-height: 44px;<br>  min-width: 44px;<br>}<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Acessibilidade é responsabilidade de todos. As chaves são:<br><ol><li><strong>Testar cedo</strong> - A11y mais barato no início</li><br><li><strong>Automatizar</strong> - axe-core, Lighthouse</li><br><li><strong>Testar manualmente</strong> - Teclado, screen reader</li><br><li><strong>Seguir WCAG</strong> - 2.1 AA como mínimo</li><br><li><strong>Incluir na cultura</strong> - A11y não é \"extra\"</li></ol></p>', 'Testes de Acessibilidade: WCAG e Inclusão Digital', '', 'inherit', 'closed', 'closed', '', '210-revision-v1', '', '', '2026-07-06 22:25:40', '2026-07-07 01:25:40', '', '210', 'http://localhost:8082/ideiasti/?p=438', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('439', '0', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '<p><strong>Meta Description:</strong> Aprenda Cucumber e Gherkin: escrever cenários BDD, step definitions, hooks, tags e como implementar desenvolvimento guiado por comportamento.</p>\n\n<hr>\n<h2>Cucumber Framework</h2>\n\n<p>Cucumber é uma ferramenta que permite escrever testes em linguagem natural (Gherkin) que são executados automaticamente.</p>\n\n<h3>Instalação</h3>\n\n<pre><code># Ruby\ngem install cucumber\n\n<p># Java (Maven)<br><br>    io.cucumber<br>    cucumber-java<br>    7.14.0<br></p>\n\n<p># Python<br>pip install behave</p>\n\n<p># JavaScript<br>npm install @cucumber/cucumber<br></code></pre></p>\n\n<hr>\n<h2>Gherkin - Linguagem</h2>\n\n<h3>Estrutura Básica</h3>\n\n<pre><code>Funcionalidade: Login de Usuário\n  Como um usuário registrado\n  Quero fazer login no sistema\n  Para acessar minha conta\n\n<p>Cenário: Login com credenciais válidas<br>    Dado que estou na página de login<br>    Quando preencho o campo email com \"usuario@exemplo.com\"<br>    E preencho o campo senha com \"senha123\"<br>    E clico no botão \"Entrar\"<br>    Então sou redirecionado para o dashboard<br>    E vejo a mensagem \"Bem-vindo, usuário\"</p>\n\n<p>Cenário: Login com credenciais inválidas<br>    Dado que estou na página de login<br>    Quando preencho o campo email com \"invalido@exemplo.com\"<br>    E preencho o campo senha com \"senhaerrada\"<br>    E clico no botão \"Entrar\"<br>    Então vejo a mensagem de erro \"Credenciais inválidas\"<br>    E permaneço na página de login<br></code></pre></p>\n\n<h3>Keywords</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Keyword</th><th>Usage</th></tr>\n<tr><td>Funcionalidade</td><td>Nome do recurso</td></tr>\n<tr><td>Cenário</td><td>Caso de uso</td></tr>\n<tr><td>Dado</td><td>Pré-condição</td></tr>\n<tr><td>Quando</td><td>Ação</td></tr>\n<tr><td>Então</td><td>Resultado esperado</td></tr>\n<tr><td>E</td><td>Adiciona condição</td></tr>\n<tr><td>Mas</td><td>Condição negativa</td></tr>\n<tr><td>Esquema do Cenário</td><td>Cenário com parâmetros</td></tr>\n<tr><td>Exemplos</td><td>Tabela de dados</td></tr>\n</table></figure>\n\n<hr>\n<h2>Step Definitions</h2>\n\n<h3>Python (Behave)</h3>\n\n<pre><code># features/steps/login_steps.py\nfrom behave import given, when, then\nfrom selenium.webdriver.common.by import By\n\n<p>@given(\'estou na página de login\')<br>def step_impl(context):<br>    context.browser.get(\'https://exemplo.com/login\')</p>\n\n<p>@when(\'preencho o campo email com \"{email}\"\')<br>def step_impl(context, email):<br>    element = context.browser.find_element(By.ID, \'email\')<br>    element.send_keys(email)</p>\n\n<p>@when(\'preencho o campo senha com \"{senha}\"\')<br>def step_impl(context, senha):<br>    element = context.browser.find_element(By.ID, \'password\')<br>    element.send_keys(senha)</p>\n\n<p>@when(\'clico no botão \"{texto}\"\')<br>def step_impl(context, texto):<br>    buttons = context.browser.find_elements(By.TAG_NAME, \'button\')<br>    for button in buttons:<br>        if button.text == texto:<br>            button.click()<br>            break</p>\n\n<p>@then(\'sou redirecionado para o dashboard\')<br>def step_impl(context):<br>    assert \'dashboard\' in context.browser.current_url</p>\n\n<p>@then(\'vejo a mensagem \"{texto}\"\')<br>def step_impl(context, texto):<br>    assert texto in context.browser.page_source<br></code></pre></p>\n\n<h3>Java (Cucumber)</h3>\n\n<pre><code>// src/test/java/steps/LoginSteps.java\npackage steps;\n\n<p>import io.cucumber.java.pt.*;<br>import org.openqa.selenium.By;<br>import static org.junit.Assert.*;</p>\n\n<p>public class LoginSteps {</p>\n\n<p>WebDriver driver = Hooks.driver;</p>\n\n<p>@Dado(\"estou na página de login\")<br>    public void estouNaPaginaDeLogin() {<br>        driver.get(\"https://exemplo.com/login\");<br>    }</p>\n\n<p>@Quando(\"preencho o campo email com {string}\")<br>    public void preenchoEmail(String email) {<br>        driver.findElement(By.id(\"email\")).sendKeys(email);<br>    }</p>\n\n<p>@Quando(\"preencho o campo senha com {string}\")<br>    public void preenchoSenha(String senha) {<br>        driver.findElement(By.id(\"password\")).sendKeys(senha);<br>    }</p>\n\n<p>@Quando(\"clico no botão {string}\")<br>    public void clicoNoBotao(String texto) {<br>        driver.findElement(By.xpath(\"//button[text()=\'\" + texto + \"\']\")).click();<br>    }</p>\n\n<p>@Então(\"sou redirecionado para o dashboard\")<br>    public void souRedirecionado() {<br>        assertTrue(driver.getCurrentUrl().contains(\"dashboard\"));<br>    }</p>\n\n<p>@Então(\"vejo a mensagem {string}\")<br>    public void vejoMensagem(String mensagem) {<br>        assertTrue(driver.getPageSource().contains(mensagem));<br>    }<br>}<br></code></pre></p>\n\n<hr>\n<h2>Data Tables</h2>\n\n<pre><code>Funcionalidade: Carrinho de Compras\n\n<p>Cenário: Adicionar múltiplos produtos ao carrinho<br>    Quando adiciono os seguintes produtos ao carrinho:<br>      | Produto    | Quantidade | Preço  |<br>      | Camiseta  | 2         | R$49,90|<br>      | Calça     | 1         | R$89,90|<br>      | Tênis     | 1         | R$199,90|<br>    Então o total do carrinho deve ser R$389,70<br></code></pre></p>\n\n<pre><code># Step with table\n@when(\'adiciono os seguintes produtos ao carrinho\')\ndef step_impl(context):\n    total = Decimal(\'0\')\n    for row in context.table:\n        product = row[\'Produto\']\n        quantity = int(row[\'Quantidade\'])\n        price = Decimal(row[\'Preço\'].replace(\'R$\', \'\').replace(\',\', \'.\'))\n\n<p># Add to cart logic<br>        add_to_cart(product, quantity)</p>\n\n<p>total += price * quantity</p>\n\n<p>context.expected_total = total<br></code></pre></p>\n\n<hr>\n<h2>Hooks</h2>\n\n<pre><code># features/environment.py\nfrom behave import *\nfrom selenium import webdriver\n\n<p>def before_all(context):<br>    \"\"\"Executa antes de tudo\"\"\"<br>    context.browser = webdriver.Chrome()</p>\n\n<p>def after_all(context):<br>    \"\"\"Executa após tudo\"\"\"<br>    context.browser.quit()</p>\n\n<p>def before_scenario(context, scenario):<br>    \"\"\"Executa antes de cada cenário\"\"\"<br>    context.browser.delete_all_cookies()</p>\n\n<p>def after_scenario(context, scenario):<br>    \"\"\"Executa após cada cenário\"\"\"<br>    if scenario.status == \'failed\':<br>        # Take screenshot<br>        context.browser.save_screenshot(f\'failed_{scenario.name}.png\')</p>\n\n<p>def before_step(context, step):<br>    \"\"\"Executa antes de cada step\"\"\"<br>    pass</p>\n\n<p>def after_step(context, step):<br>    \"\"\"Executa após cada step\"\"\"<br>    if step.status == \'failed\':<br>        print(f\"Step failed: {step.name}\")<br></code></pre></p>\n\n<hr>\n<h2>Tags</h2>\n\n<pre><code>@smoke @login\nFuncionalidade: Login\n\n<p>@critical<br>  Cenário: Login com sucesso<br>    ...</p>\n\n<p>Cenário: Login com falha<br>    ...</p>\n\n<p>@regression<br>Funcionalidade: Carrinho<br>  ...<br></code></pre></p>\n\n<pre><code># Executar apenas com tag\nbehave --tags=@smoke\nbehave --tags=\"not @skip\"\nbehave --tags=\"@smoke,@login\"  # OR\nbehave --tags=\"@smoke+@critical\"  # AND\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Cucumber/Gherkin facilita comunicação entre equipes. As chaves são:<br><ol><li><strong>Linguagem de negócio</strong> - Todos entendem</li><br><li><strong>Step definitions</strong> - Conecta Gherkin a código</li><br><li><strong>Hooks</strong> - Setup/teardown</li><br><li><strong>Tags</strong> - Selecionar cenários</li><br><li><strong>Data tables</strong> - Dados complexos</li></ol></p>', 'Cucumber e Gherkin: Automação BDD com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '212-revision-v1', '', '', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '', '212', 'http://localhost:8082/ideiasti/?p=439', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('440', '0', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '<p><strong>Meta Description:</strong> Aprenda testes de contrato: Pact, contratos entre microservices, consumer-driven testing e como evitar breaking changes.</p>\n\n<hr>\n<h2>O Que São Testes de Contrato?</h2>\n\n<p>Testes de contrato verificam que a interface entre serviços (API) está funcionando conforme acordado. Cada serviço define o que espera e o que fornece.</p>\n\n<h3>Problema</h3>\n\n<pre><code>Microservice A (Consumer)\n        ↓\n    API REST\n        ↓\nMicroservice B (Provider)\n\n<p>Se B muda API sem avisar A → BUG!<br></code></pre></p>\n\n<h3>Solução: Contract Testing</h3>\n\n<pre><code>┌─────────────┐                    ┌─────────────┐\n│  Consumer   │    Contract       │  Provider   │\n│   Test      │ ←──────────────→ │   Test      │\n└─────────────┘                    └─────────────┘\n     ↓                                  ↓\n[Pact Broker] ←──────────────────────────\n</code></pre>\n\n<hr>\n<h2>Pact - Framework de Contract Testing</h2>\n\n<h3>Setup</h3>\n\n<pre><code># Ruby\ngem install pact\n\n<p># Python<br>pip install pact-python</p>\n\n<p># Java<br><br>    au.com.dius.pact<br>    jvm-consumer<br>    4.6.4<br><br></code></pre></p>\n\n<h3>Consumer Test (Python)</h3>\n\n<pre><code># test_consumer.py\nimport pact\n\n<p># Provider URL<br>PACT_MOCK_PROVIDER_URL = \"http://localhost:1234\"</p>\n\n<p># Define consumer and provider<br>consumer = pact.Consumer(\'OrderService\')<br>provider = pact.Provider(\'ProductService\')</p>\n\n<p># Create pact<br>order_service_pact = consumer.has_pact_with(<br>    provider,<br>    pact_dir=\'./pacts\',<br>    log_dir=\'./logs\'<br>)</p>\n\n<p># Test<br>order_service_pact.given(<br>    \'product with id 1 exists\'<br>).upon_receiving(<br>    \'a request for product details\'<br>).with_request(<br>    method=\'GET\',<br>    path=\'/products/1\'<br>).will_respond_with(<br>    status=200,<br>    headers={\'Content-Type\': \'application/json\'},<br>    body={<br>        \'id\': 1,<br>        \'name\': pact.Match.something_like(\'Test Product\'),<br>        \'price\': pact.Match.decimal(99.99),<br>        \'in_stock\': pact.Match.boolean(True)<br>    }<br>)</p>\n\n<p># Verify<br>with order_service_pact:<br>    result = requests.get(f\'{PACT_MOCK_PROVIDER_URL}/products/1\')<br>    assert result.status_code == 200<br>    assert result.json()[\'name\'] == \'Test Product\'<br></code></pre></p>\n\n<h3>Provider Test (Python)</h3>\n\n<pre><code># test_provider.py\nimport pact\nfrom pact import Verifier\n\n<p># Verify against provider<br>verifier = Verifier(<br>    provider=\'ProductService\',<br>    provider_base_url=\'http://localhost:8000\'<br>)</p>\n\n<p># Set up Pact file to verify<br>verifier.provider_states(<br>    \'http://localhost:8000\',<br>    set_up=lambda state: create_test_product() if state == \'product with id 1 exists\' else None,<br>    tear_down=lambda state: delete_test_product() if state == \'product with id 1 exists\' else None<br>)</p>\n\n<p># Verify contracts<br>result = verifier.verify_pacts(<br>    \'./pacts/order_service-product_service.json\',<br>    verbose=True<br>)</p>\n\n<p>assert result == 0, f\"Pact verification failed: {result}\"<br></code></pre></p>\n\n<hr>\n<h2>Pact Broker</h2>\n\n<pre><code># Publish contract\npact-broker publish ./pacts \n  --consumer-app-version=1.0.0 \n  --broker-base-url=https://pact-broker.example.com \n  --broker-token=YOUR_TOKEN\n\n<p># Can I Deploy?<br>pact-broker can-i-deploy <br>  --pacticipant=OrderService <br>  --version=1.0.0 <br>  --to-environment=production<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Contract testing previne breaking changes. As chaves são:<br><ol><li><strong>Consumer-driven</strong> - Cada cliente define necessidades</li><br><li><strong>Pact broker</strong> - Centraliza contratos</li><br><li><strong>Verificação contínua</strong> - CI valida mudanças</li><br><li><strong>Can I Deploy</strong> - Bloca deploys incompatíveis</li></ol></p>', 'Testes de Contrato: Consumer-Driven Contracts', '', 'inherit', 'closed', 'closed', '', '213-revision-v1', '', '', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '', '213', 'http://localhost:8082/ideiasti/?p=440', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('441', '0', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '<p><strong>Meta Description:</strong> Aprenda Testcontainers: containers Docker para testes, databases, message brokers, como criar ambientes reprodutíveis.</p>\n\n<hr>\n<h2>O Que São Testcontainers?</h2>\n\n<p>Testcontainers é uma biblioteca que facilita o uso de containers Docker para testes automatizados. Cada teste consegue seu próprio container isolado.</p>\n\n<h3>Benefícios</h3>\n\n<ul><li><strong>Isolamento</strong> - Cada teste tem seu ambiente</li><ol><li><strong>Reprodutibilidade</strong> - Mesmo ambiente sempre</li>\n<li><strong>Realismo</strong> - Testa contra serviços reais</li>\n<li><strong>Cleanup automático</strong> - Containers são removidos</li></ol></ul>\n\n<hr>\n<h2>Setup</h2>\n\n<pre><code><!-- Java/Maven -->\n\n    org.testcontainers\n    testcontainers\n    1.19.3\n\n\n<p><!-- Python --><br>pip install testcontainers</p>\n\n<p><!-- Go --><br>go get github.com/testcontainers/testcontainers-go</p>\n\n<p><!-- Node.js --><br>npm install @testcontainers<br></code></pre></p>\n\n<hr>\n<h2>Exemplos</h2>\n\n<h3>PostgreSQL (Python)</h3>\n\n<pre><code># test_database.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\nimport psycopg2\n\n<p>@pytest.fixture(scope=\"module\")<br>def postgres():<br>    with PostgresContainer(\"postgres:15-alpine\") as pg:<br>        yield pg</p>\n\n<p>def test_database_connection(postgres):<br>    # Get connection string<br>    connection_url = postgres.get_connection_url()</p>\n\n<p># Connect<br>    conn = psycopg2.connect(connection_url)<br>    cursor = conn.cursor()</p>\n\n<p># Test<br>    cursor.execute(\"SELECT version();\")<br>    version = cursor.fetchone()</p>\n\n<p>assert \"PostgreSQL\" in version[0]</p>\n\n<p>cursor.close()<br>    conn.close()</p>\n\n<p>def test_create_table(postgres):<br>    conn = psycopg2.connect(postgres.get_connection_url())<br>    cursor = conn.cursor()</p>\n\n<p>cursor.execute(\"\"\"<br>        CREATE TABLE users (<br>            id SERIAL PRIMARY KEY,<br>            name VARCHAR(100) NOT NULL,<br>            email VARCHAR(100) UNIQUE NOT NULL<br>        )<br>    \"\"\")<br>    conn.commit()</p>\n\n<p># Insert test data<br>    cursor.execute(\"\"\"<br>        INSERT INTO users (name, email) <br>        VALUES (\'João\', \'joao@example.com\')<br>        RETURNING id<br>    \"\"\")<br>    user_id = cursor.fetchone()[0]</p>\n\n<p># Verify<br>    cursor.execute(\"SELECT * FROM users WHERE id = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s\", (user_id,))<br>    user = cursor.fetchone()</p>\n\n<p>assert user[1] == \"João\"</p>\n\n<p>cursor.close()<br>    conn.close()<br></code></pre></p>\n\n<h3>Redis (Python)</h3>\n\n<pre><code># test_redis.py\nimport pytest\nfrom testcontainers.redis import RedisContainer\nimport redis\n\n<p>@pytest.fixture<br>def redis_container():<br>    with RedisContainer(\"redis:7-alpine\") as redis:<br>        yield redis</p>\n\n<p>def test_redis_basic_operations(redis_container):<br>    client = redis.Redis.from_url(redis_container.get_connection_url())</p>\n\n<p># Set and get<br>    client.set(\"key\", \"value\")<br>    assert client.get(\"key\") == b\"value\"</p>\n\n<p># Expire<br>    client.setex(\"temp\", 60, \"temp_value\")<br>    assert client.get(\"temp\") == b\"temp_value\"</p>\n\n<p># List<br>    client.lpush(\"mylist\", \"a\", \"b\", \"c\")<br>    assert client.lrange(\"mylist\", 0, -1) == [b\'c\', b\'b\', b\'a\']</p>\n\n<p>client.flushall()</p>\n\n<p>def test_redis_pubsub(redis_container):<br>    client = redis.Redis.from_url(redis_container.get_connection_url())</p>\n\n<p># Pub/Sub pattern<br>    pubsub = client.pubsub()<br>    pubsub.subscribe(\"test-channel\")</p>\n\n<p># Give time for subscription<br>    import time<br>    time.sleep(0.5)</p>\n\n<p># Publish message<br>    client.publish(\"test-channel\", \"Hello, World!\")</p>\n\n<p># Receive message<br>    message = pubsub.get_message()<br>    assert message[\"type\"] == \"message\"<br>    assert message[\"data\"] == b\"Hello, World!\"</p>\n\n<p>pubsub.close()<br></code></pre></p>\n\n<h3>MongoDB (Java)</h3>\n\n<pre><code>// MongoDBTest.java\nimport org.testcontainers.containers.MongoDBContainer;\nimport org.junit.jupiter.api.*;\n\n<p>import com.mongodb.client.MongoClients;<br>import com.mongodb.client.MongoCollection;<br>import com.mongodb.client.MongoDatabase;</p>\n\n<p>import static org.junit.jupiter.api.Assertions.*;</p>\n\n<p>@TestInstance(TestInstance.Lifecycle.PER_CLASS)<br>public class MongoDBTest {</p>\n\n<p>MongoDBContainer mongo = new MongoDBContainer(\"mongo:7\");</p>\n\n<p>@BeforeAll<br>    void startContainer() {<br>        mongo.start();<br>    }</p>\n\n<p>@AfterAll<br>    void stopContainer() {<br>        mongo.stop();<br>    }</p>\n\n<p>@Test<br>    void testMongoConnection() {<br>        String connectionString = mongo.getReplicaSetUrl();</p>\n\n<p>try (var client = MongoClients.create(connectionString)) {<br>            MongoDatabase database = client.getDatabase(\"testdb\");<br>            MongoCollection collection = database.getCollection(\"users\");</p>\n\n<p>// Insert document<br>            org.bson.Document user = new org.bson.Document()<br>                .append(\"name\", \"João Silva\")<br>                .append(\"email\", \"joao@example.com\");</p>\n\n<p>collection.insertOne(user);</p>\n\n<p>// Find document<br>            org.bson.Document found = collection.find().first();</p>\n\n<p>assertNotNull(found);<br>            assertEquals(\"João Silva\", found.getString(\"name\"));<br>        }<br>    }<br>}<br></code></pre></p>\n\n<h3>Docker Compose (Python)</h3>\n\n<pre><code># test_integration.py\nimport pytest\nfrom testcontainers.compose import DockerCompose\n\n<p>@pytest.fixture(scope=\"module\")<br>def compose():<br>    with DockerCompose(\"/path/to/project\") as compose:<br>        compose.start()<br>        yield compose<br>        compose.stop()</p>\n\n<p>def test_all_services_running(compose):<br>    # Check if services are healthy<br>    exit_code, output = compose.exec(\"api\", \"curl -f http://localhost:8080/health\")<br>    assert exit_code == 0</p>\n\n<p>exit_code, output = compose.exec(\"db\", \"pg_isready\")<br>    assert exit_code == 0</p>\n\n<p>def test_api_with_database(compose):<br>    # API should be able to connect to database<br>    exit_code, output = compose.exec(<br>        \"api\", <br>        \"python -c \'import psycopg2; print(\"OK\")\'\"<br>    )<br>    assert exit_code == 0<br>    assert \"OK\" in output.decode()<br></code></pre></p>\n\n<hr>\n<h2>Multiple Containers</h2>\n\n<pre><code># test_full_stack.py\nimport pytest\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\nfrom testcontainers.kafka import KafkaContainer\n\n<p>@pytest.fixture(scope=\"module\")<br>def test_environment():<br>    # Start all containers<br>    postgres = PostgresContainer(\"postgres:15\")<br>    redis = RedisContainer(\"redis:7\")<br>    kafka = KafkaContainer()</p>\n\n<p># Start them<br>    pg_url = postgres.start()<br>    redis_url = redis.start()<br>    kafka_bootstrap = kafka.start()</p>\n\n<p>yield {<br>        \'postgres\': pg_url,<br>        \'redis\': redis_url,<br>        \'kafka\': kafka_bootstrap<br>    }</p>\n\n<p># Cleanup<br>    kafka.stop()<br>    redis.stop()<br>    postgres.stop()<br></code></pre></p>\n\n<hr>\n<h2>CI Integration</h2>\n\n<pre><code># GitHub Actions\nname: Tests with Testcontainers\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  test:<br>    runs-on: ubuntu-latest<br>    services:<br>      docker:<br>        image: docker:24.0.5-cli<br>        options: --privileged<br>    steps:<br>      - uses: actions/checkout@v4</p>\n\n<p>- name: Set up Docker Buildx<br>        uses: docker/setup-buildx-action@v3</p>\n\n<p>- name: Run tests<br>        run: |<br>          docker network create testnet || true<br>          docker compose -f docker-compose.test.yml up -d<br>          docker compose -f docker-compose.test.yml run test<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testcontainers facilita testes com dependências reais. As chaves são:<br><ol><li><strong>Isolamento</strong> - Cada teste com seu ambiente</li><br><li><strong>Realismo</strong> - Testa contra serviços reais</li><br><li><strong>Cleanup</strong> - Containers são removidos após testes</li><br><li><strong>CI</strong> - Funciona em pipelines</li><br><li><strong>Performance</strong> - Mais lento que mocks, mais confiável</li></ol></p>', 'Testcontainers: Ambientes de Teste Isolados com Docker', '', 'inherit', 'closed', 'closed', '', '214-revision-v1', '', '', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '', '214', 'http://localhost:8082/ideiasti/?p=441', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('442', '0', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '<p><strong>Meta Description:</strong> Aprenda security testing: OWASP Top 10, SAST, DAST, penet testers manuais, como integrar segurança ao pipeline de QA.</p>\n\n<hr>\n<h2>Tipos de Security Testing</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo</th><th>Descrição</th><th>Automação</th></tr>\n<tr><td><strong>SAST</strong></td><td>Análise estática de código</td><td>✅ Alta</td></tr>\n<tr><td><strong>DAST</strong></td><td>Teste dinâmico de aplicação</td><td>✅ Alta</td></tr>\n<tr><td><strong>SCA</strong></td><td>Análise de composição de software</td><td>✅ Alta</td></tr>\n<tr><td><strong>IAST</strong></td><td>Teste interativo</td><td>⚠️ Média</td></tr>\n<tr><td><strong>Pentest</strong></td><td>Teste manual de penetração</td><td>❌ Baixa</td></tr>\n</table></figure>\n\n<hr>\n<h2>OWASP Top 10 (2021)</h2>\n\n<h3>A01 - Broken Access Control</h3>\n\n<pre><code># VULNERÁVEL\n@app.route(\'/pedido/\')\ndef get_pedido(id):\n    # Não verifica ownership!\n    return Pedido.query.get(id)\n\n<p># SEGURO<br>@app.route(\'/pedido/\')<br>@login_required<br>def get_pedido(id):<br>    pedido = Pedido.query.filter_by(<br>        id=id, <br>        usuario_id=current_user.id<br>    ).first_or_404()<br>    return pedido<br></code></pre></p>\n\n<h3>A02 - Cryptographic Failures</h3>\n\n<pre><code># VULNERÁVEL\nsenha = \"senha123\"  # Texto puro!\n\n<p># SEGURO<br>from cryptography.fernet import Fernet</p>\n\n<p>key = Fernet.generate_key()  # Armazenar em vault!<br>cipher = Fernet(key)<br>senha_hash = bcrypt.hashpw(senha.encode(), bcrypt.gensalt())<br></code></pre></p>\n\n<h3>A03 - Injection</h3>\n\n<pre><code>-- VULNERÁVEL (SQL Injection)\nquery = f\"SELECT * FROM users WHERE email = \'{email}\'\"\n\n<p>-- SEGURO (Parameterized)<br>cursor.execute(\"SELECT * FROM users WHERE email = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s\", (email,))<br></code></pre></p>\n\n<hr>\n<h2>SAST - Static Application Security Testing</h2>\n\n<h3>SonarQube</h3>\n\n<pre><code># GitHub Actions\n<ul><li>name: SonarCloud Scan</li>\n  uses: SonarSource/sonarcloud-github-action@master\n  env:\n    SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}\n\n<p># sonar-project.properties<br>sonar.projectKey=myproject<br>sonar.sources=src<br>sonar.tests=tests<br>sonar.python.coverage.reportPaths=coverage.xml<br>sonar.security Risks=high,critical<br></code></pre></p>\n\n<h3>Semgrep</h3>\n\n<pre><code># Install\npip install semgrep\n\n<p># Run<br>semgrep --config=auto .</p>\n\n<p># Custom rule<br>rules:<br>  - id: hardcoded-secret<br>    pattern: $SECRET = \"$VALUE\"<br>    message: Hardcoded secret found<br>    severity: ERROR<br>    languages: [python]<br></code></pre></p>\n\n<hr>\n<h2>DAST - Dynamic Application Security Testing</h2>\n\n<h3>OWASP ZAP</h3>\n\n<pre><code># CLI scan\ndocker run -t owasp/zap2docker-stable \n  zap-baseline.py \n  -t https://example.com \n  -J zap-report.json\n\n<p># GitHub Actions<ol><li>name: OWASP ZAP Scan</li><br></ol>  uses: zaproxy/action-baseline@v0.9.0<br>  with:<br>    target: \'https://staging.example.com\'<br>    rules_rules_name: \'api-scan\'<br></code></pre></p>\n\n<hr>\n<h2>SCA - Software Composition Analysis</h2>\n\n<h3>Snyk</h3>\n\n<pre><code># Install\nnpm install -g snyk\n\n<p># Test<br>snyk test</p>\n\n<p># Monitor<br>snyk monitor</p>\n\n<p># GitHub Action<ol><li>name: Snyk Security Scan</li></ol></ul><br>  uses: snyk/actions/node@master<br>  env:<br>    SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Security testing deve ser integrado ao pipeline. As chaves são:<br><ol><li><strong>Automação</strong> - SAST, DAST, SCA no CI/CD</li><br><li><strong>OWASP</strong> - Conheça as vulnerabilidades principais</li><br><li><strong>Pentests</strong> - Regular, para complementar automação</li><br><li><strong>Remediação</strong> - Não é só detectar, é corrigir</li><br><li><strong>Cultura</strong> - Segurança é responsabilidade de todos</li></ol></p>', 'Security Testing: OWASP, Penetration Testing e SAST/DAST', '', 'inherit', 'closed', 'closed', '', '215-revision-v1', '', '', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '', '215', 'http://localhost:8082/ideiasti/?p=442', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('443', '0', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '<p><strong>Meta Description:</strong> Aprenda testes end-to-end: Playwright, Cypress, Selenium, como simular jornadas completas do usuário e garantir que tudo funciona.</p>\n\n<hr>\n<h2>O Que São Testes E2E?</h2>\n\n<p>Testes E2E verificam que o sistema completo funciona, simulando jornadas reais do usuário do início ao fim.</p>\n\n<h3>Quando Usar</h3>\n\n<ul><li>✅ Fluxos críticos (login, checkout)</li><ol><li>✅ Antes de releases</li>\n<li>✅ Smoke tests</li>\n<li>❌ Não para tudo (são lentos)</li>\n</ol>\n<hr>\n<h2>Playwright</h2>\n\n<h3>Setup</h3>\n\n<pre><code>npm install -D @playwright/test\nnpx playwright install\n</code></pre>\n\n<h3>Exemplo</h3>\n\n<pre><code>// tests/e2e/checkout.spec.ts\nimport { test, expect } from \'@playwright/test\';\n\n<p>test.describe(\'Checkout Flow\', () =&gt; {<br>  test.beforeEach(async ({ page }) =&gt; {<br>    await page.goto(\'/\');<br>  });</p>\n\n<p>test(\'complete purchase flow\', async ({ page }) =&gt; {<br>    // 1. Login<br>    await page.click(\'text=Login\');<br>    await page.fill(\'[data-testid=email]\', \'user@test.com\');<br>    await page.fill(\'[data-testid=password]\', \'password123\');<br>    await page.click(\'text=Entrar\');</p>\n\n<p>// 2. Browse products<br>    await page.click(\'text=Produtos\');<br>    await page.click(\'text=Camiseta Azul\');</p>\n\n<p>// 3. Add to cart<br>    await page.click(\'text=Adicionar ao Carrinho\');<br>    await expect(page.locator(\'.cart-badge\')).toHaveText(\'1\');</p>\n\n<p>// 4. Checkout<br>    await page.click(\'text=Finalizar Compra\');<br>    await page.fill(\'[data-testid=address]\', \'Rua Teste, 123\');<br>    await page.click(\'text=Confirmar Pedido\');</p>\n\n<p>// 5. Verify<br>    await expect(page.locator(\'.success-message\')).toBeVisible();<br>    await expect(page.locator(\'.order-id\')).toBeVisible();<br>  });<br>});<br></code></pre></p>\n\n<hr>\n<h2>Cypress</h2>\n\n<h3>Setup</h3>\n\n<pre><code>npm install -D cypress\nnpx cypress open\n</code></pre>\n\n<h3>Exemplo</h3>\n\n<pre><code>// cypress/integration/checkout.spec.js\ndescribe(\'Checkout Flow\', () =&gt; {\n  beforeEach(() =&gt; {\n    cy.visit(\'/\');\n  });\n\n<p>it(\'completes purchase successfully\', () =&gt; {<br>    // Login<br>    cy.get(\'[data-cy=login-button]\').click();<br>    cy.get(\'[data-cy=email-input]\').type(\'user@test.com\');<br>    cy.get(\'[data-cy=password-input]\').type(\'password123\');<br>    cy.get(\'[data-cy=submit-button]\').click();</p>\n\n<p>// Add product<br>    cy.contains(\'Camiseta\').click();<br>    cy.get(\'[data-cy=add-to-cart]\').click();</p>\n\n<p>// Checkout<br>    cy.get(\'[data-cy=cart-icon]\').click();<br>    cy.get(\'[data-cy=checkout-button]\').click();<br>    cy.get(\'[data-cy=address-input]\').type(\'Rua Teste, 123\');<br>    cy.get(\'[data-cy=confirm-button]\').click();</p>\n\n<p>// Verify<br>    cy.contains(\'Pedido realizado com sucesso\').should(\'be.visible\');<br>  });<br>});<br></code></pre></p>\n\n<hr>\n<h2>Page Objects</h2>\n\n<pre><code>// pages/LoginPage.ts\nexport class LoginPage {\n  constructor(private page: Page) {}\n\n<p>async goto() {<br>    await this.page.goto(\'/login\');<br>  }</p>\n\n<p>async login(email: string, password: string) {<br>    await this.page.fill(\'[data-testid=email]\', email);<br>    await this.page.fill(\'[data-testid=password]\', password);<br>    await this.page.click(\'text=Entrar\');<br>  }<br>}</p>\n\n<p>// tests/e2e/checkout.spec.ts<br>test(\'checkout\', async ({ page }) =&gt; {<br>  const loginPage = new LoginPage(page);<br>  const checkoutPage = new CheckoutPage(page);</p>\n\n<p>await loginPage.goto();<br>  await loginPage.login(\'user@test.com\', \'password123\');</p>\n\n<p>await checkoutPage.addProduct(\'Camiseta\');<br>  await checkoutPage.completeCheckout(\'Rua Teste\');</p>\n\n<p>await expect(checkoutPage.successMessage).toBeVisible();<br>});<br></code></pre></p>\n\n<hr>\n<h2>CI Integration</h2>\n\n<pre><code># GitHub Actions<ol><li>name: E2E Tests</li></ol></ul>\n  run: npx playwright test\n  env:\n    CYPRESS_baseUrl: https://staging.example.com\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes E2E simulam o usuário real. As chaves são:<br><ol><li><strong>Focar no crítico</strong> - Não tudo, só fluxos importantes</li><br><li><strong>Page Objects</strong> - DRY, fácil manutenção</li><br><li><strong>Dados de teste</strong> - Setup e teardown</li><br><li><strong>CI</strong> - Executar em pipeline</li><br><li><strong>Debugging</strong> - Screenshots, videos</li></ol></p>', 'Testes E2E: Guiando pelo Usuário', '', 'inherit', 'closed', 'closed', '', '216-revision-v1', '', '', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '', '216', 'http://localhost:8082/ideiasti/?p=443', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('444', '0', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '<p><strong>Meta Description:</strong> Aprenda a definir e acompanhar métricas de QA: cobertura, defeitos, velocity, DORA metrics, como criar dashboards efetivos.</p>\n\n<hr>\n<h2>Por Que Métricas?</h2>\n\n<ul><li><strong>Visibilidade</strong> - Entender estado do projeto</li><ol><li><strong>Tendências</strong> - Evolução ao longo do tempo</li>\n<li><strong>Decisões</strong> - Base para ações</li>\n<li><strong>Accountability</strong> - Responsabilidade clara</li></ol></ul>\n\n<hr>\n<h2>Métricas de Teste</h2>\n\n<h3>Cobertura</h3>\n\n<pre><code>def test_coverage_metrics():\n    return {\n        \"code_coverage\": {\n            \"line\": 85,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n            \"branch\": 78,\n            \"function\": 90\n        },\n        \"requirement_coverage\": 95,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n        \"risk_coverage\": 80,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n        \"test_efficiency\": {\n            \"bugs_found\": 15,\n            \"tests_executed\": 500,\n            \"ratio\": 0.03  # 3 bugs por 100 testes\n        }\n    }\n</code></pre>\n\n<h3>Execution Metrics</h3>\n\n<pre><code>def execution_metrics():\n    return {\n        \"total_tests\": 1000,\n        \"passed\": 950,\n        \"failed\": 30,\n        \"blocked\": 10,\n        \"skipped\": 10,\n        \"pass_rate\": 95,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n        \"flaky_rate\": 2,  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n        \"execution_time\": {\n            \"total_minutes\": 45,\n            \"average_per_test_seconds\": 2.7\n        }\n    }\n</code></pre>\n\n<hr>\n<h2>Métricas de Defeitos</h2>\n\n<pre><code>class DefectMetrics:\n    def __init__(self, data):\n        self.data = data\n\n<p>def defect_leakage(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos encontrados em produção\"\"\"<br>        prod = self.data[\'bugs_in_prod\']<br>        total = self.data[\'total_bugs\']<br>        return (prod / total) * 100 if total else 0</p>\n\n<p>def defect_density(self):<br>        \"\"\"Defeitos por 1000 linhas\"\"\"<br>        bugs = self.data[\'total_bugs\']<br>        loc = self.data[\'lines_of_code\']<br>        return (bugs / loc) * 1000</p>\n\n<p>def escape_rate(self):<br>        \"\"\"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos escapados para prod\"\"\"<br>        return self.defect_leakage()</p>\n\n<p>def mtbf(self):<br>        \"\"\"Mean Time Between Failures\"\"\"<br>        return self.data[\'uptime_hours\'] / self.data[\'incidents\']</p>\n\n<p>def mttr(self):<br>        \"\"\"Mean Time To Repair\"\"\"<br>        return sum(r[\'time_to_fix\'] for r in self.data[\'incidents\']) / len(self.data[\'incidents\'])<br></code></pre></p>\n\n<hr>\n<h2>DORA Metrics</h2>\n\n<h3>Deployment Frequency</h3>\n\n<pre><code>def deployment_frequency(days=30):\n    \"\"\"\n    Elite: On-demand ou múltiplas vezes ao dia\n    High: Entre diária e semanal\n    Medium: Entre semanal e mensal\n    Low: Mensal ou menos\n    \"\"\"\n    deploys = get_deployments(days)\n    return {\n        \"count\": len(deploys),\n        \"frequency\": len(deploys) / days,  # por dia\n        \"rating\": \"elite\" if len(deploys) &gt;= days * 2 else \"high\" if len(deploys) &gt;= days else \"medium\"\n    }\n</code></pre>\n\n<h3>Lead Time for Changes</h3>\n\n<pre><code>def lead_time(days=30):\n    \"\"\"\n    Elite:  1 mês\n    \"\"\"\n    changes = get_changes(days)\n    avg_hours = sum(c[\'lead_time_hours\'] for c in changes) / len(changes)\n    return {\n        \"average_hours\": avg_hours,\n        \"p95_hours\": calculate_percentile(changes, 95),\n        \"rating\": \"elite\" if avg_hours &lt; 1 else &quot;high&quot; if avg_hours &lt; 24 else &quot;medium&quot;\n    }\n</code></pre>\n\n<hr>\n<h2>Dashboard</h2>\n\n<pre><code># Grafana Dashboard - QA Metrics\n\n<p>panels:<br>  - title: \"Test Pass Rate\"<br>    type: gauge<br>    targets:<br>      - expr: \"sum(test_passed) / sum(test_total) * 100\"<br>    thresholds:<br>      - value: 90<br>        color: yellow<br>      - value: 95<br>        color: green</p>\n\n<p>- title: \"Code Coverage Trend\"<br>    type: timeseries<br>    targets:<br>      - expr: \"code_coverage_percent\"<br>        legendFormat: \"Coverage {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"</p>\n\n<p>- title: \"Defect Leakage\"<br>    type: stat<br>    targets:<br>      - expr: \"defects_in_prod / total_defects * 100\"<br>    unit: percent</p>\n\n<p>- title: \"DORA Metrics\"<br>    type: table<br>    targets:<br>      - expr: \"deployment_frequency\"<br>      - expr: \"lead_time_hours\"<br>      - expr: \"mttr_minutes\"<br>      - expr: \"change_failure_rate\"<br></code></pre></p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Métricas guiam melhoria. As chaves são:<br><ol><li><strong>Definir KPIs</strong> - Alinhados com objetivos</li><br><li><strong>Automatizar coleta</strong> - CI/CD integration</li><br><li><strong>Visualizar</strong> - Dashboards claros</li><br><li><strong>Analisar tendências</strong> - Não só snapshots</li><br><li><strong>Agir</strong> - Métricas sem ação não valem nada</li></ol></p>', 'Metrics de QA: KPIs e Dashboards para Equipes de Qualidade', '', 'inherit', 'closed', 'closed', '', '217-revision-v1', '', '', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '', '217', 'http://localhost:8082/ideiasti/?p=444', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('445', '0', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '<p><strong>Meta Description:</strong> Aprenda continuous testing: automação completa no pipeline CI/CD, quality gates, shift-left e como implementar testes em cada estágio.</p>\n\n<hr>\n<h2>O Que É Continuous Testing?</h2>\n\n<p>Continuous Testing é a prática de executar testes automaticamente em cada mudança de código, proporcionando feedback rápido e contínuo sobre a qualidade do software.</p>\n\n<h3>Princípios</h3>\n<ol><li><strong>Automação completa</strong> - Sem intervenção manual</li>\n<li><strong>Feedback rápido</strong> - Resultados em minutos</li>\n<li><strong>Shift-Left</strong> - Testar mais cedo</li>\n<li><strong>Quality Gates</strong> - Critérios para avançar</li>\n<li><strong>Cobertura ampla</strong> - Múltiplos tipos de teste</li>\n</ol>\n<hr>\n<h2>Pipeline de Continuous Testing</h2>\n\n<pre><code>Code → Commit → Build → Unit Tests → Integration → E2E → Security → Deploy\n          ↓        ↓        ↓           ↓            ↓       ↓        ↓\n      Pre-commit Hook   Coverage    Contract     Playwright  SAST     Staging\n                       Gate        Tests        Tests     DAST\n</code></pre>\n\n<hr>\n<h2>Quality Gates</h2>\n\n<h3>Definição</h3>\n\n<pre><code># Quality Gates Configuration\nquality_gates:\n  - name: \"Code Coverage\"\n    type: coverage\n    minimum: 80  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\n    blocking: true\n\n<p>- name: \"Security Scan\"<br>    type: security<br>    max_critical: 0<br>    max_high: 0<br>    blocking: true</p>\n\n<p>- name: \"Test Pass Rate\"<br>    type: test<br>    minimum: 95  # {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br>    blocking: true</p>\n\n<p>- name: \"Performance\"<br>    type: performance<br>    max_p95_ms: 500<br>    blocking: false</p>\n\n<p>- name: \"Code Review\"<br>    type: approval<br>    required_approvals: 1<br>    blocking: true<br></code></pre></p>\n\n<h3>Implementação</h3>\n\n<pre><code>#!/bin/bash\n# quality-gate.sh\n\n<p>check_coverage() {<br>    COVERAGE=$(cat coverage.xml | grep -oP \'line-covered=\"K[0-9]+\')<br>    TOTAL=$(cat coverage.xml | grep -oP \'line-count=\"K[0-9]+\')<br>    PERCENTAGE=$((COVERAGE * 100 / TOTAL))</p>\n\n<p>if [ $PERCENTAGE -lt 80 ]; then<br>        echo \"❌ Coverage $PERCENTAGE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} below threshold (80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\"<br>        return 1<br>    fi<br>    echo \"✅ Coverage $PERCENTAGE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br>    return 0<br>}</p>\n\n<p>check_security() {<br>    CRITICAL=$(grep -c \"critical\" snyk-report.json)<br>    if [ $CRITICAL -gt 0 ]; then<br>        echo \"❌ $CRITICAL critical vulnerabilities found\"<br>        return 1<br>    fi<br>    echo \"✅ No critical vulnerabilities\"<br>    return 0<br>}</p>\n\n<p>check_tests() {<br>    PASS_RATE=$(python -c \"print($passed / $total * 100)\")<br>    if (( $(echo \"$PASS_RATE &lt; 95&quot; | bc -l) )); then<br>        echo \"❌ Pass rate $PASS_RATE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} below threshold (95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442})\"<br>        return 1<br>    fi<br>    echo \"✅ Pass rate $PASS_RATE{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"<br>    return 0<br>}</p>\n\n<p># Run all gates<br>check_coverage &amp;&amp; check_security &amp;&amp; check_tests<br>exit $?<br></code></pre></p>\n\n<hr>\n<h2>Shift-Left Testing</h2>\n\n<h3>Traditional vs Shift-Left</h3>\n\n<pre><code>TRADITIONAL:\nRequirements → Design → Development → Testing → Production\n                          ↓\n                    (Late discovery of bugs)\n\n<p>SHIFT-LEFT:<br>Requirements → Testing → Development → Testing → Production<br>     ↓<br>(Early discovery of bugs)<br></code></pre></p>\n\n<h3>Implementação</h3>\n\n<pre><code># .github/workflows/shift-left.yml\nname: Shift-Left Pipeline\n\n<p>on: [push, pull_request]</p>\n\n<p>jobs:<br>  # Stage 1: Pre-commit (Developer Machine)<br>  pre-commit-checks:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: Pre-commit hooks<br>        run: |<br>          pip install pre-commit<br>          pre-commit run --all-files</p>\n\n<p># Stage 2: Build<br>  build:<br>    needs: pre-commit-checks<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: Build<br>        run: docker build -t app:${{ github.sha }} .</p>\n\n<p># Stage 3: Unit Tests (Fast)<br>  unit-tests:<br>    needs: build<br>    runs-on: ubuntu-latest<br>    steps:<br>      - run: pytest tests/unit -v --cov</p>\n\n<p># Stage 4: Security (SAST)<br>  security-sast:<br>    needs: build<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: SonarCloud<br>        uses: SonarSource/sonarcloud-github-action@master</p>\n\n<p>- name: Semgrep<br>        uses: returntocorp/semgrep-action@v1</p>\n\n<p># Stage 5: Integration Tests<br>  integration-tests:<br>    needs: [unit-tests, security-sast]<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: Run integration tests<br>        run: pytest tests/integration -v</p>\n\n<p># Stage 6: E2E Tests<br>  e2e-tests:<br>    needs: integration-tests<br>    runs-on: ubuntu-latest<br>    if: github.event_name == \'push\'<br>    steps:<br>      - uses: actions/checkout@v4<br>      - name: Playwright tests<br>        run: npx playwright test</p>\n\n<p># Stage 7: Deploy to Staging<br>  deploy-staging:<br>    needs: e2e-tests<br>    runs-on: ubuntu-latest<br>    environment: staging<br>    steps:<br>      - deploy to staging<br></code></pre></p>\n\n<hr>\n<h2>Test Selection Strategy</h2>\n\n<pre><code># test_selector.py\nimport subprocess\nfrom typing import List\n\n<p>class TestSelector:<br>    def __init__(self, changed_files):<br>        self.changed_files = changed_files</p>\n\n<p>def select_tests(self) -&gt; List[str]:<br>        tests = set()</p>\n\n<p># Unit tests (always run)<br>        tests.update(self.get_unit_tests())</p>\n\n<p># Integration tests (based on changes)<br>        tests.update(self.get_integration_tests())</p>\n\n<p># E2E tests (only for critical paths or major changes)<br>        if self.has_critical_changes():<br>            tests.update(self.get_critical_e2e_tests())</p>\n\n<p>return list(tests)</p>\n\n<p>def get_unit_tests(self):<br>        # All unit tests<br>        return self.get_tests_matching(\"tests/unit/<em>*/</em>.py\")</p>\n\n<p>def get_integration_tests(self):<br>        tests = set()<br>        for file in self.changed_files:<br>            if \"database\" in file:<br>                tests.add(\"tests/integration/test_database.py\")<br>            if \"api\" in file or \"service\" in file:<br>                tests.add(\"tests/integration/test_api.py\")<br>        return tests</p>\n\n<p>def has_critical_changes(self):<br>        critical_patterns = [\"checkout\", \"payment\", \"auth\", \"core\"]<br>        return any(<br>            any(p in f for p in critical_patterns) <br>            for f in self.changed_files<br>        )</p>\n\n<p>def get_critical_e2e_tests(self):<br>        return [<br>            \"tests/e2e/test_checkout.py\",<br>            \"tests/e2e/test_login.py\",<br>            \"tests/e2e/test_payment.py\"<br>        ]<br></code></pre></p>\n\n<hr>\n<h2>Feedback Loop</h2>\n\n<pre><code># Slack notification\n<ul><li>name: Notify on Failure</li></ul>\n  if: failure()\n  uses: slackapi/slack-github-action@v1\n  with:\n    channel-id: \'qa-alerts\'\n    payload: |\n      {\n        \"text\": \"❌ Build #${GITHUB_RUN_NUMBER} failed\",\n        \"blocks\": [{\n          \"type\": \"section\",\n          \"text\": {\n            \"type\": \"mrkdwn\",\n            \"text\": \"<em>Build Failed</em> :x:n${GITHUB_REPOSITORY}n${GITHUB_RUN_URL}\"\n          }\n        }]\n      }\n</code></pre>\n\n<hr>\n<h2>Métricas de Continuous Testing</h2>\n\n<pre><code>def continuous_testing_metrics():\n    return {\n        \"test_cycle_time\": {\n            \"description\": \"Tempo do commit ao deploy\",\n            \"current\": \"45 min\",\n            \"target\": \"30 min\",\n            \"trend\": \"improving\"\n        },\n        \"test_automation_rate\": {\n            \"description\": \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de testes automatizados\",\n            \"current\": \"85{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\",\n            \"target\": \"90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\n        },\n        \"quality_gate_pass_rate\": {\n            \"description\": \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de builds passando em quality gates\",\n            \"current\": \"92{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\",\n            \"target\": \"95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\"\n        },\n        \"defect_leakage_rate\": {\n            \"description\": \"{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos encontrados em produção\",\n            \"current\": \"8{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}\",\n            \"target\": \"&lt;5{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}&quot;\n        }\n    }\n</code></pre>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Continuous Testing é essencial para DevOps. As chaves são:<br><ol><li><strong>Automação total</strong> - Sem intervenção manual</li><br><li><strong>Feedback rápido</strong> - Minutos, não horas</li><br><li><strong>Quality gates</strong> - Critérios claros</li><br><li><strong>Shift-Left</strong> - Testar o mais cedo possível</li><br><li><strong>Seleção inteligente</strong> - Não rodar tudo sempre</li></ol></p>', 'Continuous Testing: Automação Total no Pipeline', '', 'inherit', 'closed', 'closed', '', '218-revision-v1', '', '', '2026-07-06 22:25:41', '2026-07-07 01:25:41', '', '218', 'http://localhost:8082/ideiasti/?p=445', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('447', '0', '2026-07-06 22:30:05', '2026-07-07 01:30:05', '', '1588cb664d636f50f5168aae2a232541', '', 'inherit', 'open', 'closed', '', '1588cb664d636f50f5168aae2a232541', '', '', '2026-07-06 22:30:05', '2026-07-07 01:30:05', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/1588cb664d636f50f5168aae2a232541.jpg', '0', 'attachment', 'image/jpeg', '0');
INSERT INTO `wp_posts` VALUES ('448', '0', '2026-07-06 22:41:43', '2026-07-07 01:41:43', '', 'giphy-2', '', 'inherit', 'open', 'closed', '', 'giphy-2', '', '', '2026-07-06 22:41:43', '2026-07-07 01:41:43', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-2.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('449', '0', '2026-07-06 22:41:45', '2026-07-07 01:41:45', '<p><strong>Meta Description:</strong> Conheça todos os tipos de testes de software: funcionais, não-funcionais, unitários, integração, sistema e mais. Guia completo com definições, objetivos e melhores práticas.</p>\n\n<hr>\n<h2>Introdução aos Tipos de Testes de Software</h2>\n\n<p>Os testes de software são uma atividade crítica no ciclo de desenvolvimento de sistemas. Compreender os diferentes tipos de testes e quando aplicá-los é fundamental para garantir a qualidade e confiabilidade das aplicações.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-2.gif\" alt=\"Pirâmide de Testes - Hierarquia de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este guia completo apresenta uma categorização detalhada dos principais tipos de testes de software, suas finalidades, características e quando cada um deve ser utilizado no seu projeto.</p>\n\n<hr>\n<h2>Categorização Geral dos Testes</h2>\n\n<p>Os testes de software podem ser divididos em duas categorias principais:</p>\n\n<h3>1. Testes Funcionais</h3>\n\n<p>Verificam se o software funciona conforme especificado, testando funcionalidades específicas e requisitos do negócio.</p>\n\n<h3>2. Testes Não-Funcionais</h3>\n\n<p>Avaliam características como performance, segurança, usabilidade e confiabilidade, que não estão relacionadas a funcionalidades específicas.</p>\n\n<hr>\n<h2>Testes Funcionais: Garantindo o Comportamento Correto</h2>\n\n<h3>Teste Unitário: A Base de Tudo</h3>\n\n<p>O teste unitário é o tipo mais básico de teste, onde cada unidade de código (geralmente uma função ou método) é testada isoladamente. Esta atividade é realizada durante as etapas de desenvolvimento pelos próprios desenvolvedores.</p>\n\n<h4>Objetivos dos Testes Unitários</h4>\n\n<ul><li><strong>Identificar falhas em componentes individuais</strong> - Detectar problemas cedo</li><ol><li><strong>Garantir que cada função trabalha corretamente</strong> - Validação granular</li>\n<li><strong>Facilitar a detecção precoce de defeitos</strong> - Redução de custos</li>\n<li><strong>Documentar o código</strong> - Testes como especificação executável</li>\n<li><strong>Permitir refactoring seguro</strong> - Confiança ao modificar código</li>\n</ol>\n<h4>Exemplo Prático em Python (pytest)</h4>\n\n<pre><code>def calcular_desconto(valor_original, percentual):\n    \"\"\"Calcula o valor do desconto.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual deve estar entre 0 e 100\")\n    desconto = valor_original * (percentual / 100)\n    return valor_original - desconto\n\n<p>def test_calcular_desconto_10_porcento():<br>    assert calcular_desconto(100, 10) == 90</p>\n\n<p>def test_calcular_desconto_50_porcento():<br>    assert calcular_desconto(200, 50) == 100</p>\n\n<p>def test_calcular_desconto_invalido():<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 150)<br></code></pre></p>\n\n<h4>Frameworks Populares para Testes Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Framework</th><th>Características</th></tr>\n<tr><td>Java</td><td>JUnit 5, TestNG</td><td>Mais popular, extensível</td></tr>\n<tr><td>JavaScript</td><td>Jest, Mocha</td><td>Rápido, Mocking fácil</td></tr>\n<tr><td>Python</td><td>pytest, unittest</td><td>Sintaxe simples, fixtures</td></tr>\n<tr><td>C#</td><td>xUnit, NUnit</td><td>.NET ecosystem</td></tr>\n<tr><td>Go</td><td>testing (stdlib)</td><td>Simples, integrado</td></tr>\n</table></figure>\n\n<h4>Melhores Práticas para Testes Unitários</h4>\n\n<p>✅ <strong>Teste apenas uma coisa de cada vez</strong> - Um assert por teste é ideal  <br>✅ <strong>Nomes descritivos</strong> - <code>test_deve_retornar_erro_quando_usuario_invalido</code>  <br>✅ <strong>Independência</strong> - Testes não devem depender uns dos outros  <br>✅ <strong>Rapidez</strong> - Unit tests devem executar em milissegundos  <br>✅ <strong>Isolamento</strong> - Use mocks para dependências externas</p>\n\n<hr>\n<h3>Teste de Integração: Verificando Conexões</h3>\n\n<p>O teste de integração verifica a comunicação entre diferentes módulos ou componentes do sistema. Este tipo de teste é crucial para garantir que as partes do sistema funcionam corretamente quando combinadas.</p>\n\n<h4>Características Principais</h4>\n<ol><li><strong>Valida interfaces e interações entre componentes</strong> - Fluxo de dados correto</li>\n<li><strong>Identifica problemas de comunicação</strong> - API mismatches, protocolos</li>\n<li><strong>Pode ser realizado de forma incremental ou big-bang</strong> - Duas abordagens</li>\n<li><strong>Testa camadas de persistência</strong> - Bancos de dados, APIs externas</li>\n</ol>\n<h4>Estratégias de Integração</h4>\n\n<p>##### 1. Big-Bang Integration</p>\n\n<p>Todos os componentes são integrados simultaneamente e testados juntos.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Simples de implementar</li><br><li>Bom para sistemas pequenos</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Difícil localização de erros</li><br><li>Todos os módulos devem estar prontos</li><br></ol><br>##### 2. Incremental Integration (Bottom-Up)</p>\n\n<p>Começa pelos módulos mais baixos e集成 progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Defeitos fáceis de isolar</li><br><li>Feedback contínuo</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode ter módulos de alto nível sem testes até o final</li><br></ol><br>##### 3. Incremental Integration (Top-Down)</p>\n\n<p>Começa pelos módulos de mais alto nível e desce progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Interface do usuário testada primeiro</li><br><li>Protótipo funcional rápido</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Módulos de baixo nível simulados (stubs)</li><br></ol><br><h4>Exemplo de Teste de Integração (REST API)</h4></p>\n\n<pre><code>import requests\nimport pytest\n\n<p>class TestUserAPI:<br>    BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>def test_criar_usuario(self):<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"senha123\"<br>        }<br>        response = requests.post(f\"{self.BASE_URL}/usuarios\", json=payload)</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data</p>\n\n<p>def test_listar_usuarios(self):<br>        response = requests.get(f\"{self.BASE_URL}/usuarios\")</p>\n\n<p>assert response.status_code == 200<br>        assert isinstance(response.json(), list)<br></code></pre></p>\n\n<hr>\n<h3>Teste de Sistema: Visão Holística</h3>\n\n<p>O teste de sistema avalia o software como um todo, verificando se todos os componentes funcionam juntos para atender aos requisitos definidos.</p>\n\n<h4>O Que é Testado no Nível de Sistema?</h4>\n<ol><li><strong>Integração entre todos os módulos</strong></li>\n<li><strong>Fluxos de negócio completos</strong></li>\n<li><strong>Conformidade com requisitos funcionais</strong></li>\n<li><strong>Interface com sistemas externos</strong></li>\n<li><strong>Performance do sistema integrado</strong></li>\n<li><strong>Segurança end-to-end</strong></li>\n</ol>\n<h4>Exemplo: Fluxo de E-commerce</h4>\n\n<pre><code>Usuário → Login → Navegação → Carrinho → Checkout → Pagamento → Confirmação\n    ↓         ↓          ↓           ↓           ↓            ↓            ↓\n Cadastro   Session   Produtos    Estoque     Frete        Stripe     E-mail\n   ↕          ↕         ↕          ↕          ↕            ↕          ↕\n  DB        Redis     DB/API     DB         Correios      API       SMTP\n</code></pre>\n\n<p>Cada seta representa um ponto de integração que deve ser testado no nível de sistema.</p>\n\n<hr>\n<h3>Teste de Aceitação: Validando com o Cliente</h3>\n\n<p>O teste de aceitação determina se um produto ou sistema atende às expectativas e requisitos do cliente. Este é frequentemente o último nível de teste antes da entrega正式.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto certo?\"</strong></p>\n\n<h4>Tipos de Teste de Aceitação</h4>\n\n<p>##### 1. Teste de Aceitação do Usuário (UAT)</p>\n\n<p>Usuários finais testam o sistema em um ambiente semelhante ao de produção.</p>\n\n<p>##### 2. Teste de Aceitação Operacional (OAT)</p>\n\n<p>Equipe de operações validabackup, recuperação, relatórios.</p>\n\n<p>##### 3. Teste de Aceitação Contratual</p>\n\n<p>Verifica se o sistema atende aos critérios contratuais.</p>\n\n<h4>Características do UAT</h4>\n<ol><li>Geralmente envolve cooperação ou feedback do cliente</li>\n<li>Atividade de validação com dados reais</li>\n<li>Foco na usabilidade e fluxo de negócio</li>\n<li>Pode revelar requisitos mal entendidos</li>\n<li>Último checkpoint antes do go-live</li>\n</ol>\n<hr>\n<h3>Teste Funcional: Verificando Funcionalidades</h3>\n\n<p>O teste funcional determina se um recurso ou sistema funciona corretamente sem problemas. Verifica o sistema em diferentes níveis para garantir que todos os cenários são cobertos.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto da forma certa?\"</strong></p>\n\n<h4>Técnicas de Teste Funcional</h4>\n\n<p>##### 1. Teste Baseado em Requisitos<br><ol><li>Cada requisito tem casos de teste correspondentes</li><br><li>Rastreabilidade entre requisitos e testes</li><br><li>Cobertura completa</li><br></ol><br>##### 2. Teste Baseado em Casos de Uso<br><ol><li>Cenários de usuário documentados</li><br><li>Fluxos principais e alternativos</li><br><li>Pré-condições e pós-condições</li><br></ol><br>##### 3. Teste de Tabela de Decisão<br><ol><li>Combinações de condições e ações</li><br><li>Útil para regras de negócio complexas</li><br></ol><br>##### 4. Teste de Transição de Estado<br><ol><li>Mudanças de estado do sistema</li><br><li>Diagramas de estado</li><br></ol><br><hr><br><h2>Testes Não-Funcionais: Avaliando Qualidade Oculta</h2></p>\n\n<h3>Teste de Desempenho: Rapidez e Estabilidade</h3>\n\n<figure><img src=\"https://media.giphy.com/media/l0Iy69RBwNTRF0MXi/giphy.gif\" alt=\"Performance Testing - Testes de Desempenho\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de desempenho avalia a velocidade, responsividade e estabilidade do sistema sob carga de trabalho. É crítico para garantir que a aplicação atende aos SLAs (Service Level Agreements).</p>\n\n<h4>Subtipo 1: Teste de Carga (Load Testing)</h4>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas.</p>\n\n<p><strong>Métricas Coletadas:</strong><ol><li>Tempo de resposta (média, p95, p99)</li><br><li>Throughput (requisições por segundo)</li><br><li>Utilização de recursos (CPU, memória, disco)</li><br><li>Taxa de erros</li><br></ol><br><strong>Ferramentas Populares:</strong><ol><li>JMeter</li><br><li>Gatling</li><br><li>k6</li><br><li>Locust</li><br></ol><br><h4>Subtipo 2: Teste de Estresse (Stress Testing)</h4></p>\n\n<p>Avalia os limites do sistema além da capacidade normal para identificar o ponto de quebra.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar capacidade máxima</li><br><li>Verificar comportamento sob overload</li><br><li>Medir tempo de recuperação</li><br><li>Validar failovers</li><br></ol><br><h4>Subtipo 3: Teste de Resistência (Soak Testing)</h4></p>\n\n<p>Executa o sistema sob carga por períodos prolongados para identificar degradação gradual.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Conexões não fechadas</li><br><li>Acúmulo de logs</li><br><li>Degradação de performance</li><br></ol><br><h4>Subtipo 4: Teste de Pico (Spike Testing)</h4></p>\n\n<p>Avalia reações do sistema a picos súbitos de carga.</p>\n\n<p><strong>Cenário Exemplo:</strong><br><pre><code>Carga normal: 1000 usuários<br>Pico: 5000 usuários em 10 segundos<br>Recovery: Voltar para 1000 usuários<br></code></pre></p>\n\n<h4>Ferramentas de Teste de Desempenho</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>JMeter</strong></td><td>Open Source</td><td>Java</td><td>Enterprise, complexo</td></tr>\n<tr><td><strong>Gatling</strong></td><td>Open Source</td><td>Scala</td><td>DevOps, CI/CD</td></tr>\n<tr><td><strong>k6</strong></td><td>Open Source</td><td>JavaScript</td><td>Moderno, extensível</td></tr>\n<tr><td><strong>Locust</strong></td><td>Open Source</td><td>Python</td><td>Python teams</td></tr>\n<tr><td><strong>LoadRunner</strong></td><td>Comercial</td><td>Various</td><td>Enterprise</td></tr>\n</table></figure>\n\n<h4>Exemplo de Teste de Carga com k6</h4>\n\n<pre><code>// script.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },  // Ramp-up<br>    { duration: \'5m\', target: 100 },  // Steady state<br>    { duration: \'2m\', target: 200 },  // Spike<br>    { duration: \'5m\', target: 200 },  // Steady state<br>    { duration: \'2m\', target: 0 },    // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // Menos de 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/produtos\');<br>  check(res, {<br>    \'status é 200\': (r) =&gt; r.status === 200,<br>    \'tempo  r.timings.duration &lt; 500,<br>  });<br>  sleep(1);<br>}<br></code></pre></p>\n\n<hr>\n<h3>Teste de Segurança: Protegendo Dados e Sistemas</h3>\n\n<figure><img src=\"https://media.giphy.com/media/1qfDU4MJv3jWu34hEx/giphy.gif\" alt=\"Security Testing - Escudo de Segurança\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de segurança identifica vulnerabilidades e garante proteção de dados. Em um mundo cada vez mais digital, a segurança é prioridade.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n\n<p>##### 1. Teste de Penetração (Pen Test)</p>\n\n<p>Simula ataques para identificar vulnerabilidades antes que hackers maliciosos o façam.</p>\n\n<p><strong>Metodologias:</strong><ol><li>OWASP Testing Guide</li><br><li>PTES (Penetration Testing Execution Standard)</li><br><li>NIST SP 800-115</li><br></ol><br><strong>Tipos de Pentest:</strong><ol><li><strong>Black Box:</strong> Sem conhecimento prévio</li><br><li><strong>White Box:</strong> Código e documentação</li><br><li><strong>Gray Box:</strong> Conhecimento parcial</li><br></ol><br>##### 2. Varredura de Vulnerabilidade</p>\n\n<p>Identifica pontos fracos conhecidos através de scanning automatizado.</p>\n\n<p><strong>Ferramentas:</strong><ol><li>Nessus</li><br><li>OpenVAS</li><br><li>Qualys</li><br><li>Nexpose</li><br></ol><br>##### 3. Teste de Firewall e WAF</p>\n\n<p>Verifica configurações de segurança de firewalls e Web Application Firewalls.</p>\n\n<p><strong>O que testar:</strong><ol><li>Regras de firewall</li><br><li>Block de IPs maliciosos</li><br><li>Detecção de SQL Injection</li><br><li>Proteção XSS</li><br></ol><br>##### 4. Análise de Código Estático (SAST)</p>\n\n<p>Detecta vulnerabilidades no código-fonte sem executá-lo.</p>\n\n<p><strong>Ferramentas SAST:</strong><ol><li>SonarQube</li><br><li>Checkmarx</li><br><li>Fortify</li><br><li>Snyk Code</li><br></ol><br>##### 5. Análise de Componentes (SCA)</p>\n\n<p>Identifica vulnerabilidades em bibliotecas e dependências.</p>\n\n<p><strong>Ferramentas SCA:</strong><ol><li>Snyk</li><br><li>OWASP Dependency-Check</li><br><li>WhiteSource</li><br><li>Dependabot</li><br></ol><br><h4>OWASP Top 10: Vulnerabilidades Mais Comuns</h4><br><ol><li><strong>A01 - Broken Access Control</strong></li><br><li><strong>A02 - Cryptographic Failures</strong></li><br><li><strong>A03 - Injection</strong></li><br><li><strong>A04 - Insecure Design</strong></li><br><li><strong>A05 - Security Misconfiguration</strong></li><br><li><strong>A06 - Vulnerable Components</strong></li><br><li><strong>A07 - Authentication Failures</strong></li><br><li><strong>A08 - Software and Data Integrity Failures</strong></li><br><li><strong>A09 - Security Logging Failures</strong></li><br><li><strong>A10 - SSRF (Server-Side Request Forgery)</strong></li><br></ol><br><hr><br><h3>Teste de Usabilidade: Experiência do Usuário</h3></p>\n\n<p>Avalia a facilidade de uso e a experiência do usuário com o sistema. O teste de usabilidade é essencial para garantir que os usuários consigam realizar suas tarefas de forma eficiente.</p>\n\n<h4>Critérios de Usabilidade</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Critério</th><th>Definição</th><th>Métrica</th></tr>\n<tr><td><strong>Eficácia</strong></td><td>Usuário consegue completar tarefa?</td><td>Taxa de sucesso</td></tr>\n<tr><td><strong>Eficiência</strong></td><td>Quanto tempo leva?</td><td>Tempo de tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Usuário gostou?</td><td>Questionários SUS</td></tr>\n<tr><td><strong>Aprendizagem</strong></td><td>Quanto tempo para aprender?</td><td>Tempo até proficiência</td></tr>\n<tr><td><strong>Memorização</strong></td><td>Lembra como usar?</td><td>Retenção após pausa</td></tr>\n</table></figure>\n\n<h4>Métodos de Teste de Usabilidade</h4>\n<ol><li><strong>Testes com Usuários</strong> - Sessões gravadas com participantes</li>\n<li><strong>Análise Heurística</strong> - Avaliação por especialistas</li>\n<li><strong>Questionários</strong> - SUS, SEQ, NPS</li>\n<li><strong>Eye Tracking</strong> - Rastreamento ocular</li>\n<li><strong>Análise de Tarefas</strong> - Tempos e erros</li>\n</ol>\n<h4>Frameworks de Avaliação</h4>\n<ol><li><strong>Nielsen\'s Heurísticas</strong> (10 princípios)</li>\n<li><strong>ISO 9241-11</strong> (Usabilidade)</li>\n<li><strong>WCAG 2.1</strong> (Acessibilidade)</li>\n</ol>\n<hr>\n<h3>Teste de Compatibilidade: Funciona em Todo Lugar?</h3>\n\n<p>Verifica se o software funciona em diferentes ambientes, navegadores e dispositivos.</p>\n\n<h4>Tipos de Teste de Compatibilidade</h4>\n\n<p>##### 1. Teste de Navegador (Cross-Browser)<br><ol><li>Chrome, Firefox, Safari, Edge</li><br><li>Diferentes versões</li><br><li>Modos de compatibilidade</li><br></ol><br>##### 2. Teste Mobile<br><ol><li>iOS (iPhone, iPad)</li><br><li>Android (diferentes fabricantes)</li><br><li>Diferentes tamanhos de tela</li><br><li>Diferentes versões de OS</li><br></ol><br>##### 3. Teste de Sistema Operacional<br><ol><li>Windows 10, 11</li><br><li>macOS (versões diferentes)</li><br><li>Linux (distribuições populares)</li><br></ol><br>##### 4. Teste de Hardware<br><ol><li>Diferentes processadores</li><br><li>Diferentes quantidades de RAM</li><br><li>Diferentes resoluções de tela</li><br></ol><br><h4>Ferramentas de Teste Cross-Browser</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Cobertura</th><th>Preço</th></tr>\n<tr><td>BrowserStack</td><td>3000+ dispositivos</td><td>$29+/mês</td></tr>\n<tr><td>Sauce Labs</td><td>1000+ dispositivos</td><td>$39+/mês</td></tr>\n<tr><td>LambdaTest</td><td>3000+ dispositivos</td><td>$15+/mês</td></tr>\n<tr><td>CrossBrowserTesting</td><td>1500+ dispositivos</td><td>$29+/mês</td></tr>\n</table></figure>\n\n<hr>\n<h3>Teste de Recuperação: Resistência a Falhas</h3>\n\n<p>Avalia a capacidade do sistema de se recuperar de falhas e disasters. É crucial para sistemas críticos que não podem ficar fora do ar.</p>\n\n<h4>Cenários de Teste</h4>\n<ol><li><strong>Falha de Hardware</strong></li>\n</ol>   - Perda de disco\n   - Falha de memória\n   - Queda de servidor\n<ol><li><strong>Falha de Software</strong></li>\n</ol>   - Crash de aplicação\n   - Deadlock\n   - Exceções não tratadas\n<ol><li><strong>Falha de Rede</strong></li>\n</ol>   - Perda de conectividade\n   - Alta latência\n   - Timeout\n<ol><li><strong>Desastres</strong></li>\n</ol>   - Perda de datacenter\n   - Corrupção de dados\n   - Ataques DDoS\n\n<h4>Métricas de Recuperação</h4>\n<ol><li><strong>RTO (Recovery Time Objective):</strong> Tempo máximo para recuperação</li>\n<li><strong>RPO (Recovery Point Objective):</strong> Perda máxima de dados aceitável</li>\n<li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li>\n<li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li>\n</ol>\n<hr>\n<h2>Testes de Regressão: Mantendo a Qualidade</h2>\n\n<p>Executados sempre que o código é modificado para garantir que alterações não introduzam novos defeitos. Este é um dos tipos de teste mais importantes e frequentemente executados.</p>\n\n<h3>Quando Executar Testes de Regressão</h3>\n\n<p>✅ Após cada release de software  <br>✅ Após correção de bugs  <br>✅ Após atualizações de dependências  <br>✅ Após refactoring de código  <br>✅ Antes do deploy de produção</p>\n\n<h3>Estratégias de Testes de Regressão</h3>\n\n<h4>1. Regressão Completa</h4>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura total</li><br><li>Alta confiança</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Tempo longo</li><br><li>Custo elevado</li><br></ol><br><h4>2. Regressão Seletiva</h4></p>\n\n<p>Seleciona testes relevantes baseados em mudanças.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Mais rápido</li><br><li>Mais econômico</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode perder cobertura</li><br></ol><br><h4>3. Regressão Prioritária</h4></p>\n\n<p>Executa testes por prioridade (críticos &gt; altos &gt; médios &gt; baixos).</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura do crítico rápido</li><br><li>Decisões baseadas em risco</li><br></ol><br><h3>Automação de Testes de Regressão</h3></p>\n\n<p>A automação é essencial para testes de regressão eficazes:</p>\n\n<p><strong>Benefícios:</strong><ol><li>Execução frequente</li><br><li>Resultados consistentes</li><br><li>Rapidez</li><br><li>Cobertura ampla</li><br></ol><br><strong>Ferramentas Recomendadas:</strong><ol><li>Selenium WebDriver</li><br><li>Playwright</li><br><li>Cypress</li><br><li>Appium (mobile)</li><br><li>RestAssured (API)</li><br></ol><br><hr><br><h2>Pirâmide de Testes: Arquitetura Ideal</h2></p>\n\n<p>A pirâmide de testes é um conceito fundamental que guia a distribuição dos tipos de teste:</p>\n\n<pre><code>                    /\n                   /  \n                  / E2E        ← Poucos testes E2E (lentos, caros)\n                 /      \n                /Integração   ← Alguns testes de integração\n               /            \n              /  Unitários     ← Muitos testes unitários (rápidos, baratos)\n             /________________\n</code></pre>\n\n<h3>Proporções Ideais</h3>\n<ol><li><strong>Unitários:</strong> 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>Integração:</strong> 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>E2E:</strong> 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Compreender os diferentes tipos de testes de software é fundamental para construir uma estratégia de QA eficaz. Cada tipo de teste tem seu propósito específico e deve ser aplicado no momento adequado do ciclo de desenvolvimento.</p>\n\n<p><strong>Resumo dos Tipos de Testes:</strong></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Categoria</th><th>Tipo</th><th>Quando Usar</th><th>Objetivo</th></tr>\n<tr><td><strong>Funcional</strong></td><td>Unitário</td><td>Desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Integração</td><td>Pós-unitário</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Sistema</td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Aceitação</td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Performance</td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Segurança</td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Usabilidade</td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n</table></figure>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem todo projeto precisa de todos os tipos</li><br><li><strong>Priorize</strong> - Comece com unitários e integração</li><br><li><strong>Automatize</strong> - Regressão deve ser automática</li><br><li><strong>Meça</strong> - Cobertura, tempo, defeitos encontrados</li><br><li><strong>Melhore</strong> - Itere constantemente</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre Tipos de Testes</h3></p>\n\n<p><strong>P: Quantos tipos de testes existem?</strong>  <br>R: Existem dozens de tipos de testes classificados de diferentes formas. Os principais são funcionais e não-funcionais, cada um com subtipos específicos.</p>\n\n<p><strong>P: Qual a diferença entre teste de sistema e teste de aceitação?</strong>  <br>R: Teste de sistema verifica se o sistema atende aos requisitos técnicos. Teste de aceitação verifica se o sistema atende às expectativas do usuário/cliente.</p>\n\n<p><strong>P: Testes manuais podem ser substituídos por automatizados?</strong>  <br>R: Não completamente. Testes manuais são essenciais para exploratory testing, UX e cenários complexos. A automação complementa, não substitui.</p>\n\n<p><strong>P: Quando devo começar a testar?</strong>  <br>R: O mais cedo possível! O conceito de Shift-Left recomenda testes desde as primeiras fases do desenvolvimento.</p>\n\n<p><strong>P: Qual a ordem ideal de execução dos testes?</strong>  <br>R: Unitários → Integração → Sistema → Aceitação. Cada nível depende do anterior.</p>\n\n<hr>\n<em>Fonte: Selenium.dev, Atlassian, Vericode, ISTQB, OWASP</em>', 'Tipos de Testes de Software: Guia Completo com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '179-revision-v1', '', '', '2026-07-06 22:41:45', '2026-07-07 01:41:45', '', '179', 'http://localhost:8082/ideiasti/?p=449', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('450', '0', '2026-07-06 22:41:49', '2026-07-07 01:41:49', '', 'giphy-3', '', 'inherit', 'open', 'closed', '', 'giphy-3', '', '', '2026-07-06 22:41:49', '2026-07-07 01:41:49', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-3.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('451', '0', '2026-07-06 22:41:50', '2026-07-07 01:41:50', '<p><strong>Meta Description:</strong> Descubra como a Inteligência Artificial está revolucionando a QA: automação inteligente, geração de testes, detecção de anomalias e manutenção preditiva. Guia completo para profissionais.</p>\n\n<hr>\n<h2>Estado Atual da IA em QA</h2>\n\n<p>O <strong>World Quality Report 2025</strong> revela dados impressionantes: quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão ativamente buscando GenAI</strong> em práticas de Quality Engineering (QE), mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} alcançaram implementação em escala empresarial.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-3.gif\" alt=\"AI Brain - Inteligência Artificial em QA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Esta lacuna entre interesse e implementação representa uma oportunidade significativa para profissionais e organizações que souberem aproveitar efetivamente essas tecnologias.</p>\n\n<hr>\n<h2>Por Que a Adoção de IA em QA Está Crescendo?</h2>\n\n<h3>Drivers de Adoção</h3>\n<ol><li><strong>Volume de testes crescente</strong> - Sistemas mais complexos exigem mais testes</li>\n<li><strong>Pressure de velocidade</strong> - CI/CD demanda execuções mais rápidas</li>\n<li><strong>Escassez de profissionais</strong> - Demanda supera oferta de testadores</li>\n<li><strong>Qualidade em produção</strong> - Necessidade de monitoramento contínuo</li>\n<li><strong>Custos crescentes</strong> - Automação inteligente reduz despesas</li>\n</ol>\n<h3>Benefícios Comprovados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Impacto da IA</th></tr>\n<tr><td>Redução de tempo de teste</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de custos de QA</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Melhoria em cobertura</td><td>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Detecção precoce de bugs</td><td>3-5x mais cedo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Desafios de Adoção de IA em QA</h2>\n\n<h3>1. Desalinhamento Estratégico</h3>\n\n<p>Existe um hiato crescente entre o interesse organizacional em GenAI e a prontidão real para adoção efetiva dentro de QE. O caminho da experimentação para implementação é mais complexo do que o antecipado.</p>\n\n<h4>Sinais de Desalinhamento</h4>\n\n<ul><li>GenAI vista como \"solução mágica\" sem estratégia clara</li><ol><li>Falta de alinhamento entre TI e negócios</li>\n<li>Expectativas irreais sobre capacidades</li>\n<li>Subestimação de esforço de integração</li>\n</ol>\n<h3>2. Complexidade de Implementação</h3>\n\n<p>A implementação de IA em QA requer alinhamento entre inovação operacional e oversight estratégico. Desafios incluem:</p>\n\n<h4>Desafios Técnicos</h4>\n<ol><li>Integração com sistemas legados</li>\n<li>Qualidade dos dados de treinamento</li>\n<li>Escolha de modelos adequados</li>\n<li>Manutenção de modelos em produção</li>\n</ol>\n<h4>Desafios Organizacionais</h4>\n<ol><li>Resistência cultural</li>\n<li>Falta de competências</li>\n<li>Processos não adaptados</li>\n<li>Governança de IA</li>\n</ol>\n<h3>3. Questões Éticas e de Governança</h3>\n<ol><li>Viés em modelos de IA</li>\n<li>Transparência nas decisões</li>\n<li>Responsabilidade por falhas</li>\n<li>Conformidade regulatória</li>\n</ol>\n<hr>\n<h2>Aplicações de IA em QA: Casos de Uso Detalhados</h2>\n\n<h3>1. Geração Automatizada de Testes</h3>\n\n<p>IA pode gerar casos de teste automaticamente baseados em requisitos e código. Esta é uma das aplicações mais promissoras.</p>\n\n<figure><img src=\"https://media.giphy.com/media/VbZ0cWw6cVPMM/giphy.gif\" alt=\"Automação de Testes com IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Requisitos → Análise de NLP → Cenários de Teste → Casos de Teste\n    ↓                                                        ↓\n Código → Análise Estática → Cobertura → Testes Sugeridos\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de unit tests</td><td>Diffblue</td></tr>\n<tr><td><strong>Testim</strong></td><td>Testes E2E com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>Automação sem código com IA</td><td>Avo Automation</td></tr>\n</table></figure>\n\n<h4>Exemplo: Geração de Testes com GenAI</h4>\n\n<pre><code># Exemplo conceitual de como IA pode gerar testes\nimport openai\n\n<p>def gerar_testes_para_requisito(requisito):<br>    prompt = f\"\"\"<br>    Gere casos de teste para o seguinte requisito:</p>\n\n<p>Requisito: {requisito}</p>\n\n<p>Formato de saída (JSON):<br>    {{<br>        \"casos_de_teste\": [<br>            {{<br>                \"id\": \"CT-001\",<br>                \"titulo\": \"...\",<br>                \"pre_condicoes\": [...],<br>                \"passos\": [...],<br>                \"dados_teste\": {{...}},<br>                \"resultado_esperado\": \"...\"<br>            }}<br>        ]<br>    }}<br>    \"\"\"</p>\n\n<p>response = openai.chat.completions.create(<br>        model=\"gpt-4\",<br>        messages=[{\"role\": \"user\", \"content\": prompt}]<br>    )</p>\n\n<p>return json.loads(response.choices[0].message.content)<br></code></pre></p>\n\n<h3>2. Detecção de Anomalias</h3>\n\n<p>Algoritmos de machine learning identificam padrões incomuns que indicam defeitos, revolucionando o monitoramento de qualidade.</p>\n\n<h4>Técnicas Utilizadas</h4>\n\n<p>##### Análise de Séries Temporais<br><ol><li>Identificação de anomalias em métricas de performance</li><br><li>Detecção de degradação gradual</li><br><li>Alertas proativos sobre problemas</li><br></ol><br>##### Clustering<br><ol><li>Agrupamento de testes similares</li><br><li>Identificação de testes atípicos</li><br><li>Detecção de padrões de falha</li><br></ol><br>##### Redes Neurais<br><ol><li>Detecção de padrões complexos</li><br><li>Aprendizado de comportamentos normais</li><br><li>Previsão de falhas</li><br></ol><br><h4>Ferramentas de Detecção de Anomalias</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Aplicação</th></tr>\n<tr><td><strong>Elastic APM</strong></td><td>APM</td><td>Detecção de anomalias em produção</td></tr>\n<tr><td><strong>Datadog</strong></td><td>Monitoring</td><td>ML para métricas</td></tr>\n<tr><td><strong>New Relic</strong></td><td>APM</td><td>Detecção inteligente</td></tr>\n<tr><td><strong>Grafana + Loki</strong></td><td>Logging</td><td>Análise de logs com ML</td></tr>\n</table></figure>\n\n<h3>3. Manutenção Inteligente de Testes</h3>\n\n<p>IA ajuda a identificar e remover testes obsoletos ou flaky, mantendo a suite de testes saudável.</p>\n\n<h4>Problemas que a IA Resolve</h4>\n\n<p><strong>Testes Flaky (Instáveis)</strong><br><ol><li>Identificação de padrões que causam instabilidade</li><br><li>Predição de quais testes podem falhar</li><br><li>Sugestões de correções</li><br><li>Quarentena automática</li><br></ol><br><strong>Testes Obsoletos</strong><br><ol><li>Detecção de funcionalidades removidas</li><br><li>Identificação de código não coberto</li><br><li>Sugestões de remoção segura</li><br></ol><br><h4>Exemplo de Detecção de Testes Flaky</h4></p>\n\n<pre><code># Sistema simplificado de detecção de testes flaky\nclass FlakyTestDetector:\n    def __init__(self):\n        self.test_history = {}\n        self.ml_model = load_trained_model()\n\n<p>def analyze_test(self, test_name, execution_history):<br>        features = self.extract_features(execution_history)<br>        flaky_probability = self.ml_model.predict_proba([features])[0]</p>\n\n<p>if flaky_probability &gt; 0.7:<br>            return {<br>                \"test\": test_name,<br>                \"flaky_probability\": flaky_probability,<br>                \"recommendation\": \"QUARANTINE\",<br>                \"reasons\": self.explain_prediction(features)<br>            }<br>        return {\"test\": test_name, \"flaky_probability\": flaky_probability}</p>\n\n<p>def extract_features(self, history):<br>        return [<br>            history.success_rate,<br>            history.avg_duration,<br>            history.recent_failures,<br>            history.environment_changes,<br>            history.dependency_changes<br>        ]<br></code></pre></p>\n\n<h3>4. Análise de Código Estático com IA</h3>\n\n<p>Identifica potenciais problemas de qualidade antes da execução, usando análise semântica avançada.</p>\n\n<h4>Capacidades Avançadas</h4>\n<ol><li><strong>Detecção de vulnerabilidades</strong> - OWASP Top 10</li>\n<li><strong>Análise de dependências</strong> - Bibliotecas desatualizadas</li>\n<li><strong>Code smells</strong> - Padrões problemáticos</li>\n<li><strong>Débito técnico</strong> - Métricas de qualidade</li>\n</ol>\n<h4>Ferramentas com IA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Capacidades IA</th><th>Integração</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Débito técnico, code smells</td><td>CI/CD</td></tr>\n<tr><td><strong>Snyk</strong></td><td>Vulnerabilidades, licenças</td><td>IDE, CI</td></tr>\n<tr><td><strong>CodeClimate</strong></td><td>Quality, maintainability</td><td>GitHub</td></tr>\n<tr><td><strong>DeepSource</strong></td><td>Análise estática com ML</td><td>Git</td></tr>\n</table></figure>\n\n<h3>5. Testes Visuais Automatizados</h3>\n\n<p>Comparação de interfaces visuais usando visão computacional para detectar regressões.</p>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Página Capturada → Modelo de Visão Computacional → Comparação com Baseline\n     ↓                          ↓                                    ↓\n  Screenshots           Detecção de Elementos           Diff Visual\n                                            ↓\n                                    Alertas de Regressão\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tecnologia</th><th>Diferencial</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Visual AI</td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de precisão</td></tr>\n<tr><td><strong> Percy</strong></td><td>Visual testing</td><td>Integração simples</td></tr>\n<tr><td><strong>Chromatic</strong></td><td>Visual regression</td><td>Para Storybook</td></tr>\n<tr><td><strong>Lost Pixel</strong></td><td>Open source</td><td>Self-hosted</td></tr>\n</table></figure>\n\n<h3>6. Oráculos de Teste Baseados em IA</h3>\n\n<p>Validação de resultados usando modelos treinados para determinar se o comportamento está correto.</p>\n\n<h4>Tipos de Oráculos</h4>\n<ol><li><strong>Oráculo de Imagem</strong> - Validação visual de UI</li>\n<li><strong>Oráculo de Texto</strong> - Análise de conteúdo</li>\n<li><strong>Oráculo de Comportamento</strong> - Detecção de anomalias</li>\n<li><strong>Oráculo de Dados</strong> - Validação de datasets</li>\n</ol>\n<hr>\n<h2>Ferramentas de IA para QA: Comparativo</h2>\n\n<h3>Plataformas Completas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Testim</strong></td><td>Automação inteligente E2E</td><td>$600+/mês</td><td>Equipes enterprise</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Automação com ML</td><td>Sob consulta</td><td>Escala enterprise</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>$500+/mês</td><td>CI/CD integrado</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>No-code com IA</td><td>Sob consulta</td><td>Enterprise</td></tr>\n<tr><td><strong>Perfecto</strong></td><td>Testes mobile/web com IA</td><td>Sob consulta</td><td>Mobile testing</td></tr>\n</table></figure>\n\n<h3>Ferramentas Especializadas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais</td><td>$100+/mês</td><td>UI testing</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Unit tests</td><td>$299/assinante</td><td>Dev teams</td></tr>\n<tr><td><strong>Snyk</strong></td><td>SCA</td><td>Grátis + Pro</td><td>Developers</td></tr>\n<tr><td><strong>SonarCloud</strong></td><td>SAST</td><td>Grátis + Pro</td><td>CI/CD</td></tr>\n</table></figure>\n\n<h3>Ferramentas Emerging (2025-2026)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Status</th></tr>\n<tr><td><strong>CodiumAI</strong></td><td>Testes gerados automaticamente</td><td>Beta</td></tr>\n<tr><td><strong>Mutable AI</strong></td><td>Code review + tests</td><td>Beta</td></tr>\n<tr><td><strong>Dagger</strong></td><td>CI/CD programável</td><td>GA</td></tr>\n<tr><td><strong>Trunk</strong></td><td>Linting inteligente</td><td>GA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando IA em QA: Roadmap Prático</h2>\n\n<h3>Fase 1: Avaliação e Planejamento (1-2 meses)</h3>\n\n<h4>Checklist de Avaliação</h4>\n<ol><li>[ ] Mapeamento de processos atuais de QA</li>\n<li>[ ] Identificação de pontos de dor</li>\n<li>[ ] Análise de ROI potencial</li>\n<li>[ ] Avaliação de maturidade tecnológica</li>\n<li>[ ] Levantamento de stakeholders</li>\n</ol>\n<h4>Métricas de Baseline</h4>\n\n<p>Antes de implementar, estabeleça métricas de referência:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Ferramenta</th></tr>\n<tr><td>Tempo de teste</td><td>Duração de suite</td><td>CI/CD logs</td></tr>\n<tr><td>Cobertura de teste</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>Coverage tools</td></tr>\n<tr><td>Taxa de defeitos</td><td>Bugs em produção</td><td>Bug tracker</td></tr>\n<tr><td>Testes flaky</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas instáveis</td><td>CI/CD</td></tr>\n<tr><td>Custo de QA</td><td>$/teste executado</td><td>Financeiro</td></tr>\n</table></figure>\n\n<h3>Fase 2: Pilot (2-3 meses)</h3>\n\n<h4>Escolha do Piloto</h4>\n\n<p>Selecione um projeto ou área com:<br><ol><li>✅ Escopo controlado</li><br><li>✅ Equipe aberta a inovação</li><br><li>✅ Processos definidos</li><br><li>✅ Métricas disponíveis</li><br></ol><br><h4>Pilotos Recomendados</h4><br><ol><li><strong>Geração de unit tests</strong> - Diffblue, CodiumAI</li><br><li><strong>Testes visuais</strong> - Applitools</li><br><li><strong>Detecção de flaky tests</strong> - Ferramentas de CI</li><br><li><strong>Análise estática</strong> - SonarQube, Snyk</li><br></ol><br><h3>Fase 3: Expansão (3-6 meses)</h3></p>\n\n<h4>Escalar Sucesso</h4>\n<ol><li>Documente aprendizados</li>\n<li>Treine outras equipes</li>\n<li>Padronize processos</li>\n<li>Melhore integrações</li>\n</ol>\n<h4>KPIs de Sucesso</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Meta (6 meses)</th></tr>\n<tr><td>Redução de tempo de teste</td><td>30-40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Aumento de cobertura</td><td>20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de defeitos em prod</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>ROI positivo</td><td>Sim</td></tr>\n</table></figure>\n\n<h3>Fase 4: Maturidade (6-12 meses)</h3>\n\n<h4>Implementação Enterprise</h4>\n<ol><li>Integração completa com CI/CD</li>\n<li>IA em produção (monitoramento)</li>\n<li>Maintenance automatizado</li>\n<li>Reporting avançado</li>\n</ol>\n<hr>\n<h2>Futuro da IA em QA: Tendências 2026-2028</h2>\n\n<h3>1. Testes Autônomos</h3>\n\n<p>Sistemas que automaticamente:<br><ol><li>Geram testes baseados em requisitos</li><br><li>Executam testes continuamente</li><br><li>Detectam e reportam falhas</li><br><li>Propõem correções</li><br></ol><br><h3>2. Manutenção Preditiva</h3></p>\n\n<p>IA que prevê:<br><ol><li>Quando testes vão falhar</li><br><li>Quando código precisa de mais testes</li><br><li>Quando componentes estão em risco</li><br><li>Quando fazer refactoring</li><br></ol><br><h3>3. GenAI Nativa em QA</h3></p>\n\n<p>Modelos treinados especificamente para:<br><ol><li>Entender código e testes</li><br><li>Gerar código de teste</li><br><li>Analisar requisitos</li><br><li>Documentar testes</li><br></ol><br><h3>4. Testes em Produção com IA</h3></p>\n\n<p>Monitoramento inteligente:<br><ol><li>Detecção de anomalias em produção</li><br><li>Geração automática de testes de regressão</li><br><li>Validação de deployments</li><br><li>Root cause analysis</li><br></ol><br><hr><br><h2>Considerações Éticas e Best Practices</h2></p>\n\n<h3>Governança de IA em QA</h3>\n\n<h4>Princípios</h4>\n<ol><li><strong>Transparência</strong> - Documente como a IA toma decisões</li>\n<li><strong>Responsabilidade</strong> - Humanos mantêm responsabilidade final</li>\n<li><strong>Fairness</strong> - Evite viés em modelos</li>\n<li><strong>Privacidade</strong> - Proteja dados sensíveis</li>\n<li><strong>Segurança</strong> - Proteja modelos contra ataques</li>\n</ol>\n<h4>Checklist de Governança</h4>\n<ol><li>[ ] Política de uso de IA em QA documentada</li>\n<li>[ ] Processos de revisão de decisões de IA</li>\n<li>[ ] Documentação de modelos utilizados</li>\n<li>[ ] Plano de contingência para falhas de IA</li>\n<li>[ ] Treinamento de equipe em uso responsável</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A IA está transformando fundamentalmente a QA, oferecendo oportunidades sem precedentes para aumentar eficiência, cobertura e qualidade. Embora a adoção em escala ainda seja um desafio, organizações que investem estrategicamente em IA para QA estão obtendo vantagens competitivas significativas.</p>\n\n<p><strong>Resumo dos Principais Aprendizados:</strong></p>\n\n<p>✅ IA pode reduzir tempo de teste em 40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}  <br>✅ GenAI está sendo buscada por 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações, mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram em escala  <br>✅ Ferramentas como Playwright, Applitools e Testim estão liderando a adoção  <br>✅ Implementação requer estratégia, não apenas ferramentas  <br>✅ Futuro aponta para testes autônomos e manutenção preditiva</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem toda organização precisa de todas as capacidades</li><br><li><strong>Comece pequeno</strong> - Pilotos controlados são mais eficazes</li><br><li><strong>Meça resultados</strong> - Métricas são essenciais</li><br><li><strong>Treine sua equipe</strong> - Competências em IA são necessárias</li><br><li><strong>Governarize</strong> - Adote práticas éticas desde o início</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre IA em QA</h3></p>\n\n<p><strong>P: A IA vai substituir testadores humanos?</strong>  <br>R: Não. A IA complementa o trabalho humano, permitindo que testadores foquem em atividades estratégicas, exploratory testing e design de testes.</p>\n\n<p><strong>P: Qual é o ROI da implementação de IA em QA?</strong>  <br>R: O ROI típico é de 200-500{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em 12-18 meses, considerando redução de tempo de teste, aumento de cobertura e redução de defeitos em produção.</p>\n\n<p><strong>P: Preciso de especialistas em dados para implementar IA em QA?</strong>  <br>R: Não necessariamente. Muitas ferramentas são \"plug-and-play\" e não requerem conhecimento de ML. No entanto, para implementações avançadas, especialistas são úteis.</p>\n\n<p><strong>P: Quais são os principais riscos do uso de IA em QA?</strong>  <br>R: Os principais riscos incluem: dependência excessiva, viés em modelos, falta de transparência e custos inesperados de manutenção.</p>\n\n<p><strong>P: Quando devo começar a usar IA em QA?</strong>  <br>R: Se você tem mais de 100 testes automatizados ou gastando mais de 20 horas/semana em QA, é um bom momento para avaliar ferramentas de IA.</p>\n\n<hr>\n<em>Fonte: World Quality Report 2025, Software Testing Magazine, Gartner Research, IEEE Software</em>', 'Inteligência Artificial em Quality Assurance: Guia Completo para 2025-2026', '', 'inherit', 'closed', 'closed', '', '181-revision-v1', '', '', '2026-07-06 22:41:50', '2026-07-07 01:41:50', '', '181', 'http://localhost:8082/ideiasti/?p=451', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('452', '0', '2026-07-06 22:55:46', '2026-07-07 01:55:46', '<h2>Introdução</h2>\n\n<p>O <strong>Blog QA Brasil</strong> valoriza sua privacidade. Esta Política de Privacidade descreve como coletamos, usamos, armazenamos e protegemos seus dados pessoais quando você utiliza nosso site, em conformidade com a <strong>Lei Geral de Proteção de Dados (LGPD - Lei nº 13.709/2018)</strong>.</p>\n\n<p>Última atualização: Julho de 2026</p>\n\n<hr>\n<h2>1. Dados que Coletamos</h2>\n\n<h3>1.1 Dados Fornecidos por Você</h3>\n\n<ul><li><strong>Comentários</strong> — Nome, e-mail e conteúdo do comentário</li><ol><li><strong>Newsletter</strong> — Nome e e-mail</li>\n<li><strong>Contato</strong> — Informações enviadas via formulários</li>\n<li><strong>Inscrições</strong> — Dados fornecidos ao se cadastrar em recursos</li>\n</ol>\n<h3>1.2 Dados Coletados Automaticamente</h3>\n<ol><li><strong>Cookies</strong> — Preferências de navegação e consentimento</li>\n<li><strong>Analytics</strong> — Páginas visitadas, tempo de navegação, origem do tráfego</li>\n<li><strong>Endereço IP</strong> — Coletado anonimamente para segurança e analytics</li>\n<li><strong>Navegador e dispositivo</strong> — Informações técnicas sobre sua visita</li>\n</ol>\n<hr>\n<h2>2. Como Usamos Seus Dados</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Finalidade</th><th>Base Legal (LGPD)</th></tr>\n<tr><td>Publicar comentários</td><td>Consentimento</td></tr>\n<tr><td>Enviar newsletter</td><td>Consentimento</td></tr>\n<tr><td>Melhorar o conteúdo</td><td>Interesse legítimo</td></tr>\n<tr><td>Segurança do site</td><td>Interesse legítimo</td></tr>\n<tr><td>Cumprir obrigações legais</td><td>Obrigação legal</td></tr>\n</table></figure>\n\n<hr>\n<h2>3. Cookies</h2>\n\n<h3>3.1 O Que São Cookies</h3>\n\n<p>Cookies são pequenos arquivos armazenados no seu navegador que nos ajudam a melhorar sua experiência de navegação.</p>\n\n<h3>3.2 Tipos de Cookies</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo</th><th>Finalidade</th><th>Armazenamento</th></tr>\n<tr><td><strong>Essenciais</strong></td><td>Funcionamento básico do site</td><td>Sessão</td></tr>\n<tr><td><strong>Funcionais</strong></td><td>Preferências do usuário</td><td>1 ano</td></tr>\n<tr><td><strong>Analíticos</strong></td><td>Métricas de uso</td><td>2 anos</td></tr>\n<tr><td><strong>Marketing</strong></td><td>Conteúdo relevante</td><td>2 anos</td></tr>\n</table></figure>\n\n<h3>3.3 Gerenciamento</h3>\n\n<p>Você pode controlar os cookies através das configurações do seu navegador ou através do nosso painel de preferências disponível no site.</p>\n\n<hr>\n<h2>4. Compartilhamento de Dados</h2>\n\n<h3>4.1 Com Quem Compartilhamos</h3>\n<ol><li><strong>Google Analytics</strong> — Métricas de audiência (anonimizadas)</li>\n<li><strong>Provedor de E-mail</strong> — Newsletter (apenas e-mail)</li>\n<li><strong>Autoridades legais</strong> — Quando exigido por lei</li>\n</ol>\n<h3>4.2 Compromisso</h3>\n\n<p><strong>Não vendemos</strong> seus dados pessoais para terceiros. <strong>Não compartilhamos</strong> dados além do necessário para os serviços descritos.</p>\n\n<hr>\n<h2>5. Seus Direitos (LGPD)</h2>\n\n<p>De acordo com a LGPD, você tem direito a:<br><ol><li><strong>Confirmação</strong> da existência de tratamento de dados</li><br><li><strong>Acesso</strong> aos seus dados pessoais</li><br><li><strong>Correção</strong> de dados incompletos ou incorretos</li><br><li><strong>Exclusão</strong> de dados tratados com consentimento</li><br><li><strong>Portabilidade</strong> dos dados</li><br><li><strong>Revogação</strong> do consentimento a qualquer momento</li><br></ol><br>Para exercer seus direitos, entre em contato pelo e-mail abaixo.</p>\n\n<hr>\n<h2>6. Armazenamento e Segurança</h2>\n\n<h3>6.1 Medidas de Segurança</h3>\n<ol><li>Criptografia SSL/TLS nas comunicações</li>\n<li>Acesso restrito a dados pessoais</li>\n<li>Revisões periódicas de segurança</li></ol></ul>\n\n<h3>6.2 Período de Armazenamento</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo de Dado</th><th>Período</th></tr>\n<tr><td>Comentários</td><td>Indeterminado (até solicitação de exclusão)</td></tr>\n<tr><td>Newsletter</td><td>Até descadastro</td></tr>\n<tr><td>Analytics</td><td>Anonimizado após 24 meses</td></tr>\n<tr><td>Logs de servidor</td><td>6 meses</td></tr>\n</table></figure>\n\n<hr>\n<h2>7. Direitos de Imagem</h2>\n\n<h3>7.1 Imagens do Site</h3>\n\n<p>Utilizamos imagens de fontes como <strong>Unsplash, Giphy e Pexels</strong> sob licenças permissivas. Quando aplicável, creditamos os autores.</p>\n\n<h3>7.2 Conteúdo do Usuário</h3>\n\n<p>Ao enviar comentários com imagens ou links, você é responsável pelo conteúdo enviado.</p>\n\n<hr>\n<h2>8. Alterações nesta Política</h2>\n\n<p>Reservamo-nos o direito de atualizar esta política a qualquer momento:<br><ol><li>Publicaremos a versão atualizada nesta página</li><br><li>Atualizaremos a data de \"Última atualização\"</li><br><li>Mudanças significativas serão notificadas via newsletter (quando aplicável)</li><br></ol><br><hr><br><h2>9. Contato</h2></p>\n\n<p>Para questões sobre privacidade e proteção de dados:</p>\n\n<p><strong>Blog Ideiasti</strong><br>E-mail: pcyasuic@outlook.com</p>\n\n<hr>\n<em>Esta Política de Privacidade foi elaborada em conformidade com a Lei Geral de Proteção de Dados (LGPD - Lei nº 13.709/2018).</em>', 'Política de Privacidade', '', 'publish', 'closed', 'closed', '', 'politica-de-privacidade', '', '', '2026-07-06 22:55:46', '2026-07-07 01:55:46', '', '0', 'http://localhost:8082/ideiasti/politica-de-privacidade/', '0', 'page', '', '0');
INSERT INTO `wp_posts` VALUES ('453', '0', '2026-07-06 22:51:34', '2026-07-07 01:51:34', '', 'giphy-4', '', 'inherit', 'open', 'closed', '', 'giphy-4', '', '', '2026-07-06 22:51:34', '2026-07-07 01:51:34', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-4.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('454', '0', '2026-07-06 22:51:37', '2026-07-07 01:51:37', '<p><strong>Meta Description:</strong> Conheça todos os tipos de testes de software: funcionais, não-funcionais, unitários, integração, sistema e mais. Guia completo com definições, objetivos e melhores práticas.</p>\n\n<hr>\n<h2>Introdução aos Tipos de Testes de Software</h2>\n\n<p>Os testes de software são uma atividade crítica no ciclo de desenvolvimento de sistemas. Compreender os diferentes tipos de testes e quando aplicá-los é fundamental para garantir a qualidade e confiabilidade das aplicações.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-4.gif\" alt=\"Pirâmide de Testes - Hierarquia de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este guia completo apresenta uma categorização detalhada dos principais tipos de testes de software, suas finalidades, características e quando cada um deve ser utilizado no seu projeto.</p>\n\n<hr>\n<h2>Categorização Geral dos Testes</h2>\n\n<p>Os testes de software podem ser divididos em duas categorias principais:</p>\n\n<h3>1. Testes Funcionais</h3>\n\n<p>Verificam se o software funciona conforme especificado, testando funcionalidades específicas e requisitos do negócio.</p>\n\n<h3>2. Testes Não-Funcionais</h3>\n\n<p>Avaliam características como performance, segurança, usabilidade e confiabilidade, que não estão relacionadas a funcionalidades específicas.</p>\n\n<hr>\n<h2>Testes Funcionais: Garantindo o Comportamento Correto</h2>\n\n<h3>Teste Unitário: A Base de Tudo</h3>\n\n<p>O teste unitário é o tipo mais básico de teste, onde cada unidade de código (geralmente uma função ou método) é testada isoladamente. Esta atividade é realizada durante as etapas de desenvolvimento pelos próprios desenvolvedores.</p>\n\n<h4>Objetivos dos Testes Unitários</h4>\n\n<ul><li><strong>Identificar falhas em componentes individuais</strong> - Detectar problemas cedo</li><ol><li><strong>Garantir que cada função trabalha corretamente</strong> - Validação granular</li>\n<li><strong>Facilitar a detecção precoce de defeitos</strong> - Redução de custos</li>\n<li><strong>Documentar o código</strong> - Testes como especificação executável</li>\n<li><strong>Permitir refactoring seguro</strong> - Confiança ao modificar código</li>\n</ol>\n<h4>Exemplo Prático em Python (pytest)</h4>\n\n<pre><code>def calcular_desconto(valor_original, percentual):\n    \"\"\"Calcula o valor do desconto.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual deve estar entre 0 e 100\")\n    desconto = valor_original * (percentual / 100)\n    return valor_original - desconto\n\n<p>def test_calcular_desconto_10_porcento():<br>    assert calcular_desconto(100, 10) == 90</p>\n\n<p>def test_calcular_desconto_50_porcento():<br>    assert calcular_desconto(200, 50) == 100</p>\n\n<p>def test_calcular_desconto_invalido():<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 150)<br></code></pre></p>\n\n<h4>Frameworks Populares para Testes Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Framework</th><th>Características</th></tr>\n<tr><td>Java</td><td>JUnit 5, TestNG</td><td>Mais popular, extensível</td></tr>\n<tr><td>JavaScript</td><td>Jest, Mocha</td><td>Rápido, Mocking fácil</td></tr>\n<tr><td>Python</td><td>pytest, unittest</td><td>Sintaxe simples, fixtures</td></tr>\n<tr><td>C#</td><td>xUnit, NUnit</td><td>.NET ecosystem</td></tr>\n<tr><td>Go</td><td>testing (stdlib)</td><td>Simples, integrado</td></tr>\n</table></figure>\n\n<h4>Melhores Práticas para Testes Unitários</h4>\n\n<p>✅ <strong>Teste apenas uma coisa de cada vez</strong> - Um assert por teste é ideal  <br>✅ <strong>Nomes descritivos</strong> - <code>test_deve_retornar_erro_quando_usuario_invalido</code>  <br>✅ <strong>Independência</strong> - Testes não devem depender uns dos outros  <br>✅ <strong>Rapidez</strong> - Unit tests devem executar em milissegundos  <br>✅ <strong>Isolamento</strong> - Use mocks para dependências externas</p>\n\n<hr>\n<h3>Teste de Integração: Verificando Conexões</h3>\n\n<p>O teste de integração verifica a comunicação entre diferentes módulos ou componentes do sistema. Este tipo de teste é crucial para garantir que as partes do sistema funcionam corretamente quando combinadas.</p>\n\n<h4>Características Principais</h4>\n<ol><li><strong>Valida interfaces e interações entre componentes</strong> - Fluxo de dados correto</li>\n<li><strong>Identifica problemas de comunicação</strong> - API mismatches, protocolos</li>\n<li><strong>Pode ser realizado de forma incremental ou big-bang</strong> - Duas abordagens</li>\n<li><strong>Testa camadas de persistência</strong> - Bancos de dados, APIs externas</li>\n</ol>\n<h4>Estratégias de Integração</h4>\n\n<p>##### 1. Big-Bang Integration</p>\n\n<p>Todos os componentes são integrados simultaneamente e testados juntos.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Simples de implementar</li><br><li>Bom para sistemas pequenos</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Difícil localização de erros</li><br><li>Todos os módulos devem estar prontos</li><br></ol><br>##### 2. Incremental Integration (Bottom-Up)</p>\n\n<p>Começa pelos módulos mais baixos e集成 progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Defeitos fáceis de isolar</li><br><li>Feedback contínuo</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode ter módulos de alto nível sem testes até o final</li><br></ol><br>##### 3. Incremental Integration (Top-Down)</p>\n\n<p>Começa pelos módulos de mais alto nível e desce progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Interface do usuário testada primeiro</li><br><li>Protótipo funcional rápido</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Módulos de baixo nível simulados (stubs)</li><br></ol><br><h4>Exemplo de Teste de Integração (REST API)</h4></p>\n\n<pre><code>import requests\nimport pytest\n\n<p>class TestUserAPI:<br>    BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>def test_criar_usuario(self):<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"senha123\"<br>        }<br>        response = requests.post(f\"{self.BASE_URL}/usuarios\", json=payload)</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data</p>\n\n<p>def test_listar_usuarios(self):<br>        response = requests.get(f\"{self.BASE_URL}/usuarios\")</p>\n\n<p>assert response.status_code == 200<br>        assert isinstance(response.json(), list)<br></code></pre></p>\n\n<hr>\n<h3>Teste de Sistema: Visão Holística</h3>\n\n<p>O teste de sistema avalia o software como um todo, verificando se todos os componentes funcionam juntos para atender aos requisitos definidos.</p>\n\n<h4>O Que é Testado no Nível de Sistema?</h4>\n<ol><li><strong>Integração entre todos os módulos</strong></li>\n<li><strong>Fluxos de negócio completos</strong></li>\n<li><strong>Conformidade com requisitos funcionais</strong></li>\n<li><strong>Interface com sistemas externos</strong></li>\n<li><strong>Performance do sistema integrado</strong></li>\n<li><strong>Segurança end-to-end</strong></li>\n</ol>\n<h4>Exemplo: Fluxo de E-commerce</h4>\n\n<pre><code>Usuário → Login → Navegação → Carrinho → Checkout → Pagamento → Confirmação\n    ↓         ↓          ↓           ↓           ↓            ↓            ↓\n Cadastro   Session   Produtos    Estoque     Frete        Stripe     E-mail\n   ↕          ↕         ↕          ↕          ↕            ↕          ↕\n  DB        Redis     DB/API     DB         Correios      API       SMTP\n</code></pre>\n\n<p>Cada seta representa um ponto de integração que deve ser testado no nível de sistema.</p>\n\n<hr>\n<h3>Teste de Aceitação: Validando com o Cliente</h3>\n\n<p>O teste de aceitação determina se um produto ou sistema atende às expectativas e requisitos do cliente. Este é frequentemente o último nível de teste antes da entrega正式.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto certo?\"</strong></p>\n\n<h4>Tipos de Teste de Aceitação</h4>\n\n<p>##### 1. Teste de Aceitação do Usuário (UAT)</p>\n\n<p>Usuários finais testam o sistema em um ambiente semelhante ao de produção.</p>\n\n<p>##### 2. Teste de Aceitação Operacional (OAT)</p>\n\n<p>Equipe de operações validabackup, recuperação, relatórios.</p>\n\n<p>##### 3. Teste de Aceitação Contratual</p>\n\n<p>Verifica se o sistema atende aos critérios contratuais.</p>\n\n<h4>Características do UAT</h4>\n<ol><li>Geralmente envolve cooperação ou feedback do cliente</li>\n<li>Atividade de validação com dados reais</li>\n<li>Foco na usabilidade e fluxo de negócio</li>\n<li>Pode revelar requisitos mal entendidos</li>\n<li>Último checkpoint antes do go-live</li>\n</ol>\n<hr>\n<h3>Teste Funcional: Verificando Funcionalidades</h3>\n\n<p>O teste funcional determina se um recurso ou sistema funciona corretamente sem problemas. Verifica o sistema em diferentes níveis para garantir que todos os cenários são cobertos.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto da forma certa?\"</strong></p>\n\n<h4>Técnicas de Teste Funcional</h4>\n\n<p>##### 1. Teste Baseado em Requisitos<br><ol><li>Cada requisito tem casos de teste correspondentes</li><br><li>Rastreabilidade entre requisitos e testes</li><br><li>Cobertura completa</li><br></ol><br>##### 2. Teste Baseado em Casos de Uso<br><ol><li>Cenários de usuário documentados</li><br><li>Fluxos principais e alternativos</li><br><li>Pré-condições e pós-condições</li><br></ol><br>##### 3. Teste de Tabela de Decisão<br><ol><li>Combinações de condições e ações</li><br><li>Útil para regras de negócio complexas</li><br></ol><br>##### 4. Teste de Transição de Estado<br><ol><li>Mudanças de estado do sistema</li><br><li>Diagramas de estado</li><br></ol><br><hr><br><h2>Testes Não-Funcionais: Avaliando Qualidade Oculta</h2></p>\n\n<h3>Teste de Desempenho: Rapidez e Estabilidade</h3>\n\n<figure><img src=\"https://media.giphy.com/media/l0Iy69RBwNTRF0MXi/giphy.gif\" alt=\"Performance Testing - Testes de Desempenho\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de desempenho avalia a velocidade, responsividade e estabilidade do sistema sob carga de trabalho. É crítico para garantir que a aplicação atende aos SLAs (Service Level Agreements).</p>\n\n<h4>Subtipo 1: Teste de Carga (Load Testing)</h4>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas.</p>\n\n<p><strong>Métricas Coletadas:</strong><ol><li>Tempo de resposta (média, p95, p99)</li><br><li>Throughput (requisições por segundo)</li><br><li>Utilização de recursos (CPU, memória, disco)</li><br><li>Taxa de erros</li><br></ol><br><strong>Ferramentas Populares:</strong><ol><li>JMeter</li><br><li>Gatling</li><br><li>k6</li><br><li>Locust</li><br></ol><br><h4>Subtipo 2: Teste de Estresse (Stress Testing)</h4></p>\n\n<p>Avalia os limites do sistema além da capacidade normal para identificar o ponto de quebra.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar capacidade máxima</li><br><li>Verificar comportamento sob overload</li><br><li>Medir tempo de recuperação</li><br><li>Validar failovers</li><br></ol><br><h4>Subtipo 3: Teste de Resistência (Soak Testing)</h4></p>\n\n<p>Executa o sistema sob carga por períodos prolongados para identificar degradação gradual.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Conexões não fechadas</li><br><li>Acúmulo de logs</li><br><li>Degradação de performance</li><br></ol><br><h4>Subtipo 4: Teste de Pico (Spike Testing)</h4></p>\n\n<p>Avalia reações do sistema a picos súbitos de carga.</p>\n\n<p><strong>Cenário Exemplo:</strong><br><pre><code>Carga normal: 1000 usuários<br>Pico: 5000 usuários em 10 segundos<br>Recovery: Voltar para 1000 usuários<br></code></pre></p>\n\n<h4>Ferramentas de Teste de Desempenho</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>JMeter</strong></td><td>Open Source</td><td>Java</td><td>Enterprise, complexo</td></tr>\n<tr><td><strong>Gatling</strong></td><td>Open Source</td><td>Scala</td><td>DevOps, CI/CD</td></tr>\n<tr><td><strong>k6</strong></td><td>Open Source</td><td>JavaScript</td><td>Moderno, extensível</td></tr>\n<tr><td><strong>Locust</strong></td><td>Open Source</td><td>Python</td><td>Python teams</td></tr>\n<tr><td><strong>LoadRunner</strong></td><td>Comercial</td><td>Various</td><td>Enterprise</td></tr>\n</table></figure>\n\n<h4>Exemplo de Teste de Carga com k6</h4>\n\n<pre><code>// script.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },  // Ramp-up<br>    { duration: \'5m\', target: 100 },  // Steady state<br>    { duration: \'2m\', target: 200 },  // Spike<br>    { duration: \'5m\', target: 200 },  // Steady state<br>    { duration: \'2m\', target: 0 },    // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // Menos de 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/produtos\');<br>  check(res, {<br>    \'status é 200\': (r) =&gt; r.status === 200,<br>    \'tempo  r.timings.duration &lt; 500,<br>  });<br>  sleep(1);<br>}<br></code></pre></p>\n\n<hr>\n<h3>Teste de Segurança: Protegendo Dados e Sistemas</h3>\n\n<figure><img src=\"https://media.giphy.com/media/1qfDU4MJv3jWu34hEx/giphy.gif\" alt=\"Security Testing - Escudo de Segurança\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de segurança identifica vulnerabilidades e garante proteção de dados. Em um mundo cada vez mais digital, a segurança é prioridade.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n\n<p>##### 1. Teste de Penetração (Pen Test)</p>\n\n<p>Simula ataques para identificar vulnerabilidades antes que hackers maliciosos o façam.</p>\n\n<p><strong>Metodologias:</strong><ol><li>OWASP Testing Guide</li><br><li>PTES (Penetration Testing Execution Standard)</li><br><li>NIST SP 800-115</li><br></ol><br><strong>Tipos de Pentest:</strong><ol><li><strong>Black Box:</strong> Sem conhecimento prévio</li><br><li><strong>White Box:</strong> Código e documentação</li><br><li><strong>Gray Box:</strong> Conhecimento parcial</li><br></ol><br>##### 2. Varredura de Vulnerabilidade</p>\n\n<p>Identifica pontos fracos conhecidos através de scanning automatizado.</p>\n\n<p><strong>Ferramentas:</strong><ol><li>Nessus</li><br><li>OpenVAS</li><br><li>Qualys</li><br><li>Nexpose</li><br></ol><br>##### 3. Teste de Firewall e WAF</p>\n\n<p>Verifica configurações de segurança de firewalls e Web Application Firewalls.</p>\n\n<p><strong>O que testar:</strong><ol><li>Regras de firewall</li><br><li>Block de IPs maliciosos</li><br><li>Detecção de SQL Injection</li><br><li>Proteção XSS</li><br></ol><br>##### 4. Análise de Código Estático (SAST)</p>\n\n<p>Detecta vulnerabilidades no código-fonte sem executá-lo.</p>\n\n<p><strong>Ferramentas SAST:</strong><ol><li>SonarQube</li><br><li>Checkmarx</li><br><li>Fortify</li><br><li>Snyk Code</li><br></ol><br>##### 5. Análise de Componentes (SCA)</p>\n\n<p>Identifica vulnerabilidades em bibliotecas e dependências.</p>\n\n<p><strong>Ferramentas SCA:</strong><ol><li>Snyk</li><br><li>OWASP Dependency-Check</li><br><li>WhiteSource</li><br><li>Dependabot</li><br></ol><br><h4>OWASP Top 10: Vulnerabilidades Mais Comuns</h4><br><ol><li><strong>A01 - Broken Access Control</strong></li><br><li><strong>A02 - Cryptographic Failures</strong></li><br><li><strong>A03 - Injection</strong></li><br><li><strong>A04 - Insecure Design</strong></li><br><li><strong>A05 - Security Misconfiguration</strong></li><br><li><strong>A06 - Vulnerable Components</strong></li><br><li><strong>A07 - Authentication Failures</strong></li><br><li><strong>A08 - Software and Data Integrity Failures</strong></li><br><li><strong>A09 - Security Logging Failures</strong></li><br><li><strong>A10 - SSRF (Server-Side Request Forgery)</strong></li><br></ol><br><hr><br><h3>Teste de Usabilidade: Experiência do Usuário</h3></p>\n\n<p>Avalia a facilidade de uso e a experiência do usuário com o sistema. O teste de usabilidade é essencial para garantir que os usuários consigam realizar suas tarefas de forma eficiente.</p>\n\n<h4>Critérios de Usabilidade</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Critério</th><th>Definição</th><th>Métrica</th></tr>\n<tr><td><strong>Eficácia</strong></td><td>Usuário consegue completar tarefa?</td><td>Taxa de sucesso</td></tr>\n<tr><td><strong>Eficiência</strong></td><td>Quanto tempo leva?</td><td>Tempo de tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Usuário gostou?</td><td>Questionários SUS</td></tr>\n<tr><td><strong>Aprendizagem</strong></td><td>Quanto tempo para aprender?</td><td>Tempo até proficiência</td></tr>\n<tr><td><strong>Memorização</strong></td><td>Lembra como usar?</td><td>Retenção após pausa</td></tr>\n</table></figure>\n\n<h4>Métodos de Teste de Usabilidade</h4>\n<ol><li><strong>Testes com Usuários</strong> - Sessões gravadas com participantes</li>\n<li><strong>Análise Heurística</strong> - Avaliação por especialistas</li>\n<li><strong>Questionários</strong> - SUS, SEQ, NPS</li>\n<li><strong>Eye Tracking</strong> - Rastreamento ocular</li>\n<li><strong>Análise de Tarefas</strong> - Tempos e erros</li>\n</ol>\n<h4>Frameworks de Avaliação</h4>\n<ol><li><strong>Nielsen\'s Heurísticas</strong> (10 princípios)</li>\n<li><strong>ISO 9241-11</strong> (Usabilidade)</li>\n<li><strong>WCAG 2.1</strong> (Acessibilidade)</li>\n</ol>\n<hr>\n<h3>Teste de Compatibilidade: Funciona em Todo Lugar?</h3>\n\n<p>Verifica se o software funciona em diferentes ambientes, navegadores e dispositivos.</p>\n\n<h4>Tipos de Teste de Compatibilidade</h4>\n\n<p>##### 1. Teste de Navegador (Cross-Browser)<br><ol><li>Chrome, Firefox, Safari, Edge</li><br><li>Diferentes versões</li><br><li>Modos de compatibilidade</li><br></ol><br>##### 2. Teste Mobile<br><ol><li>iOS (iPhone, iPad)</li><br><li>Android (diferentes fabricantes)</li><br><li>Diferentes tamanhos de tela</li><br><li>Diferentes versões de OS</li><br></ol><br>##### 3. Teste de Sistema Operacional<br><ol><li>Windows 10, 11</li><br><li>macOS (versões diferentes)</li><br><li>Linux (distribuições populares)</li><br></ol><br>##### 4. Teste de Hardware<br><ol><li>Diferentes processadores</li><br><li>Diferentes quantidades de RAM</li><br><li>Diferentes resoluções de tela</li><br></ol><br><h4>Ferramentas de Teste Cross-Browser</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Cobertura</th><th>Preço</th></tr>\n<tr><td>BrowserStack</td><td>3000+ dispositivos</td><td>$29+/mês</td></tr>\n<tr><td>Sauce Labs</td><td>1000+ dispositivos</td><td>$39+/mês</td></tr>\n<tr><td>LambdaTest</td><td>3000+ dispositivos</td><td>$15+/mês</td></tr>\n<tr><td>CrossBrowserTesting</td><td>1500+ dispositivos</td><td>$29+/mês</td></tr>\n</table></figure>\n\n<hr>\n<h3>Teste de Recuperação: Resistência a Falhas</h3>\n\n<p>Avalia a capacidade do sistema de se recuperar de falhas e disasters. É crucial para sistemas críticos que não podem ficar fora do ar.</p>\n\n<h4>Cenários de Teste</h4>\n<ol><li><strong>Falha de Hardware</strong></li>\n</ol>   - Perda de disco\n   - Falha de memória\n   - Queda de servidor\n<ol><li><strong>Falha de Software</strong></li>\n</ol>   - Crash de aplicação\n   - Deadlock\n   - Exceções não tratadas\n<ol><li><strong>Falha de Rede</strong></li>\n</ol>   - Perda de conectividade\n   - Alta latência\n   - Timeout\n<ol><li><strong>Desastres</strong></li>\n</ol>   - Perda de datacenter\n   - Corrupção de dados\n   - Ataques DDoS\n\n<h4>Métricas de Recuperação</h4>\n<ol><li><strong>RTO (Recovery Time Objective):</strong> Tempo máximo para recuperação</li>\n<li><strong>RPO (Recovery Point Objective):</strong> Perda máxima de dados aceitável</li>\n<li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li>\n<li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li>\n</ol>\n<hr>\n<h2>Testes de Regressão: Mantendo a Qualidade</h2>\n\n<p>Executados sempre que o código é modificado para garantir que alterações não introduzam novos defeitos. Este é um dos tipos de teste mais importantes e frequentemente executados.</p>\n\n<h3>Quando Executar Testes de Regressão</h3>\n\n<p>✅ Após cada release de software  <br>✅ Após correção de bugs  <br>✅ Após atualizações de dependências  <br>✅ Após refactoring de código  <br>✅ Antes do deploy de produção</p>\n\n<h3>Estratégias de Testes de Regressão</h3>\n\n<h4>1. Regressão Completa</h4>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura total</li><br><li>Alta confiança</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Tempo longo</li><br><li>Custo elevado</li><br></ol><br><h4>2. Regressão Seletiva</h4></p>\n\n<p>Seleciona testes relevantes baseados em mudanças.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Mais rápido</li><br><li>Mais econômico</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode perder cobertura</li><br></ol><br><h4>3. Regressão Prioritária</h4></p>\n\n<p>Executa testes por prioridade (críticos &gt; altos &gt; médios &gt; baixos).</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura do crítico rápido</li><br><li>Decisões baseadas em risco</li><br></ol><br><h3>Automação de Testes de Regressão</h3></p>\n\n<p>A automação é essencial para testes de regressão eficazes:</p>\n\n<p><strong>Benefícios:</strong><ol><li>Execução frequente</li><br><li>Resultados consistentes</li><br><li>Rapidez</li><br><li>Cobertura ampla</li><br></ol><br><strong>Ferramentas Recomendadas:</strong><ol><li>Selenium WebDriver</li><br><li>Playwright</li><br><li>Cypress</li><br><li>Appium (mobile)</li><br><li>RestAssured (API)</li><br></ol><br><hr><br><h2>Pirâmide de Testes: Arquitetura Ideal</h2></p>\n\n<p>A pirâmide de testes é um conceito fundamental que guia a distribuição dos tipos de teste:</p>\n\n<pre><code>                    /\n                   /  \n                  / E2E        ← Poucos testes E2E (lentos, caros)\n                 /      \n                /Integração   ← Alguns testes de integração\n               /            \n              /  Unitários     ← Muitos testes unitários (rápidos, baratos)\n             /________________\n</code></pre>\n\n<h3>Proporções Ideais</h3>\n<ol><li><strong>Unitários:</strong> 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>Integração:</strong> 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>E2E:</strong> 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Compreender os diferentes tipos de testes de software é fundamental para construir uma estratégia de QA eficaz. Cada tipo de teste tem seu propósito específico e deve ser aplicado no momento adequado do ciclo de desenvolvimento.</p>\n\n<p><strong>Resumo dos Tipos de Testes:</strong></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Categoria</th><th>Tipo</th><th>Quando Usar</th><th>Objetivo</th></tr>\n<tr><td><strong>Funcional</strong></td><td>Unitário</td><td>Desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Integração</td><td>Pós-unitário</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Sistema</td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Aceitação</td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Performance</td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Segurança</td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Usabilidade</td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n</table></figure>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem todo projeto precisa de todos os tipos</li><br><li><strong>Priorize</strong> - Comece com unitários e integração</li><br><li><strong>Automatize</strong> - Regressão deve ser automática</li><br><li><strong>Meça</strong> - Cobertura, tempo, defeitos encontrados</li><br><li><strong>Melhore</strong> - Itere constantemente</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre Tipos de Testes</h3></p>\n\n<p><strong>P: Quantos tipos de testes existem?</strong>  <br>R: Existem dozens de tipos de testes classificados de diferentes formas. Os principais são funcionais e não-funcionais, cada um com subtipos específicos.</p>\n\n<p><strong>P: Qual a diferença entre teste de sistema e teste de aceitação?</strong>  <br>R: Teste de sistema verifica se o sistema atende aos requisitos técnicos. Teste de aceitação verifica se o sistema atende às expectativas do usuário/cliente.</p>\n\n<p><strong>P: Testes manuais podem ser substituídos por automatizados?</strong>  <br>R: Não completamente. Testes manuais são essenciais para exploratory testing, UX e cenários complexos. A automação complementa, não substitui.</p>\n\n<p><strong>P: Quando devo começar a testar?</strong>  <br>R: O mais cedo possível! O conceito de Shift-Left recomenda testes desde as primeiras fases do desenvolvimento.</p>\n\n<p><strong>P: Qual a ordem ideal de execução dos testes?</strong>  <br>R: Unitários → Integração → Sistema → Aceitação. Cada nível depende do anterior.</p>\n\n<hr>\n<em>Fonte: Selenium.dev, Atlassian, Vericode, ISTQB, OWASP</em>', 'Tipos de Testes de Software: Guia Completo com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '179-revision-v1', '', '', '2026-07-06 22:51:37', '2026-07-07 01:51:37', '', '179', 'http://localhost:8082/ideiasti/?p=454', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('455', '0', '2026-07-06 22:51:40', '2026-07-07 01:51:40', '', 'giphy-5', '', 'inherit', 'open', 'closed', '', 'giphy-5', '', '', '2026-07-06 22:51:40', '2026-07-07 01:51:40', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-5.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('456', '0', '2026-07-06 22:51:40', '2026-07-07 01:51:40', '<p><strong>Meta Description:</strong> Descubra como a Inteligência Artificial está revolucionando a QA: automação inteligente, geração de testes, detecção de anomalias e manutenção preditiva. Guia completo para profissionais.</p>\n\n<hr>\n<h2>Estado Atual da IA em QA</h2>\n\n<p>O <strong>World Quality Report 2025</strong> revela dados impressionantes: quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão ativamente buscando GenAI</strong> em práticas de Quality Engineering (QE), mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} alcançaram implementação em escala empresarial.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-5.gif\" alt=\"AI Brain - Inteligência Artificial em QA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Esta lacuna entre interesse e implementação representa uma oportunidade significativa para profissionais e organizações que souberem aproveitar efetivamente essas tecnologias.</p>\n\n<hr>\n<h2>Por Que a Adoção de IA em QA Está Crescendo?</h2>\n\n<h3>Drivers de Adoção</h3>\n<ol><li><strong>Volume de testes crescente</strong> - Sistemas mais complexos exigem mais testes</li>\n<li><strong>Pressure de velocidade</strong> - CI/CD demanda execuções mais rápidas</li>\n<li><strong>Escassez de profissionais</strong> - Demanda supera oferta de testadores</li>\n<li><strong>Qualidade em produção</strong> - Necessidade de monitoramento contínuo</li>\n<li><strong>Custos crescentes</strong> - Automação inteligente reduz despesas</li>\n</ol>\n<h3>Benefícios Comprovados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Impacto da IA</th></tr>\n<tr><td>Redução de tempo de teste</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de custos de QA</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Melhoria em cobertura</td><td>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Detecção precoce de bugs</td><td>3-5x mais cedo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Desafios de Adoção de IA em QA</h2>\n\n<h3>1. Desalinhamento Estratégico</h3>\n\n<p>Existe um hiato crescente entre o interesse organizacional em GenAI e a prontidão real para adoção efetiva dentro de QE. O caminho da experimentação para implementação é mais complexo do que o antecipado.</p>\n\n<h4>Sinais de Desalinhamento</h4>\n\n<ul><li>GenAI vista como \"solução mágica\" sem estratégia clara</li><ol><li>Falta de alinhamento entre TI e negócios</li>\n<li>Expectativas irreais sobre capacidades</li>\n<li>Subestimação de esforço de integração</li>\n</ol>\n<h3>2. Complexidade de Implementação</h3>\n\n<p>A implementação de IA em QA requer alinhamento entre inovação operacional e oversight estratégico. Desafios incluem:</p>\n\n<h4>Desafios Técnicos</h4>\n<ol><li>Integração com sistemas legados</li>\n<li>Qualidade dos dados de treinamento</li>\n<li>Escolha de modelos adequados</li>\n<li>Manutenção de modelos em produção</li>\n</ol>\n<h4>Desafios Organizacionais</h4>\n<ol><li>Resistência cultural</li>\n<li>Falta de competências</li>\n<li>Processos não adaptados</li>\n<li>Governança de IA</li>\n</ol>\n<h3>3. Questões Éticas e de Governança</h3>\n<ol><li>Viés em modelos de IA</li>\n<li>Transparência nas decisões</li>\n<li>Responsabilidade por falhas</li>\n<li>Conformidade regulatória</li>\n</ol>\n<hr>\n<h2>Aplicações de IA em QA: Casos de Uso Detalhados</h2>\n\n<h3>1. Geração Automatizada de Testes</h3>\n\n<p>IA pode gerar casos de teste automaticamente baseados em requisitos e código. Esta é uma das aplicações mais promissoras.</p>\n\n<figure><img src=\"https://media.giphy.com/media/VbZ0cWw6cVPMM/giphy.gif\" alt=\"Automação de Testes com IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Requisitos → Análise de NLP → Cenários de Teste → Casos de Teste\n    ↓                                                        ↓\n Código → Análise Estática → Cobertura → Testes Sugeridos\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de unit tests</td><td>Diffblue</td></tr>\n<tr><td><strong>Testim</strong></td><td>Testes E2E com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>Automação sem código com IA</td><td>Avo Automation</td></tr>\n</table></figure>\n\n<h4>Exemplo: Geração de Testes com GenAI</h4>\n\n<pre><code># Exemplo conceitual de como IA pode gerar testes\nimport openai\n\n<p>def gerar_testes_para_requisito(requisito):<br>    prompt = f\"\"\"<br>    Gere casos de teste para o seguinte requisito:</p>\n\n<p>Requisito: {requisito}</p>\n\n<p>Formato de saída (JSON):<br>    {{<br>        \"casos_de_teste\": [<br>            {{<br>                \"id\": \"CT-001\",<br>                \"titulo\": \"...\",<br>                \"pre_condicoes\": [...],<br>                \"passos\": [...],<br>                \"dados_teste\": {{...}},<br>                \"resultado_esperado\": \"...\"<br>            }}<br>        ]<br>    }}<br>    \"\"\"</p>\n\n<p>response = openai.chat.completions.create(<br>        model=\"gpt-4\",<br>        messages=[{\"role\": \"user\", \"content\": prompt}]<br>    )</p>\n\n<p>return json.loads(response.choices[0].message.content)<br></code></pre></p>\n\n<h3>2. Detecção de Anomalias</h3>\n\n<p>Algoritmos de machine learning identificam padrões incomuns que indicam defeitos, revolucionando o monitoramento de qualidade.</p>\n\n<h4>Técnicas Utilizadas</h4>\n\n<p>##### Análise de Séries Temporais<br><ol><li>Identificação de anomalias em métricas de performance</li><br><li>Detecção de degradação gradual</li><br><li>Alertas proativos sobre problemas</li><br></ol><br>##### Clustering<br><ol><li>Agrupamento de testes similares</li><br><li>Identificação de testes atípicos</li><br><li>Detecção de padrões de falha</li><br></ol><br>##### Redes Neurais<br><ol><li>Detecção de padrões complexos</li><br><li>Aprendizado de comportamentos normais</li><br><li>Previsão de falhas</li><br></ol><br><h4>Ferramentas de Detecção de Anomalias</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Aplicação</th></tr>\n<tr><td><strong>Elastic APM</strong></td><td>APM</td><td>Detecção de anomalias em produção</td></tr>\n<tr><td><strong>Datadog</strong></td><td>Monitoring</td><td>ML para métricas</td></tr>\n<tr><td><strong>New Relic</strong></td><td>APM</td><td>Detecção inteligente</td></tr>\n<tr><td><strong>Grafana + Loki</strong></td><td>Logging</td><td>Análise de logs com ML</td></tr>\n</table></figure>\n\n<h3>3. Manutenção Inteligente de Testes</h3>\n\n<p>IA ajuda a identificar e remover testes obsoletos ou flaky, mantendo a suite de testes saudável.</p>\n\n<h4>Problemas que a IA Resolve</h4>\n\n<p><strong>Testes Flaky (Instáveis)</strong><br><ol><li>Identificação de padrões que causam instabilidade</li><br><li>Predição de quais testes podem falhar</li><br><li>Sugestões de correções</li><br><li>Quarentena automática</li><br></ol><br><strong>Testes Obsoletos</strong><br><ol><li>Detecção de funcionalidades removidas</li><br><li>Identificação de código não coberto</li><br><li>Sugestões de remoção segura</li><br></ol><br><h4>Exemplo de Detecção de Testes Flaky</h4></p>\n\n<pre><code># Sistema simplificado de detecção de testes flaky\nclass FlakyTestDetector:\n    def __init__(self):\n        self.test_history = {}\n        self.ml_model = load_trained_model()\n\n<p>def analyze_test(self, test_name, execution_history):<br>        features = self.extract_features(execution_history)<br>        flaky_probability = self.ml_model.predict_proba([features])[0]</p>\n\n<p>if flaky_probability &gt; 0.7:<br>            return {<br>                \"test\": test_name,<br>                \"flaky_probability\": flaky_probability,<br>                \"recommendation\": \"QUARANTINE\",<br>                \"reasons\": self.explain_prediction(features)<br>            }<br>        return {\"test\": test_name, \"flaky_probability\": flaky_probability}</p>\n\n<p>def extract_features(self, history):<br>        return [<br>            history.success_rate,<br>            history.avg_duration,<br>            history.recent_failures,<br>            history.environment_changes,<br>            history.dependency_changes<br>        ]<br></code></pre></p>\n\n<h3>4. Análise de Código Estático com IA</h3>\n\n<p>Identifica potenciais problemas de qualidade antes da execução, usando análise semântica avançada.</p>\n\n<h4>Capacidades Avançadas</h4>\n<ol><li><strong>Detecção de vulnerabilidades</strong> - OWASP Top 10</li>\n<li><strong>Análise de dependências</strong> - Bibliotecas desatualizadas</li>\n<li><strong>Code smells</strong> - Padrões problemáticos</li>\n<li><strong>Débito técnico</strong> - Métricas de qualidade</li>\n</ol>\n<h4>Ferramentas com IA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Capacidades IA</th><th>Integração</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Débito técnico, code smells</td><td>CI/CD</td></tr>\n<tr><td><strong>Snyk</strong></td><td>Vulnerabilidades, licenças</td><td>IDE, CI</td></tr>\n<tr><td><strong>CodeClimate</strong></td><td>Quality, maintainability</td><td>GitHub</td></tr>\n<tr><td><strong>DeepSource</strong></td><td>Análise estática com ML</td><td>Git</td></tr>\n</table></figure>\n\n<h3>5. Testes Visuais Automatizados</h3>\n\n<p>Comparação de interfaces visuais usando visão computacional para detectar regressões.</p>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Página Capturada → Modelo de Visão Computacional → Comparação com Baseline\n     ↓                          ↓                                    ↓\n  Screenshots           Detecção de Elementos           Diff Visual\n                                            ↓\n                                    Alertas de Regressão\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tecnologia</th><th>Diferencial</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Visual AI</td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de precisão</td></tr>\n<tr><td><strong> Percy</strong></td><td>Visual testing</td><td>Integração simples</td></tr>\n<tr><td><strong>Chromatic</strong></td><td>Visual regression</td><td>Para Storybook</td></tr>\n<tr><td><strong>Lost Pixel</strong></td><td>Open source</td><td>Self-hosted</td></tr>\n</table></figure>\n\n<h3>6. Oráculos de Teste Baseados em IA</h3>\n\n<p>Validação de resultados usando modelos treinados para determinar se o comportamento está correto.</p>\n\n<h4>Tipos de Oráculos</h4>\n<ol><li><strong>Oráculo de Imagem</strong> - Validação visual de UI</li>\n<li><strong>Oráculo de Texto</strong> - Análise de conteúdo</li>\n<li><strong>Oráculo de Comportamento</strong> - Detecção de anomalias</li>\n<li><strong>Oráculo de Dados</strong> - Validação de datasets</li>\n</ol>\n<hr>\n<h2>Ferramentas de IA para QA: Comparativo</h2>\n\n<h3>Plataformas Completas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Testim</strong></td><td>Automação inteligente E2E</td><td>$600+/mês</td><td>Equipes enterprise</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Automação com ML</td><td>Sob consulta</td><td>Escala enterprise</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>$500+/mês</td><td>CI/CD integrado</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>No-code com IA</td><td>Sob consulta</td><td>Enterprise</td></tr>\n<tr><td><strong>Perfecto</strong></td><td>Testes mobile/web com IA</td><td>Sob consulta</td><td>Mobile testing</td></tr>\n</table></figure>\n\n<h3>Ferramentas Especializadas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais</td><td>$100+/mês</td><td>UI testing</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Unit tests</td><td>$299/assinante</td><td>Dev teams</td></tr>\n<tr><td><strong>Snyk</strong></td><td>SCA</td><td>Grátis + Pro</td><td>Developers</td></tr>\n<tr><td><strong>SonarCloud</strong></td><td>SAST</td><td>Grátis + Pro</td><td>CI/CD</td></tr>\n</table></figure>\n\n<h3>Ferramentas Emerging (2025-2026)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Status</th></tr>\n<tr><td><strong>CodiumAI</strong></td><td>Testes gerados automaticamente</td><td>Beta</td></tr>\n<tr><td><strong>Mutable AI</strong></td><td>Code review + tests</td><td>Beta</td></tr>\n<tr><td><strong>Dagger</strong></td><td>CI/CD programável</td><td>GA</td></tr>\n<tr><td><strong>Trunk</strong></td><td>Linting inteligente</td><td>GA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando IA em QA: Roadmap Prático</h2>\n\n<h3>Fase 1: Avaliação e Planejamento (1-2 meses)</h3>\n\n<h4>Checklist de Avaliação</h4>\n<ol><li>[ ] Mapeamento de processos atuais de QA</li>\n<li>[ ] Identificação de pontos de dor</li>\n<li>[ ] Análise de ROI potencial</li>\n<li>[ ] Avaliação de maturidade tecnológica</li>\n<li>[ ] Levantamento de stakeholders</li>\n</ol>\n<h4>Métricas de Baseline</h4>\n\n<p>Antes de implementar, estabeleça métricas de referência:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Ferramenta</th></tr>\n<tr><td>Tempo de teste</td><td>Duração de suite</td><td>CI/CD logs</td></tr>\n<tr><td>Cobertura de teste</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>Coverage tools</td></tr>\n<tr><td>Taxa de defeitos</td><td>Bugs em produção</td><td>Bug tracker</td></tr>\n<tr><td>Testes flaky</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas instáveis</td><td>CI/CD</td></tr>\n<tr><td>Custo de QA</td><td>$/teste executado</td><td>Financeiro</td></tr>\n</table></figure>\n\n<h3>Fase 2: Pilot (2-3 meses)</h3>\n\n<h4>Escolha do Piloto</h4>\n\n<p>Selecione um projeto ou área com:<br><ol><li>✅ Escopo controlado</li><br><li>✅ Equipe aberta a inovação</li><br><li>✅ Processos definidos</li><br><li>✅ Métricas disponíveis</li><br></ol><br><h4>Pilotos Recomendados</h4><br><ol><li><strong>Geração de unit tests</strong> - Diffblue, CodiumAI</li><br><li><strong>Testes visuais</strong> - Applitools</li><br><li><strong>Detecção de flaky tests</strong> - Ferramentas de CI</li><br><li><strong>Análise estática</strong> - SonarQube, Snyk</li><br></ol><br><h3>Fase 3: Expansão (3-6 meses)</h3></p>\n\n<h4>Escalar Sucesso</h4>\n<ol><li>Documente aprendizados</li>\n<li>Treine outras equipes</li>\n<li>Padronize processos</li>\n<li>Melhore integrações</li>\n</ol>\n<h4>KPIs de Sucesso</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Meta (6 meses)</th></tr>\n<tr><td>Redução de tempo de teste</td><td>30-40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Aumento de cobertura</td><td>20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de defeitos em prod</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>ROI positivo</td><td>Sim</td></tr>\n</table></figure>\n\n<h3>Fase 4: Maturidade (6-12 meses)</h3>\n\n<h4>Implementação Enterprise</h4>\n<ol><li>Integração completa com CI/CD</li>\n<li>IA em produção (monitoramento)</li>\n<li>Maintenance automatizado</li>\n<li>Reporting avançado</li>\n</ol>\n<hr>\n<h2>Futuro da IA em QA: Tendências 2026-2028</h2>\n\n<h3>1. Testes Autônomos</h3>\n\n<p>Sistemas que automaticamente:<br><ol><li>Geram testes baseados em requisitos</li><br><li>Executam testes continuamente</li><br><li>Detectam e reportam falhas</li><br><li>Propõem correções</li><br></ol><br><h3>2. Manutenção Preditiva</h3></p>\n\n<p>IA que prevê:<br><ol><li>Quando testes vão falhar</li><br><li>Quando código precisa de mais testes</li><br><li>Quando componentes estão em risco</li><br><li>Quando fazer refactoring</li><br></ol><br><h3>3. GenAI Nativa em QA</h3></p>\n\n<p>Modelos treinados especificamente para:<br><ol><li>Entender código e testes</li><br><li>Gerar código de teste</li><br><li>Analisar requisitos</li><br><li>Documentar testes</li><br></ol><br><h3>4. Testes em Produção com IA</h3></p>\n\n<p>Monitoramento inteligente:<br><ol><li>Detecção de anomalias em produção</li><br><li>Geração automática de testes de regressão</li><br><li>Validação de deployments</li><br><li>Root cause analysis</li><br></ol><br><hr><br><h2>Considerações Éticas e Best Practices</h2></p>\n\n<h3>Governança de IA em QA</h3>\n\n<h4>Princípios</h4>\n<ol><li><strong>Transparência</strong> - Documente como a IA toma decisões</li>\n<li><strong>Responsabilidade</strong> - Humanos mantêm responsabilidade final</li>\n<li><strong>Fairness</strong> - Evite viés em modelos</li>\n<li><strong>Privacidade</strong> - Proteja dados sensíveis</li>\n<li><strong>Segurança</strong> - Proteja modelos contra ataques</li>\n</ol>\n<h4>Checklist de Governança</h4>\n<ol><li>[ ] Política de uso de IA em QA documentada</li>\n<li>[ ] Processos de revisão de decisões de IA</li>\n<li>[ ] Documentação de modelos utilizados</li>\n<li>[ ] Plano de contingência para falhas de IA</li>\n<li>[ ] Treinamento de equipe em uso responsável</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A IA está transformando fundamentalmente a QA, oferecendo oportunidades sem precedentes para aumentar eficiência, cobertura e qualidade. Embora a adoção em escala ainda seja um desafio, organizações que investem estrategicamente em IA para QA estão obtendo vantagens competitivas significativas.</p>\n\n<p><strong>Resumo dos Principais Aprendizados:</strong></p>\n\n<p>✅ IA pode reduzir tempo de teste em 40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}  <br>✅ GenAI está sendo buscada por 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações, mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram em escala  <br>✅ Ferramentas como Playwright, Applitools e Testim estão liderando a adoção  <br>✅ Implementação requer estratégia, não apenas ferramentas  <br>✅ Futuro aponta para testes autônomos e manutenção preditiva</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem toda organização precisa de todas as capacidades</li><br><li><strong>Comece pequeno</strong> - Pilotos controlados são mais eficazes</li><br><li><strong>Meça resultados</strong> - Métricas são essenciais</li><br><li><strong>Treine sua equipe</strong> - Competências em IA são necessárias</li><br><li><strong>Governarize</strong> - Adote práticas éticas desde o início</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre IA em QA</h3></p>\n\n<p><strong>P: A IA vai substituir testadores humanos?</strong>  <br>R: Não. A IA complementa o trabalho humano, permitindo que testadores foquem em atividades estratégicas, exploratory testing e design de testes.</p>\n\n<p><strong>P: Qual é o ROI da implementação de IA em QA?</strong>  <br>R: O ROI típico é de 200-500{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em 12-18 meses, considerando redução de tempo de teste, aumento de cobertura e redução de defeitos em produção.</p>\n\n<p><strong>P: Preciso de especialistas em dados para implementar IA em QA?</strong>  <br>R: Não necessariamente. Muitas ferramentas são \"plug-and-play\" e não requerem conhecimento de ML. No entanto, para implementações avançadas, especialistas são úteis.</p>\n\n<p><strong>P: Quais são os principais riscos do uso de IA em QA?</strong>  <br>R: Os principais riscos incluem: dependência excessiva, viés em modelos, falta de transparência e custos inesperados de manutenção.</p>\n\n<p><strong>P: Quando devo começar a usar IA em QA?</strong>  <br>R: Se você tem mais de 100 testes automatizados ou gastando mais de 20 horas/semana em QA, é um bom momento para avaliar ferramentas de IA.</p>\n\n<hr>\n<em>Fonte: World Quality Report 2025, Software Testing Magazine, Gartner Research, IEEE Software</em>', 'Inteligência Artificial em Quality Assurance: Guia Completo para 2025-2026', '', 'inherit', 'closed', 'closed', '', '181-revision-v1', '', '', '2026-07-06 22:51:40', '2026-07-07 01:51:40', '', '181', 'http://localhost:8082/ideiasti/?p=456', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('457', '0', '2026-07-06 22:52:03', '2026-07-07 01:52:03', '<h2>Artigos Principais</h2>\n<ol><li><a href=\"01_introducao_qualidade_software.md\">Introdução à Qualidade de Software</a> - Fundamentos de QA, importância e objetivos</li>\n<li><a href=\"02_tendencias_qa_2025.md\">Tendências de QA para 2025</a> - IA, automação, shift-left e mais</li>\n<li><a href=\"03_tipos_testes_software.md\">Tipos de Testes de Software</a> - Unitários, integração, sistema, aceitação</li>\n<li><a href=\"04_benchmark_frameworks.md\">Benchmark de Frameworks</a> - Playwright vs Cypress vs Selenium</li>\n<li><a href=\"05_inteligencia_artificial_qa.md\">Inteligência Artificial em QA</a> - GenAI, automação inteligente</li>\n<li><a href=\"06_conclusao.md\">Conclusão</a> - Síntese e recomendações</li>\n</ol>\n<h2>Automação de Testes</h2>\n<ol><li><a href=\"07_automacao_testes.md\">Automação de Testes</a> - Estratégias e frameworks</li>\n<li><a href=\"08_testes_ageis.md\">Testes Ágeis</a> - Scrum, Kanban e XP</li>\n<li><a href=\"09_testes_performance.md\">Testes de Performance</a> - Load testing e stress testing</li>\n<li><a href=\"10_testes_seguranca.md\">Testes de Segurança</a> - OWASP, penetration testing</li>\n<li><a href=\"11_devops_qa.md\">DevOps e QA</a> - CI/CD com qualidade integrada</li>\n<li><a href=\"12_testes_mobile.md\">Testes Mobile</a> - Appium, Espresso, XCTest</li>\n</ol>\n<h2>Metodologias e Práticas</h2>\n<ol><li><a href=\"13_tdd.md\">Test-Driven Development (TDD)</a> - Ciclo RED-GREEN-REFACTOR</li>\n<li><a href=\"14_bdd.md\">Behavior-Driven Development (BDD)</a> - Gherkin e Cucumber</li>\n<li><a href=\"15_testes_api.md\">Testes de API</a> - REST, GraphQL, microservices</li>\n<li><a href=\"16_exploratory_testing.md\">Exploratory Testing</a> - Testes sem roteiro</li>\n<li><a href=\"17_testes_usabilidade.md\">Testes de Usabilidade</a> - UX e heurísticas</li>\n<li><a href=\"18_testes_regressao.md\">Testes de Regressão</a> - Estratégias de manutenção</li>\n</ol>\n<h2>Metodologias Ágeis</h2>\n<ol><li><a href=\"19_agile_qa.md\">Metodologias Ágeis e QA</a> - Scrum, Kanban e XP na prática</li>\n</ol>\n<h2>Testes de Banco de Dados e Integração</h2>\n<ol><li><a href=\"20_testes_banco_dados.md\">Testes de Banco de Dados</a> - SQL, NoSQL, integridade</li>\n<li><a href=\"21_testes_integracao.md\">Testes de Integração</a> - APIs, serviços, microsserviços</li>\n</ol>\n<h2>Técnicas Avançadas</h2>\n<ol><li><a href=\"22_mutation_testing.md\">Mutation Testing</a> - Avaliando qualidade dos testes</li>\n<li><a href=\"23_visual_testing.md\">Visual Regression Testing</a> - Screenshots comparison</li>\n<li><a href=\"24_selenium_webdriver.md\">Selenium WebDriver</a> - Guia completo de automação web</li>\n</ol>\n<h2>APIs e DevOps</h2>\n<ol><li><a href=\"25_api_rest.md\">API REST</a> - Design e boas práticas</li>\n<li><a href=\"26_cicd_qa.md\">CI/CD para QA</a> - Pipelines com qualidade</li>\n<li><a href=\"27_testes_load.md\">Testes de Load/Stress</a> - JMeter, k6, Gatling</li>\n</ol>\n<h2>Infraestrutura e Monitoramento</h2>\n<ol><li><a href=\"28_kubernetes_qa.md\">Kubernetes e QA</a> - Testes em containers</li>\n<li><a href=\"29_monitoramento_qualidade.md\">Monitoramento de Qualidade</a> - Métricas e dashboards</li>\n<li><a href=\"30_gitops_qa.md\">GitOps e Qualidade</a> - Infraestrutura como código</li>\n</ol>\n<h2>Containers e Acessibilidade</h2>\n<ol><li><a href=\"31_docker_qa.md\">Docker para QA</a> - Containers para testes</li>\n<li><a href=\"32_testes_acessibilidade.md\">Testes de Acessibilidade</a> - WCAG e inclusão</li>\n</ol>\n<h2>Técnicas e Ferramentas</h2>\n<ol><li><a href=\"33_chaos_engineering.md\">Chaos Engineering</a> - Testando resiliência</li>\n<li><a href=\"34_fakes_mocks.md\">Fake Services e Mocking</a> - Isolando dependências</li>\n<li><a href=\"35_testcontainers.md\">Testcontainers</a> - Ambientes Docker para testes</li>\n</ol>\n<h2>Segurança e Testes E2E</h2>\n<ol><li><a href=\"36_security_testing.md\">Security Testing</a> - OWASP, SAST, DAST</li>\n<li><a href=\"37_e2e_testing.md\">Testes E2E</a> - Playwright, Cypress, Selenium</li>\n<li><a href=\"38_cucumber_gherkin.md\">Cucumber e Gherkin</a> - BDD na prática</li>\n<li><a href=\"39_contract_testing.md\">Testes de Contrato</a> - Pact e consumer-driven</li>\n</ol>\n<h2>Métricas e Continuous Testing</h2>\n<ol><li><a href=\"40_qa_metrics.md\">Métricas de QA</a> - KPIs e dashboards</li>\n<li><a href=\"41_continuous_testing.md\">Continuous Testing</a> - Automação total no pipeline</li>\n</ol>\n<hr>\n<h2>Referências de Imagens</h2>\n\n<ul><li><a href=\"referencias_imagens/referencias_imagens.md\">Referências de Imagens</a></li></ul>\n\n<hr>\n<em>Este guia faz parte de uma série completa sobre Qualidade de Software e QA para 2025-2026</em>', 'Índice - Guia Completo de Qualidade de Software e QA', '', 'publish', 'open', 'open', '', '00indice', '', '', '2026-07-06 22:52:03', '2026-07-07 01:52:03', '', '0', 'http://localhost:8082/ideiasti/00indice/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('458', '0', '2026-07-06 22:52:03', '2026-07-07 01:52:03', '<p>Este é o seu novo <em>Cofre</em>.</p>\n\n<p>Anote algo, <a href=\"https://help.obsidian.md/Plugins/Importer\">[crie um link]], ou tente [o Importer</a>!</p>\n\n<p>Quando estiver pronto, exclua esta nota e monte o cofre do seu jeito.</p>', 'Bem-vindo', '', 'publish', 'open', 'open', '', 'bem-vindo', '', '', '2026-07-06 22:52:03', '2026-07-07 01:52:03', '', '0', 'http://localhost:8082/ideiasti/bem-vindo/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('459', '0', '2026-07-06 22:52:03', '2026-07-07 01:52:03', '<p><!-- wp:image {\"align\":\"center\",\"sizeSlug\":\"large\"} --><br><figure class=\"wp-block-image size-large aligncenter\"><img src=\"https://media.giphy.com/media/l0HlHJGHe3yAMjfFC/giphy.gif\" alt=\"Blog QA Brasil - Índice Completo\" /></figure><br><!-- /wp:image --></p>\n\n<p>Bem-vindo ao índice completo do <strong>Blog QA Brasil</strong>. Aqui você encontra todos os nossos artigos organizados por categoria para facilitar sua navegação e aprendizado.</p>\n\n<hr>\n<h2>Fundamentos de Qualidade de Software</h2>\n\n<h3>Artigos Essenciais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/01_introducao_qualidade_software\">01 - Introdução à Qualidade de Software</a></td><td>Fundamentos de QA, importância e objetivos</td></tr>\n<tr><td><a href=\"/02_tendencias_qa_2025\">02 - Tendências de QA 2025</a></td><td>IA, automação, shift-left e mais</td></tr>\n<tr><td><a href=\"/03_tipos_testes_software\">03 - Tipos de Testes de Software</a></td><td>Unitários, integração, sistema, aceitação</td></tr>\n<tr><td><a href=\"/04_benchmark_frameworks\">04 - Benchmark de Frameworks</a></td><td>Playwright vs Cypress vs Selenium</td></tr>\n<tr><td><a href=\"/05_inteligencia_artificial_qa\">05 - Inteligência Artificial em QA</a></td><td>GenAI, automação inteligente</td></tr>\n</table></figure>\n\n<hr>\n<h2>Automação de Testes</h2>\n\n<h3>Frameworks e Ferramentas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/07_automacao_testes\">07 - Automação de Testes</a></td><td>Estratégias e frameworks</td></tr>\n<tr><td><a href=\"/24_selenium_webdriver\">24 - Selenium WebDriver</a></td><td>Guia completo de automação web</td></tr>\n<tr><td><a href=\"/23_visual_testing\">23 - Visual Testing</a></td><td>Comparação de screenshots</td></tr>\n<tr><td><a href=\"/38_e2e_testing\">37 - E2E Testing</a></td><td>Playwright, Cypress, Selenium</td></tr>\n<tr><td><a href=\"/34_cucumber_gherkin\">38 - Cucumber e Gherkin</a></td><td>BDD na prática</td></tr>\n</table></figure>\n\n<h3>Metodologias de Automação</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/13_tdd\">13 - TDD</a></td><td>Ciclo RED-GREEN-REFACTOR</td></tr>\n<tr><td><a href=\"/14_bdd\">14 - BDD</a></td><td>Gherkin e Cucumber</td></tr>\n<tr><td><a href=\"/22_mutation_testing\">22 - Mutation Testing</a></td><td>Avaliando qualidade dos testes</td></tr>\n</table></figure>\n\n<hr>\n<h2>Testes por Tipo</h2>\n\n<h3>Testes Funcionais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/15_testes_api\">15 - Testes de API</a></td><td>REST, GraphQL, microservices</td></tr>\n<tr><td><a href=\"/20_testes_banco_dados\">20 - Testes de Banco de Dados</a></td><td>SQL, NoSQL, integridade</td></tr>\n<tr><td><a href=\"/21_testes_integracao\">21 - Testes de Integração</a></td><td>APIs, serviços, microsserviços</td></tr>\n</table></figure>\n\n<h3>Testes Não-Funcionais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/09_testes_performance\">09 - Testes de Performance</a></td><td>Load testing e stress testing</td></tr>\n<tr><td><a href=\"/27_testes_load\">27 - Testes de Load/Stress</a></td><td>JMeter, k6, Gatling</td></tr>\n<tr><td><a href=\"/10_testes_seguranca\">10 - Testes de Segurança</a></td><td>OWASP, penetration testing</td></tr>\n<tr><td><a href=\"/17_testes_usabilidade\">17 - Testes de Usabilidade</a></td><td>UX e heurísticas</td></tr>\n</table></figure>\n\n<h3>Testes Especiais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/12_testes_mobile\">12 - Testes Mobile</a></td><td>Appium, Espresso, XCTest</td></tr>\n<tr><td><a href=\"/16_exploratory_testing\">16 - Exploratory Testing</a></td><td>Testes sem roteiro</td></tr>\n<tr><td><a href=\"/19_testes_acessibilidade\">19 - Testes de Acessibilidade</a></td><td>WCAG e inclusão</td></tr>\n<tr><td><a href=\"/32_testes_acessibilidade\">32 - Accessibility Testing</a></td><td>Acessibilidade e inclusão</td></tr>\n</table></figure>\n\n<hr>\n<h2>Metodologias Ágeis e DevOps</h2>\n\n<h3>Metodologias</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/08_testes_ageis\">08 - Testes Ágeis</a></td><td>Scrum, Kanban e XP</td></tr>\n<tr><td><a href=\"/19_agile_qa\">19 - Agile QA</a></td><td>Scrum, Kanban e XP na prática</td></tr>\n</table></figure>\n\n<h3>DevOps e CI/CD</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/11_devops_qa\">11 - DevOps e QA</a></td><td>CI/CD com qualidade integrada</td></tr>\n<tr><td><a href=\"/16_cicd_qa\">26 - CI/CD para QA</a></td><td>Pipelines com qualidade</td></tr>\n<tr><td><a href=\"/40_continuous_testing\">40 - Continuous Testing</a></td><td>Automação total no pipeline</td></tr>\n</table></figure>\n\n<hr>\n<h2>Infraestrutura e Containers</h2>\n\n<h3>Containers</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/31_docker_qa\">31 - Docker para QA</a></td><td>Containers para testes</td></tr>\n<tr><td><a href=\"/36_testcontainers\">35 - Testcontainers</a></td><td>Ambientes Docker para testes</td></tr>\n</table></figure>\n\n<h3>Orquestração</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/28_kubernetes_qa\">28 - Kubernetes e QA</a></td><td>Testes em containers</td></tr>\n<tr><td><a href=\"/30_gitops_qa\">30 - GitOps e Qualidade</a></td><td>Infraestrutura como código</td></tr>\n</table></figure>\n\n<hr>\n<h2>Técnicas Avançadas</h2>\n\n<h3>Engenharia de Caos e Resiliência</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/33_chaos_engineering\">33 - Chaos Engineering</a></td><td>Testando resiliência</td></tr>\n<tr><td><a href=\"/34_fakes_mocks\">34 - Fakes, Mocks e Stubbing</a></td><td>Isolando dependências</td></tr>\n</table></figure>\n\n<h3>Testes de Contrato</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/35_contract_testing\">39 - Contract Testing</a></td><td>Pact e consumer-driven</td></tr>\n<tr><td><a href=\"/25_api_rest\">25 - API REST</a></td><td>Design e boas práticas</td></tr>\n</table></figure>\n\n<hr>\n<h2>Monitoramento e Métricas</h2>\n\n<h3>Métricas de Qualidade</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/39_qa_metrics\">39 - Métricas de QA</a></td><td>KPIs e dashboards</td></tr>\n<tr><td><a href=\"/29_monitoramento_qualidade\">29 - Monitoramento de Qualidade</a></td><td>Métricas e dashboards</td></tr>\n</table></figure>\n\n<hr>\n<h2>Testes de Regressão</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Artigo</th><th>Descrição</th></tr>\n<tr><td><a href=\"/18_testes_regressao\">18 - Testes de Regressão</a></td><td>Estratégias de manutenção</td></tr>\n</table></figure>\n\n<hr>\n<h2>Páginas Institucionais</h2>\n\n<h3>Links Úteis</h3>\n\n<ul><li><a href=\"/\">Página Inicial</a> - Home do Blog QA Brasil</li><ol><li><a href=\"/sobre\">Sobre Nós</a> - Conheça nossa história e missão</li>\n<li><a href=\"/politica-de-privacidade\">Política de Privacidade</a> - LGPD e proteção de dados</li>\n<li><a href=\"/termos-de-uso\">Termos de Uso</a> - Condições de uso do site</li>\n</ol>\n<hr>\n<h2>Navegação por Tags</h2>\n\n<p><!-- wp:tag-cloud --></p>\n\n<p>Explore artigos por tema:<br><ol><li><strong>#automacao</strong> - Automação de testes</li><br><li><strong>#tdd</strong> - Test-Driven Development</li><br><li><strong>#bdd</strong> - Behavior-Driven Development</li><br><li><strong>#devops</strong> - DevOps e CI/CD</li><br><li><strong>#seguranca</strong> - Testes de segurança</li><br><li><strong>#performance</strong> - Testes de performance</li><br><li><strong>#mobile</strong> - Testes mobile</li><br><li><strong>#ia</strong> - Inteligência Artificial em QA</li><br><li><strong>#docker</strong> - Containers e Docker</li><br><li><strong>#kubernetes</strong> - Kubernetes e orquestração</li><br></ol><br><!-- /wp:tag-cloud --></p>\n\n<hr>\n<h2>Artigos Recentes</h2>\n<ol><li><strong>Introdução à Qualidade de Software</strong> - Fundamentos e conceitos essenciais</li>\n<li><strong>Tendências de QA para 2025</strong> - O futuro dos testes de software</li>\n<li><strong>Tipos de Testes de Software</strong> - Guia completo sobre metodologias</li>\n<li><strong>Benchmark de Frameworks</strong> - Comparativo Playwright vs Cypress vs Selenium</li>\n<li><strong>Inteligência Artificial em QA</strong> - GenAI e automação inteligente</li>\n</ol>\n<hr>\n<h2>Buscar Artigos</h2>\n\n<h3>Busque por Palavra-Chave</h3>\n\n<p>Use o campo de busca do site para encontrar artigos específicos:<br><ol><li><strong>Exemplos de busca:</strong> \"automação\", \"Selenium\", \"API\", \"performance\", \"BDD\", \"Docker\"</li><br></ol><br><h3>Browse por Categoria</h3></p>\n\n<p>Selecione uma categoria no menu para ver todos os artigos relacionados:<br><ol><li>Fundamentos</li><br><li>Automação</li><br><li>DevOps</li><br><li>Segurança</li><br><li>Performance</li><br><li>Mobile</li><br><li>Tendências</li></ol></ul></p>\n\n<hr>\n<h2>Newsletter</h2>\n\n<p><!-- wp:group {\"align\":\"wide\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"var:preset|spacing|50\",\"bottom\":\"var:preset|spacing|50\",\"left\":\"var:preset|spacing|50\",\"right\":\"var:preset|spacing|50\"}},\"border\":{\"radius\":\"10px\"}},\"backgroundColor\":\"primary\",\"textColor\":\"white\",\"className\":\"has-white-color has-primary-background-color has-text-color has-background\"} --><br><div class=\"wp-block-group alignwide has-white-color has-primary-background-color has-text-color has-background\" style=\"border-radius:10px;padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)\"><!-- wp:paragraph --><br><p><strong>📧 Receba novos artigos por e-mail</strong><br /><br>Inscreva-se na newsletter e receba os melhores conteúdos sobre Qualidade de Software diretamente na sua caixa de entrada.</p><br><!-- /wp:paragraph --></div><br><!-- /wp:group --></p>\n\n<hr>\n<h2>Total de Artigos</h2>\n\n<p>Nosso blog conta com <strong>40+ artigos</strong> organizados em <strong>10+ categorias</strong> cobrindo todos os aspectos de Quality Assurance e Testes de Software.</p>\n\n<hr>\n<h2>Comece Por Aqui</h2>\n\n<h3>Para Iniciantes</h3>\n<ol><li><a href=\"/01_introducao_qualidade_software\">Introdução à Qualidade de Software</a></li>\n<li><a href=\"/03_tipos_testes_software\">Tipos de Testes de Software</a></li>\n<li><a href=\"/07_automacao_testes\">Automação de Testes</a></li>\n</ol>\n<h3>Para Intermediários</h3>\n<ol><li><a href=\"/13_tdd\">Test-Driven Development (TDD)</a></li>\n<li><a href=\"/14_bdd\">Behavior-Driven Development (BDD)</a></li>\n<li><a href=\"/15_testes_api\">Testes de API</a></li>\n<li><a href=\"/11_devops_qa\">DevOps e QA</a></li>\n</ol>\n<h3>Para Avançados</h3>\n<ol><li><a href=\"/05_inteligencia_artificial_qa\">Inteligência Artificial em QA</a></li>\n<li><a href=\"/28_kubernetes_qa\">Kubernetes e QA</a></li>\n<li><a href=\"/33_chaos_engineering\">Chaos Engineering</a></li>\n<li><a href=\"/40_continuous_testing\">Continuous Testing</a></li>\n</ol>\n<hr>\n<em>Índice atualizado em Janeiro de 2025</em>\n\n<p><em>Todos os direitos reservados - Blog QA Brasil</em></p>', 'Blog QA Brasil - Índice Completo', '', 'publish', 'open', 'open', '', 'indice', '', '', '2026-07-06 22:52:03', '2026-07-07 01:52:03', '', '0', 'http://localhost:8082/ideiasti/indice/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('460', '0', '2026-07-06 22:52:07', '2026-07-07 01:52:07', '', 'giphy-6', '', 'inherit', 'open', 'closed', '', 'giphy-6', '', '', '2026-07-06 22:52:07', '2026-07-07 01:52:07', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-6.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('461', '0', '2026-07-06 22:52:08', '2026-07-07 01:52:08', '<p><strong>Meta Description:</strong> Conheça todos os tipos de testes de software: funcionais, não-funcionais, unitários, integração, sistema e mais. Guia completo com definições, objetivos e melhores práticas.</p>\n\n<hr>\n<h2>Introdução aos Tipos de Testes de Software</h2>\n\n<p>Os testes de software são uma atividade crítica no ciclo de desenvolvimento de sistemas. Compreender os diferentes tipos de testes e quando aplicá-los é fundamental para garantir a qualidade e confiabilidade das aplicações.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-6.gif\" alt=\"Pirâmide de Testes - Hierarquia de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este guia completo apresenta uma categorização detalhada dos principais tipos de testes de software, suas finalidades, características e quando cada um deve ser utilizado no seu projeto.</p>\n\n<hr>\n<h2>Categorização Geral dos Testes</h2>\n\n<p>Os testes de software podem ser divididos em duas categorias principais:</p>\n\n<h3>1. Testes Funcionais</h3>\n\n<p>Verificam se o software funciona conforme especificado, testando funcionalidades específicas e requisitos do negócio.</p>\n\n<h3>2. Testes Não-Funcionais</h3>\n\n<p>Avaliam características como performance, segurança, usabilidade e confiabilidade, que não estão relacionadas a funcionalidades específicas.</p>\n\n<hr>\n<h2>Testes Funcionais: Garantindo o Comportamento Correto</h2>\n\n<h3>Teste Unitário: A Base de Tudo</h3>\n\n<p>O teste unitário é o tipo mais básico de teste, onde cada unidade de código (geralmente uma função ou método) é testada isoladamente. Esta atividade é realizada durante as etapas de desenvolvimento pelos próprios desenvolvedores.</p>\n\n<h4>Objetivos dos Testes Unitários</h4>\n\n<ul><li><strong>Identificar falhas em componentes individuais</strong> - Detectar problemas cedo</li><ol><li><strong>Garantir que cada função trabalha corretamente</strong> - Validação granular</li>\n<li><strong>Facilitar a detecção precoce de defeitos</strong> - Redução de custos</li>\n<li><strong>Documentar o código</strong> - Testes como especificação executável</li>\n<li><strong>Permitir refactoring seguro</strong> - Confiança ao modificar código</li>\n</ol>\n<h4>Exemplo Prático em Python (pytest)</h4>\n\n<pre><code>def calcular_desconto(valor_original, percentual):\n    \"\"\"Calcula o valor do desconto.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual deve estar entre 0 e 100\")\n    desconto = valor_original * (percentual / 100)\n    return valor_original - desconto\n\n<p>def test_calcular_desconto_10_porcento():<br>    assert calcular_desconto(100, 10) == 90</p>\n\n<p>def test_calcular_desconto_50_porcento():<br>    assert calcular_desconto(200, 50) == 100</p>\n\n<p>def test_calcular_desconto_invalido():<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 150)<br></code></pre></p>\n\n<h4>Frameworks Populares para Testes Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Framework</th><th>Características</th></tr>\n<tr><td>Java</td><td>JUnit 5, TestNG</td><td>Mais popular, extensível</td></tr>\n<tr><td>JavaScript</td><td>Jest, Mocha</td><td>Rápido, Mocking fácil</td></tr>\n<tr><td>Python</td><td>pytest, unittest</td><td>Sintaxe simples, fixtures</td></tr>\n<tr><td>C#</td><td>xUnit, NUnit</td><td>.NET ecosystem</td></tr>\n<tr><td>Go</td><td>testing (stdlib)</td><td>Simples, integrado</td></tr>\n</table></figure>\n\n<h4>Melhores Práticas para Testes Unitários</h4>\n\n<p>✅ <strong>Teste apenas uma coisa de cada vez</strong> - Um assert por teste é ideal  <br>✅ <strong>Nomes descritivos</strong> - <code>test_deve_retornar_erro_quando_usuario_invalido</code>  <br>✅ <strong>Independência</strong> - Testes não devem depender uns dos outros  <br>✅ <strong>Rapidez</strong> - Unit tests devem executar em milissegundos  <br>✅ <strong>Isolamento</strong> - Use mocks para dependências externas</p>\n\n<hr>\n<h3>Teste de Integração: Verificando Conexões</h3>\n\n<p>O teste de integração verifica a comunicação entre diferentes módulos ou componentes do sistema. Este tipo de teste é crucial para garantir que as partes do sistema funcionam corretamente quando combinadas.</p>\n\n<h4>Características Principais</h4>\n<ol><li><strong>Valida interfaces e interações entre componentes</strong> - Fluxo de dados correto</li>\n<li><strong>Identifica problemas de comunicação</strong> - API mismatches, protocolos</li>\n<li><strong>Pode ser realizado de forma incremental ou big-bang</strong> - Duas abordagens</li>\n<li><strong>Testa camadas de persistência</strong> - Bancos de dados, APIs externas</li>\n</ol>\n<h4>Estratégias de Integração</h4>\n\n<p>##### 1. Big-Bang Integration</p>\n\n<p>Todos os componentes são integrados simultaneamente e testados juntos.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Simples de implementar</li><br><li>Bom para sistemas pequenos</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Difícil localização de erros</li><br><li>Todos os módulos devem estar prontos</li><br></ol><br>##### 2. Incremental Integration (Bottom-Up)</p>\n\n<p>Começa pelos módulos mais baixos e集成 progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Defeitos fáceis de isolar</li><br><li>Feedback contínuo</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode ter módulos de alto nível sem testes até o final</li><br></ol><br>##### 3. Incremental Integration (Top-Down)</p>\n\n<p>Começa pelos módulos de mais alto nível e desce progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Interface do usuário testada primeiro</li><br><li>Protótipo funcional rápido</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Módulos de baixo nível simulados (stubs)</li><br></ol><br><h4>Exemplo de Teste de Integração (REST API)</h4></p>\n\n<pre><code>import requests\nimport pytest\n\n<p>class TestUserAPI:<br>    BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>def test_criar_usuario(self):<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"senha123\"<br>        }<br>        response = requests.post(f\"{self.BASE_URL}/usuarios\", json=payload)</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data</p>\n\n<p>def test_listar_usuarios(self):<br>        response = requests.get(f\"{self.BASE_URL}/usuarios\")</p>\n\n<p>assert response.status_code == 200<br>        assert isinstance(response.json(), list)<br></code></pre></p>\n\n<hr>\n<h3>Teste de Sistema: Visão Holística</h3>\n\n<p>O teste de sistema avalia o software como um todo, verificando se todos os componentes funcionam juntos para atender aos requisitos definidos.</p>\n\n<h4>O Que é Testado no Nível de Sistema?</h4>\n<ol><li><strong>Integração entre todos os módulos</strong></li>\n<li><strong>Fluxos de negócio completos</strong></li>\n<li><strong>Conformidade com requisitos funcionais</strong></li>\n<li><strong>Interface com sistemas externos</strong></li>\n<li><strong>Performance do sistema integrado</strong></li>\n<li><strong>Segurança end-to-end</strong></li>\n</ol>\n<h4>Exemplo: Fluxo de E-commerce</h4>\n\n<pre><code>Usuário → Login → Navegação → Carrinho → Checkout → Pagamento → Confirmação\n    ↓         ↓          ↓           ↓           ↓            ↓            ↓\n Cadastro   Session   Produtos    Estoque     Frete        Stripe     E-mail\n   ↕          ↕         ↕          ↕          ↕            ↕          ↕\n  DB        Redis     DB/API     DB         Correios      API       SMTP\n</code></pre>\n\n<p>Cada seta representa um ponto de integração que deve ser testado no nível de sistema.</p>\n\n<hr>\n<h3>Teste de Aceitação: Validando com o Cliente</h3>\n\n<p>O teste de aceitação determina se um produto ou sistema atende às expectativas e requisitos do cliente. Este é frequentemente o último nível de teste antes da entrega正式.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto certo?\"</strong></p>\n\n<h4>Tipos de Teste de Aceitação</h4>\n\n<p>##### 1. Teste de Aceitação do Usuário (UAT)</p>\n\n<p>Usuários finais testam o sistema em um ambiente semelhante ao de produção.</p>\n\n<p>##### 2. Teste de Aceitação Operacional (OAT)</p>\n\n<p>Equipe de operações validabackup, recuperação, relatórios.</p>\n\n<p>##### 3. Teste de Aceitação Contratual</p>\n\n<p>Verifica se o sistema atende aos critérios contratuais.</p>\n\n<h4>Características do UAT</h4>\n<ol><li>Geralmente envolve cooperação ou feedback do cliente</li>\n<li>Atividade de validação com dados reais</li>\n<li>Foco na usabilidade e fluxo de negócio</li>\n<li>Pode revelar requisitos mal entendidos</li>\n<li>Último checkpoint antes do go-live</li>\n</ol>\n<hr>\n<h3>Teste Funcional: Verificando Funcionalidades</h3>\n\n<p>O teste funcional determina se um recurso ou sistema funciona corretamente sem problemas. Verifica o sistema em diferentes níveis para garantir que todos os cenários são cobertos.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto da forma certa?\"</strong></p>\n\n<h4>Técnicas de Teste Funcional</h4>\n\n<p>##### 1. Teste Baseado em Requisitos<br><ol><li>Cada requisito tem casos de teste correspondentes</li><br><li>Rastreabilidade entre requisitos e testes</li><br><li>Cobertura completa</li><br></ol><br>##### 2. Teste Baseado em Casos de Uso<br><ol><li>Cenários de usuário documentados</li><br><li>Fluxos principais e alternativos</li><br><li>Pré-condições e pós-condições</li><br></ol><br>##### 3. Teste de Tabela de Decisão<br><ol><li>Combinações de condições e ações</li><br><li>Útil para regras de negócio complexas</li><br></ol><br>##### 4. Teste de Transição de Estado<br><ol><li>Mudanças de estado do sistema</li><br><li>Diagramas de estado</li><br></ol><br><hr><br><h2>Testes Não-Funcionais: Avaliando Qualidade Oculta</h2></p>\n\n<h3>Teste de Desempenho: Rapidez e Estabilidade</h3>\n\n<figure><img src=\"https://media.giphy.com/media/l0Iy69RBwNTRF0MXi/giphy.gif\" alt=\"Performance Testing - Testes de Desempenho\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de desempenho avalia a velocidade, responsividade e estabilidade do sistema sob carga de trabalho. É crítico para garantir que a aplicação atende aos SLAs (Service Level Agreements).</p>\n\n<h4>Subtipo 1: Teste de Carga (Load Testing)</h4>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas.</p>\n\n<p><strong>Métricas Coletadas:</strong><ol><li>Tempo de resposta (média, p95, p99)</li><br><li>Throughput (requisições por segundo)</li><br><li>Utilização de recursos (CPU, memória, disco)</li><br><li>Taxa de erros</li><br></ol><br><strong>Ferramentas Populares:</strong><ol><li>JMeter</li><br><li>Gatling</li><br><li>k6</li><br><li>Locust</li><br></ol><br><h4>Subtipo 2: Teste de Estresse (Stress Testing)</h4></p>\n\n<p>Avalia os limites do sistema além da capacidade normal para identificar o ponto de quebra.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar capacidade máxima</li><br><li>Verificar comportamento sob overload</li><br><li>Medir tempo de recuperação</li><br><li>Validar failovers</li><br></ol><br><h4>Subtipo 3: Teste de Resistência (Soak Testing)</h4></p>\n\n<p>Executa o sistema sob carga por períodos prolongados para identificar degradação gradual.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Conexões não fechadas</li><br><li>Acúmulo de logs</li><br><li>Degradação de performance</li><br></ol><br><h4>Subtipo 4: Teste de Pico (Spike Testing)</h4></p>\n\n<p>Avalia reações do sistema a picos súbitos de carga.</p>\n\n<p><strong>Cenário Exemplo:</strong><br><pre><code>Carga normal: 1000 usuários<br>Pico: 5000 usuários em 10 segundos<br>Recovery: Voltar para 1000 usuários<br></code></pre></p>\n\n<h4>Ferramentas de Teste de Desempenho</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>JMeter</strong></td><td>Open Source</td><td>Java</td><td>Enterprise, complexo</td></tr>\n<tr><td><strong>Gatling</strong></td><td>Open Source</td><td>Scala</td><td>DevOps, CI/CD</td></tr>\n<tr><td><strong>k6</strong></td><td>Open Source</td><td>JavaScript</td><td>Moderno, extensível</td></tr>\n<tr><td><strong>Locust</strong></td><td>Open Source</td><td>Python</td><td>Python teams</td></tr>\n<tr><td><strong>LoadRunner</strong></td><td>Comercial</td><td>Various</td><td>Enterprise</td></tr>\n</table></figure>\n\n<h4>Exemplo de Teste de Carga com k6</h4>\n\n<pre><code>// script.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },  // Ramp-up<br>    { duration: \'5m\', target: 100 },  // Steady state<br>    { duration: \'2m\', target: 200 },  // Spike<br>    { duration: \'5m\', target: 200 },  // Steady state<br>    { duration: \'2m\', target: 0 },    // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // Menos de 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/produtos\');<br>  check(res, {<br>    \'status é 200\': (r) =&gt; r.status === 200,<br>    \'tempo  r.timings.duration &lt; 500,<br>  });<br>  sleep(1);<br>}<br></code></pre></p>\n\n<hr>\n<h3>Teste de Segurança: Protegendo Dados e Sistemas</h3>\n\n<figure><img src=\"https://media.giphy.com/media/1qfDU4MJv3jWu34hEx/giphy.gif\" alt=\"Security Testing - Escudo de Segurança\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de segurança identifica vulnerabilidades e garante proteção de dados. Em um mundo cada vez mais digital, a segurança é prioridade.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n\n<p>##### 1. Teste de Penetração (Pen Test)</p>\n\n<p>Simula ataques para identificar vulnerabilidades antes que hackers maliciosos o façam.</p>\n\n<p><strong>Metodologias:</strong><ol><li>OWASP Testing Guide</li><br><li>PTES (Penetration Testing Execution Standard)</li><br><li>NIST SP 800-115</li><br></ol><br><strong>Tipos de Pentest:</strong><ol><li><strong>Black Box:</strong> Sem conhecimento prévio</li><br><li><strong>White Box:</strong> Código e documentação</li><br><li><strong>Gray Box:</strong> Conhecimento parcial</li><br></ol><br>##### 2. Varredura de Vulnerabilidade</p>\n\n<p>Identifica pontos fracos conhecidos através de scanning automatizado.</p>\n\n<p><strong>Ferramentas:</strong><ol><li>Nessus</li><br><li>OpenVAS</li><br><li>Qualys</li><br><li>Nexpose</li><br></ol><br>##### 3. Teste de Firewall e WAF</p>\n\n<p>Verifica configurações de segurança de firewalls e Web Application Firewalls.</p>\n\n<p><strong>O que testar:</strong><ol><li>Regras de firewall</li><br><li>Block de IPs maliciosos</li><br><li>Detecção de SQL Injection</li><br><li>Proteção XSS</li><br></ol><br>##### 4. Análise de Código Estático (SAST)</p>\n\n<p>Detecta vulnerabilidades no código-fonte sem executá-lo.</p>\n\n<p><strong>Ferramentas SAST:</strong><ol><li>SonarQube</li><br><li>Checkmarx</li><br><li>Fortify</li><br><li>Snyk Code</li><br></ol><br>##### 5. Análise de Componentes (SCA)</p>\n\n<p>Identifica vulnerabilidades em bibliotecas e dependências.</p>\n\n<p><strong>Ferramentas SCA:</strong><ol><li>Snyk</li><br><li>OWASP Dependency-Check</li><br><li>WhiteSource</li><br><li>Dependabot</li><br></ol><br><h4>OWASP Top 10: Vulnerabilidades Mais Comuns</h4><br><ol><li><strong>A01 - Broken Access Control</strong></li><br><li><strong>A02 - Cryptographic Failures</strong></li><br><li><strong>A03 - Injection</strong></li><br><li><strong>A04 - Insecure Design</strong></li><br><li><strong>A05 - Security Misconfiguration</strong></li><br><li><strong>A06 - Vulnerable Components</strong></li><br><li><strong>A07 - Authentication Failures</strong></li><br><li><strong>A08 - Software and Data Integrity Failures</strong></li><br><li><strong>A09 - Security Logging Failures</strong></li><br><li><strong>A10 - SSRF (Server-Side Request Forgery)</strong></li><br></ol><br><hr><br><h3>Teste de Usabilidade: Experiência do Usuário</h3></p>\n\n<p>Avalia a facilidade de uso e a experiência do usuário com o sistema. O teste de usabilidade é essencial para garantir que os usuários consigam realizar suas tarefas de forma eficiente.</p>\n\n<h4>Critérios de Usabilidade</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Critério</th><th>Definição</th><th>Métrica</th></tr>\n<tr><td><strong>Eficácia</strong></td><td>Usuário consegue completar tarefa?</td><td>Taxa de sucesso</td></tr>\n<tr><td><strong>Eficiência</strong></td><td>Quanto tempo leva?</td><td>Tempo de tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Usuário gostou?</td><td>Questionários SUS</td></tr>\n<tr><td><strong>Aprendizagem</strong></td><td>Quanto tempo para aprender?</td><td>Tempo até proficiência</td></tr>\n<tr><td><strong>Memorização</strong></td><td>Lembra como usar?</td><td>Retenção após pausa</td></tr>\n</table></figure>\n\n<h4>Métodos de Teste de Usabilidade</h4>\n<ol><li><strong>Testes com Usuários</strong> - Sessões gravadas com participantes</li>\n<li><strong>Análise Heurística</strong> - Avaliação por especialistas</li>\n<li><strong>Questionários</strong> - SUS, SEQ, NPS</li>\n<li><strong>Eye Tracking</strong> - Rastreamento ocular</li>\n<li><strong>Análise de Tarefas</strong> - Tempos e erros</li>\n</ol>\n<h4>Frameworks de Avaliação</h4>\n<ol><li><strong>Nielsen\'s Heurísticas</strong> (10 princípios)</li>\n<li><strong>ISO 9241-11</strong> (Usabilidade)</li>\n<li><strong>WCAG 2.1</strong> (Acessibilidade)</li>\n</ol>\n<hr>\n<h3>Teste de Compatibilidade: Funciona em Todo Lugar?</h3>\n\n<p>Verifica se o software funciona em diferentes ambientes, navegadores e dispositivos.</p>\n\n<h4>Tipos de Teste de Compatibilidade</h4>\n\n<p>##### 1. Teste de Navegador (Cross-Browser)<br><ol><li>Chrome, Firefox, Safari, Edge</li><br><li>Diferentes versões</li><br><li>Modos de compatibilidade</li><br></ol><br>##### 2. Teste Mobile<br><ol><li>iOS (iPhone, iPad)</li><br><li>Android (diferentes fabricantes)</li><br><li>Diferentes tamanhos de tela</li><br><li>Diferentes versões de OS</li><br></ol><br>##### 3. Teste de Sistema Operacional<br><ol><li>Windows 10, 11</li><br><li>macOS (versões diferentes)</li><br><li>Linux (distribuições populares)</li><br></ol><br>##### 4. Teste de Hardware<br><ol><li>Diferentes processadores</li><br><li>Diferentes quantidades de RAM</li><br><li>Diferentes resoluções de tela</li><br></ol><br><h4>Ferramentas de Teste Cross-Browser</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Cobertura</th><th>Preço</th></tr>\n<tr><td>BrowserStack</td><td>3000+ dispositivos</td><td>$29+/mês</td></tr>\n<tr><td>Sauce Labs</td><td>1000+ dispositivos</td><td>$39+/mês</td></tr>\n<tr><td>LambdaTest</td><td>3000+ dispositivos</td><td>$15+/mês</td></tr>\n<tr><td>CrossBrowserTesting</td><td>1500+ dispositivos</td><td>$29+/mês</td></tr>\n</table></figure>\n\n<hr>\n<h3>Teste de Recuperação: Resistência a Falhas</h3>\n\n<p>Avalia a capacidade do sistema de se recuperar de falhas e disasters. É crucial para sistemas críticos que não podem ficar fora do ar.</p>\n\n<h4>Cenários de Teste</h4>\n<ol><li><strong>Falha de Hardware</strong></li>\n</ol>   - Perda de disco\n   - Falha de memória\n   - Queda de servidor\n<ol><li><strong>Falha de Software</strong></li>\n</ol>   - Crash de aplicação\n   - Deadlock\n   - Exceções não tratadas\n<ol><li><strong>Falha de Rede</strong></li>\n</ol>   - Perda de conectividade\n   - Alta latência\n   - Timeout\n<ol><li><strong>Desastres</strong></li>\n</ol>   - Perda de datacenter\n   - Corrupção de dados\n   - Ataques DDoS\n\n<h4>Métricas de Recuperação</h4>\n<ol><li><strong>RTO (Recovery Time Objective):</strong> Tempo máximo para recuperação</li>\n<li><strong>RPO (Recovery Point Objective):</strong> Perda máxima de dados aceitável</li>\n<li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li>\n<li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li>\n</ol>\n<hr>\n<h2>Testes de Regressão: Mantendo a Qualidade</h2>\n\n<p>Executados sempre que o código é modificado para garantir que alterações não introduzam novos defeitos. Este é um dos tipos de teste mais importantes e frequentemente executados.</p>\n\n<h3>Quando Executar Testes de Regressão</h3>\n\n<p>✅ Após cada release de software  <br>✅ Após correção de bugs  <br>✅ Após atualizações de dependências  <br>✅ Após refactoring de código  <br>✅ Antes do deploy de produção</p>\n\n<h3>Estratégias de Testes de Regressão</h3>\n\n<h4>1. Regressão Completa</h4>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura total</li><br><li>Alta confiança</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Tempo longo</li><br><li>Custo elevado</li><br></ol><br><h4>2. Regressão Seletiva</h4></p>\n\n<p>Seleciona testes relevantes baseados em mudanças.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Mais rápido</li><br><li>Mais econômico</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode perder cobertura</li><br></ol><br><h4>3. Regressão Prioritária</h4></p>\n\n<p>Executa testes por prioridade (críticos &gt; altos &gt; médios &gt; baixos).</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura do crítico rápido</li><br><li>Decisões baseadas em risco</li><br></ol><br><h3>Automação de Testes de Regressão</h3></p>\n\n<p>A automação é essencial para testes de regressão eficazes:</p>\n\n<p><strong>Benefícios:</strong><ol><li>Execução frequente</li><br><li>Resultados consistentes</li><br><li>Rapidez</li><br><li>Cobertura ampla</li><br></ol><br><strong>Ferramentas Recomendadas:</strong><ol><li>Selenium WebDriver</li><br><li>Playwright</li><br><li>Cypress</li><br><li>Appium (mobile)</li><br><li>RestAssured (API)</li><br></ol><br><hr><br><h2>Pirâmide de Testes: Arquitetura Ideal</h2></p>\n\n<p>A pirâmide de testes é um conceito fundamental que guia a distribuição dos tipos de teste:</p>\n\n<pre><code>                    /\n                   /  \n                  / E2E        ← Poucos testes E2E (lentos, caros)\n                 /      \n                /Integração   ← Alguns testes de integração\n               /            \n              /  Unitários     ← Muitos testes unitários (rápidos, baratos)\n             /________________\n</code></pre>\n\n<h3>Proporções Ideais</h3>\n<ol><li><strong>Unitários:</strong> 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>Integração:</strong> 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>E2E:</strong> 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Compreender os diferentes tipos de testes de software é fundamental para construir uma estratégia de QA eficaz. Cada tipo de teste tem seu propósito específico e deve ser aplicado no momento adequado do ciclo de desenvolvimento.</p>\n\n<p><strong>Resumo dos Tipos de Testes:</strong></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Categoria</th><th>Tipo</th><th>Quando Usar</th><th>Objetivo</th></tr>\n<tr><td><strong>Funcional</strong></td><td>Unitário</td><td>Desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Integração</td><td>Pós-unitário</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Sistema</td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Aceitação</td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Performance</td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Segurança</td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Usabilidade</td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n</table></figure>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem todo projeto precisa de todos os tipos</li><br><li><strong>Priorize</strong> - Comece com unitários e integração</li><br><li><strong>Automatize</strong> - Regressão deve ser automática</li><br><li><strong>Meça</strong> - Cobertura, tempo, defeitos encontrados</li><br><li><strong>Melhore</strong> - Itere constantemente</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre Tipos de Testes</h3></p>\n\n<p><strong>P: Quantos tipos de testes existem?</strong>  <br>R: Existem dozens de tipos de testes classificados de diferentes formas. Os principais são funcionais e não-funcionais, cada um com subtipos específicos.</p>\n\n<p><strong>P: Qual a diferença entre teste de sistema e teste de aceitação?</strong>  <br>R: Teste de sistema verifica se o sistema atende aos requisitos técnicos. Teste de aceitação verifica se o sistema atende às expectativas do usuário/cliente.</p>\n\n<p><strong>P: Testes manuais podem ser substituídos por automatizados?</strong>  <br>R: Não completamente. Testes manuais são essenciais para exploratory testing, UX e cenários complexos. A automação complementa, não substitui.</p>\n\n<p><strong>P: Quando devo começar a testar?</strong>  <br>R: O mais cedo possível! O conceito de Shift-Left recomenda testes desde as primeiras fases do desenvolvimento.</p>\n\n<p><strong>P: Qual a ordem ideal de execução dos testes?</strong>  <br>R: Unitários → Integração → Sistema → Aceitação. Cada nível depende do anterior.</p>\n\n<hr>\n<em>Fonte: Selenium.dev, Atlassian, Vericode, ISTQB, OWASP</em>', 'Tipos de Testes de Software: Guia Completo com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '179-revision-v1', '', '', '2026-07-06 22:52:08', '2026-07-07 01:52:08', '', '179', 'http://localhost:8082/ideiasti/?p=461', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('462', '0', '2026-07-06 22:52:11', '2026-07-07 01:52:11', '', 'giphy-7', '', 'inherit', 'open', 'closed', '', 'giphy-7', '', '', '2026-07-06 22:52:11', '2026-07-07 01:52:11', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-7.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('463', '0', '2026-07-06 22:52:12', '2026-07-07 01:52:12', '<p><strong>Meta Description:</strong> Descubra como a Inteligência Artificial está revolucionando a QA: automação inteligente, geração de testes, detecção de anomalias e manutenção preditiva. Guia completo para profissionais.</p>\n\n<hr>\n<h2>Estado Atual da IA em QA</h2>\n\n<p>O <strong>World Quality Report 2025</strong> revela dados impressionantes: quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão ativamente buscando GenAI</strong> em práticas de Quality Engineering (QE), mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} alcançaram implementação em escala empresarial.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-7.gif\" alt=\"AI Brain - Inteligência Artificial em QA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Esta lacuna entre interesse e implementação representa uma oportunidade significativa para profissionais e organizações que souberem aproveitar efetivamente essas tecnologias.</p>\n\n<hr>\n<h2>Por Que a Adoção de IA em QA Está Crescendo?</h2>\n\n<h3>Drivers de Adoção</h3>\n<ol><li><strong>Volume de testes crescente</strong> - Sistemas mais complexos exigem mais testes</li>\n<li><strong>Pressure de velocidade</strong> - CI/CD demanda execuções mais rápidas</li>\n<li><strong>Escassez de profissionais</strong> - Demanda supera oferta de testadores</li>\n<li><strong>Qualidade em produção</strong> - Necessidade de monitoramento contínuo</li>\n<li><strong>Custos crescentes</strong> - Automação inteligente reduz despesas</li>\n</ol>\n<h3>Benefícios Comprovados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Impacto da IA</th></tr>\n<tr><td>Redução de tempo de teste</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de custos de QA</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Melhoria em cobertura</td><td>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Detecção precoce de bugs</td><td>3-5x mais cedo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Desafios de Adoção de IA em QA</h2>\n\n<h3>1. Desalinhamento Estratégico</h3>\n\n<p>Existe um hiato crescente entre o interesse organizacional em GenAI e a prontidão real para adoção efetiva dentro de QE. O caminho da experimentação para implementação é mais complexo do que o antecipado.</p>\n\n<h4>Sinais de Desalinhamento</h4>\n\n<ul><li>GenAI vista como \"solução mágica\" sem estratégia clara</li><ol><li>Falta de alinhamento entre TI e negócios</li>\n<li>Expectativas irreais sobre capacidades</li>\n<li>Subestimação de esforço de integração</li>\n</ol>\n<h3>2. Complexidade de Implementação</h3>\n\n<p>A implementação de IA em QA requer alinhamento entre inovação operacional e oversight estratégico. Desafios incluem:</p>\n\n<h4>Desafios Técnicos</h4>\n<ol><li>Integração com sistemas legados</li>\n<li>Qualidade dos dados de treinamento</li>\n<li>Escolha de modelos adequados</li>\n<li>Manutenção de modelos em produção</li>\n</ol>\n<h4>Desafios Organizacionais</h4>\n<ol><li>Resistência cultural</li>\n<li>Falta de competências</li>\n<li>Processos não adaptados</li>\n<li>Governança de IA</li>\n</ol>\n<h3>3. Questões Éticas e de Governança</h3>\n<ol><li>Viés em modelos de IA</li>\n<li>Transparência nas decisões</li>\n<li>Responsabilidade por falhas</li>\n<li>Conformidade regulatória</li>\n</ol>\n<hr>\n<h2>Aplicações de IA em QA: Casos de Uso Detalhados</h2>\n\n<h3>1. Geração Automatizada de Testes</h3>\n\n<p>IA pode gerar casos de teste automaticamente baseados em requisitos e código. Esta é uma das aplicações mais promissoras.</p>\n\n<figure><img src=\"https://media.giphy.com/media/VbZ0cWw6cVPMM/giphy.gif\" alt=\"Automação de Testes com IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Requisitos → Análise de NLP → Cenários de Teste → Casos de Teste\n    ↓                                                        ↓\n Código → Análise Estática → Cobertura → Testes Sugeridos\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de unit tests</td><td>Diffblue</td></tr>\n<tr><td><strong>Testim</strong></td><td>Testes E2E com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>Automação sem código com IA</td><td>Avo Automation</td></tr>\n</table></figure>\n\n<h4>Exemplo: Geração de Testes com GenAI</h4>\n\n<pre><code># Exemplo conceitual de como IA pode gerar testes\nimport openai\n\n<p>def gerar_testes_para_requisito(requisito):<br>    prompt = f\"\"\"<br>    Gere casos de teste para o seguinte requisito:</p>\n\n<p>Requisito: {requisito}</p>\n\n<p>Formato de saída (JSON):<br>    {{<br>        \"casos_de_teste\": [<br>            {{<br>                \"id\": \"CT-001\",<br>                \"titulo\": \"...\",<br>                \"pre_condicoes\": [...],<br>                \"passos\": [...],<br>                \"dados_teste\": {{...}},<br>                \"resultado_esperado\": \"...\"<br>            }}<br>        ]<br>    }}<br>    \"\"\"</p>\n\n<p>response = openai.chat.completions.create(<br>        model=\"gpt-4\",<br>        messages=[{\"role\": \"user\", \"content\": prompt}]<br>    )</p>\n\n<p>return json.loads(response.choices[0].message.content)<br></code></pre></p>\n\n<h3>2. Detecção de Anomalias</h3>\n\n<p>Algoritmos de machine learning identificam padrões incomuns que indicam defeitos, revolucionando o monitoramento de qualidade.</p>\n\n<h4>Técnicas Utilizadas</h4>\n\n<p>##### Análise de Séries Temporais<br><ol><li>Identificação de anomalias em métricas de performance</li><br><li>Detecção de degradação gradual</li><br><li>Alertas proativos sobre problemas</li><br></ol><br>##### Clustering<br><ol><li>Agrupamento de testes similares</li><br><li>Identificação de testes atípicos</li><br><li>Detecção de padrões de falha</li><br></ol><br>##### Redes Neurais<br><ol><li>Detecção de padrões complexos</li><br><li>Aprendizado de comportamentos normais</li><br><li>Previsão de falhas</li><br></ol><br><h4>Ferramentas de Detecção de Anomalias</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Aplicação</th></tr>\n<tr><td><strong>Elastic APM</strong></td><td>APM</td><td>Detecção de anomalias em produção</td></tr>\n<tr><td><strong>Datadog</strong></td><td>Monitoring</td><td>ML para métricas</td></tr>\n<tr><td><strong>New Relic</strong></td><td>APM</td><td>Detecção inteligente</td></tr>\n<tr><td><strong>Grafana + Loki</strong></td><td>Logging</td><td>Análise de logs com ML</td></tr>\n</table></figure>\n\n<h3>3. Manutenção Inteligente de Testes</h3>\n\n<p>IA ajuda a identificar e remover testes obsoletos ou flaky, mantendo a suite de testes saudável.</p>\n\n<h4>Problemas que a IA Resolve</h4>\n\n<p><strong>Testes Flaky (Instáveis)</strong><br><ol><li>Identificação de padrões que causam instabilidade</li><br><li>Predição de quais testes podem falhar</li><br><li>Sugestões de correções</li><br><li>Quarentena automática</li><br></ol><br><strong>Testes Obsoletos</strong><br><ol><li>Detecção de funcionalidades removidas</li><br><li>Identificação de código não coberto</li><br><li>Sugestões de remoção segura</li><br></ol><br><h4>Exemplo de Detecção de Testes Flaky</h4></p>\n\n<pre><code># Sistema simplificado de detecção de testes flaky\nclass FlakyTestDetector:\n    def __init__(self):\n        self.test_history = {}\n        self.ml_model = load_trained_model()\n\n<p>def analyze_test(self, test_name, execution_history):<br>        features = self.extract_features(execution_history)<br>        flaky_probability = self.ml_model.predict_proba([features])[0]</p>\n\n<p>if flaky_probability &gt; 0.7:<br>            return {<br>                \"test\": test_name,<br>                \"flaky_probability\": flaky_probability,<br>                \"recommendation\": \"QUARANTINE\",<br>                \"reasons\": self.explain_prediction(features)<br>            }<br>        return {\"test\": test_name, \"flaky_probability\": flaky_probability}</p>\n\n<p>def extract_features(self, history):<br>        return [<br>            history.success_rate,<br>            history.avg_duration,<br>            history.recent_failures,<br>            history.environment_changes,<br>            history.dependency_changes<br>        ]<br></code></pre></p>\n\n<h3>4. Análise de Código Estático com IA</h3>\n\n<p>Identifica potenciais problemas de qualidade antes da execução, usando análise semântica avançada.</p>\n\n<h4>Capacidades Avançadas</h4>\n<ol><li><strong>Detecção de vulnerabilidades</strong> - OWASP Top 10</li>\n<li><strong>Análise de dependências</strong> - Bibliotecas desatualizadas</li>\n<li><strong>Code smells</strong> - Padrões problemáticos</li>\n<li><strong>Débito técnico</strong> - Métricas de qualidade</li>\n</ol>\n<h4>Ferramentas com IA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Capacidades IA</th><th>Integração</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Débito técnico, code smells</td><td>CI/CD</td></tr>\n<tr><td><strong>Snyk</strong></td><td>Vulnerabilidades, licenças</td><td>IDE, CI</td></tr>\n<tr><td><strong>CodeClimate</strong></td><td>Quality, maintainability</td><td>GitHub</td></tr>\n<tr><td><strong>DeepSource</strong></td><td>Análise estática com ML</td><td>Git</td></tr>\n</table></figure>\n\n<h3>5. Testes Visuais Automatizados</h3>\n\n<p>Comparação de interfaces visuais usando visão computacional para detectar regressões.</p>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Página Capturada → Modelo de Visão Computacional → Comparação com Baseline\n     ↓                          ↓                                    ↓\n  Screenshots           Detecção de Elementos           Diff Visual\n                                            ↓\n                                    Alertas de Regressão\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tecnologia</th><th>Diferencial</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Visual AI</td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de precisão</td></tr>\n<tr><td><strong> Percy</strong></td><td>Visual testing</td><td>Integração simples</td></tr>\n<tr><td><strong>Chromatic</strong></td><td>Visual regression</td><td>Para Storybook</td></tr>\n<tr><td><strong>Lost Pixel</strong></td><td>Open source</td><td>Self-hosted</td></tr>\n</table></figure>\n\n<h3>6. Oráculos de Teste Baseados em IA</h3>\n\n<p>Validação de resultados usando modelos treinados para determinar se o comportamento está correto.</p>\n\n<h4>Tipos de Oráculos</h4>\n<ol><li><strong>Oráculo de Imagem</strong> - Validação visual de UI</li>\n<li><strong>Oráculo de Texto</strong> - Análise de conteúdo</li>\n<li><strong>Oráculo de Comportamento</strong> - Detecção de anomalias</li>\n<li><strong>Oráculo de Dados</strong> - Validação de datasets</li>\n</ol>\n<hr>\n<h2>Ferramentas de IA para QA: Comparativo</h2>\n\n<h3>Plataformas Completas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Testim</strong></td><td>Automação inteligente E2E</td><td>$600+/mês</td><td>Equipes enterprise</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Automação com ML</td><td>Sob consulta</td><td>Escala enterprise</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>$500+/mês</td><td>CI/CD integrado</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>No-code com IA</td><td>Sob consulta</td><td>Enterprise</td></tr>\n<tr><td><strong>Perfecto</strong></td><td>Testes mobile/web com IA</td><td>Sob consulta</td><td>Mobile testing</td></tr>\n</table></figure>\n\n<h3>Ferramentas Especializadas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais</td><td>$100+/mês</td><td>UI testing</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Unit tests</td><td>$299/assinante</td><td>Dev teams</td></tr>\n<tr><td><strong>Snyk</strong></td><td>SCA</td><td>Grátis + Pro</td><td>Developers</td></tr>\n<tr><td><strong>SonarCloud</strong></td><td>SAST</td><td>Grátis + Pro</td><td>CI/CD</td></tr>\n</table></figure>\n\n<h3>Ferramentas Emerging (2025-2026)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Status</th></tr>\n<tr><td><strong>CodiumAI</strong></td><td>Testes gerados automaticamente</td><td>Beta</td></tr>\n<tr><td><strong>Mutable AI</strong></td><td>Code review + tests</td><td>Beta</td></tr>\n<tr><td><strong>Dagger</strong></td><td>CI/CD programável</td><td>GA</td></tr>\n<tr><td><strong>Trunk</strong></td><td>Linting inteligente</td><td>GA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando IA em QA: Roadmap Prático</h2>\n\n<h3>Fase 1: Avaliação e Planejamento (1-2 meses)</h3>\n\n<h4>Checklist de Avaliação</h4>\n<ol><li>[ ] Mapeamento de processos atuais de QA</li>\n<li>[ ] Identificação de pontos de dor</li>\n<li>[ ] Análise de ROI potencial</li>\n<li>[ ] Avaliação de maturidade tecnológica</li>\n<li>[ ] Levantamento de stakeholders</li>\n</ol>\n<h4>Métricas de Baseline</h4>\n\n<p>Antes de implementar, estabeleça métricas de referência:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Ferramenta</th></tr>\n<tr><td>Tempo de teste</td><td>Duração de suite</td><td>CI/CD logs</td></tr>\n<tr><td>Cobertura de teste</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>Coverage tools</td></tr>\n<tr><td>Taxa de defeitos</td><td>Bugs em produção</td><td>Bug tracker</td></tr>\n<tr><td>Testes flaky</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas instáveis</td><td>CI/CD</td></tr>\n<tr><td>Custo de QA</td><td>$/teste executado</td><td>Financeiro</td></tr>\n</table></figure>\n\n<h3>Fase 2: Pilot (2-3 meses)</h3>\n\n<h4>Escolha do Piloto</h4>\n\n<p>Selecione um projeto ou área com:<br><ol><li>✅ Escopo controlado</li><br><li>✅ Equipe aberta a inovação</li><br><li>✅ Processos definidos</li><br><li>✅ Métricas disponíveis</li><br></ol><br><h4>Pilotos Recomendados</h4><br><ol><li><strong>Geração de unit tests</strong> - Diffblue, CodiumAI</li><br><li><strong>Testes visuais</strong> - Applitools</li><br><li><strong>Detecção de flaky tests</strong> - Ferramentas de CI</li><br><li><strong>Análise estática</strong> - SonarQube, Snyk</li><br></ol><br><h3>Fase 3: Expansão (3-6 meses)</h3></p>\n\n<h4>Escalar Sucesso</h4>\n<ol><li>Documente aprendizados</li>\n<li>Treine outras equipes</li>\n<li>Padronize processos</li>\n<li>Melhore integrações</li>\n</ol>\n<h4>KPIs de Sucesso</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Meta (6 meses)</th></tr>\n<tr><td>Redução de tempo de teste</td><td>30-40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Aumento de cobertura</td><td>20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de defeitos em prod</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>ROI positivo</td><td>Sim</td></tr>\n</table></figure>\n\n<h3>Fase 4: Maturidade (6-12 meses)</h3>\n\n<h4>Implementação Enterprise</h4>\n<ol><li>Integração completa com CI/CD</li>\n<li>IA em produção (monitoramento)</li>\n<li>Maintenance automatizado</li>\n<li>Reporting avançado</li>\n</ol>\n<hr>\n<h2>Futuro da IA em QA: Tendências 2026-2028</h2>\n\n<h3>1. Testes Autônomos</h3>\n\n<p>Sistemas que automaticamente:<br><ol><li>Geram testes baseados em requisitos</li><br><li>Executam testes continuamente</li><br><li>Detectam e reportam falhas</li><br><li>Propõem correções</li><br></ol><br><h3>2. Manutenção Preditiva</h3></p>\n\n<p>IA que prevê:<br><ol><li>Quando testes vão falhar</li><br><li>Quando código precisa de mais testes</li><br><li>Quando componentes estão em risco</li><br><li>Quando fazer refactoring</li><br></ol><br><h3>3. GenAI Nativa em QA</h3></p>\n\n<p>Modelos treinados especificamente para:<br><ol><li>Entender código e testes</li><br><li>Gerar código de teste</li><br><li>Analisar requisitos</li><br><li>Documentar testes</li><br></ol><br><h3>4. Testes em Produção com IA</h3></p>\n\n<p>Monitoramento inteligente:<br><ol><li>Detecção de anomalias em produção</li><br><li>Geração automática de testes de regressão</li><br><li>Validação de deployments</li><br><li>Root cause analysis</li><br></ol><br><hr><br><h2>Considerações Éticas e Best Practices</h2></p>\n\n<h3>Governança de IA em QA</h3>\n\n<h4>Princípios</h4>\n<ol><li><strong>Transparência</strong> - Documente como a IA toma decisões</li>\n<li><strong>Responsabilidade</strong> - Humanos mantêm responsabilidade final</li>\n<li><strong>Fairness</strong> - Evite viés em modelos</li>\n<li><strong>Privacidade</strong> - Proteja dados sensíveis</li>\n<li><strong>Segurança</strong> - Proteja modelos contra ataques</li>\n</ol>\n<h4>Checklist de Governança</h4>\n<ol><li>[ ] Política de uso de IA em QA documentada</li>\n<li>[ ] Processos de revisão de decisões de IA</li>\n<li>[ ] Documentação de modelos utilizados</li>\n<li>[ ] Plano de contingência para falhas de IA</li>\n<li>[ ] Treinamento de equipe em uso responsável</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A IA está transformando fundamentalmente a QA, oferecendo oportunidades sem precedentes para aumentar eficiência, cobertura e qualidade. Embora a adoção em escala ainda seja um desafio, organizações que investem estrategicamente em IA para QA estão obtendo vantagens competitivas significativas.</p>\n\n<p><strong>Resumo dos Principais Aprendizados:</strong></p>\n\n<p>✅ IA pode reduzir tempo de teste em 40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}  <br>✅ GenAI está sendo buscada por 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações, mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram em escala  <br>✅ Ferramentas como Playwright, Applitools e Testim estão liderando a adoção  <br>✅ Implementação requer estratégia, não apenas ferramentas  <br>✅ Futuro aponta para testes autônomos e manutenção preditiva</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem toda organização precisa de todas as capacidades</li><br><li><strong>Comece pequeno</strong> - Pilotos controlados são mais eficazes</li><br><li><strong>Meça resultados</strong> - Métricas são essenciais</li><br><li><strong>Treine sua equipe</strong> - Competências em IA são necessárias</li><br><li><strong>Governarize</strong> - Adote práticas éticas desde o início</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre IA em QA</h3></p>\n\n<p><strong>P: A IA vai substituir testadores humanos?</strong>  <br>R: Não. A IA complementa o trabalho humano, permitindo que testadores foquem em atividades estratégicas, exploratory testing e design de testes.</p>\n\n<p><strong>P: Qual é o ROI da implementação de IA em QA?</strong>  <br>R: O ROI típico é de 200-500{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em 12-18 meses, considerando redução de tempo de teste, aumento de cobertura e redução de defeitos em produção.</p>\n\n<p><strong>P: Preciso de especialistas em dados para implementar IA em QA?</strong>  <br>R: Não necessariamente. Muitas ferramentas são \"plug-and-play\" e não requerem conhecimento de ML. No entanto, para implementações avançadas, especialistas são úteis.</p>\n\n<p><strong>P: Quais são os principais riscos do uso de IA em QA?</strong>  <br>R: Os principais riscos incluem: dependência excessiva, viés em modelos, falta de transparência e custos inesperados de manutenção.</p>\n\n<p><strong>P: Quando devo começar a usar IA em QA?</strong>  <br>R: Se você tem mais de 100 testes automatizados ou gastando mais de 20 horas/semana em QA, é um bom momento para avaliar ferramentas de IA.</p>\n\n<hr>\n<em>Fonte: World Quality Report 2025, Software Testing Magazine, Gartner Research, IEEE Software</em>', 'Inteligência Artificial em Quality Assurance: Guia Completo para 2025-2026', '', 'inherit', 'closed', 'closed', '', '181-revision-v1', '', '', '2026-07-06 22:52:12', '2026-07-07 01:52:12', '', '181', 'http://localhost:8082/ideiasti/?p=463', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('464', '0', '2026-07-06 22:52:43', '2026-07-07 01:52:43', '', 'giphy-8', '', 'inherit', 'open', 'closed', '', 'giphy-8', '', '', '2026-07-06 22:52:43', '2026-07-07 01:52:43', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-8.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('465', '0', '2026-07-06 22:52:44', '2026-07-07 01:52:44', '<p><strong>Meta Description:</strong> Conheça todos os tipos de testes de software: funcionais, não-funcionais, unitários, integração, sistema e mais. Guia completo com definições, objetivos e melhores práticas.</p>\n\n<hr>\n<h2>Introdução aos Tipos de Testes de Software</h2>\n\n<p>Os testes de software são uma atividade crítica no ciclo de desenvolvimento de sistemas. Compreender os diferentes tipos de testes e quando aplicá-los é fundamental para garantir a qualidade e confiabilidade das aplicações.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-8.gif\" alt=\"Pirâmide de Testes - Hierarquia de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este guia completo apresenta uma categorização detalhada dos principais tipos de testes de software, suas finalidades, características e quando cada um deve ser utilizado no seu projeto.</p>\n\n<hr>\n<h2>Categorização Geral dos Testes</h2>\n\n<p>Os testes de software podem ser divididos em duas categorias principais:</p>\n\n<h3>1. Testes Funcionais</h3>\n\n<p>Verificam se o software funciona conforme especificado, testando funcionalidades específicas e requisitos do negócio.</p>\n\n<h3>2. Testes Não-Funcionais</h3>\n\n<p>Avaliam características como performance, segurança, usabilidade e confiabilidade, que não estão relacionadas a funcionalidades específicas.</p>\n\n<hr>\n<h2>Testes Funcionais: Garantindo o Comportamento Correto</h2>\n\n<h3>Teste Unitário: A Base de Tudo</h3>\n\n<p>O teste unitário é o tipo mais básico de teste, onde cada unidade de código (geralmente uma função ou método) é testada isoladamente. Esta atividade é realizada durante as etapas de desenvolvimento pelos próprios desenvolvedores.</p>\n\n<h4>Objetivos dos Testes Unitários</h4>\n\n<ul><li><strong>Identificar falhas em componentes individuais</strong> - Detectar problemas cedo</li><ol><li><strong>Garantir que cada função trabalha corretamente</strong> - Validação granular</li>\n<li><strong>Facilitar a detecção precoce de defeitos</strong> - Redução de custos</li>\n<li><strong>Documentar o código</strong> - Testes como especificação executável</li>\n<li><strong>Permitir refactoring seguro</strong> - Confiança ao modificar código</li>\n</ol>\n<h4>Exemplo Prático em Python (pytest)</h4>\n\n<pre><code>def calcular_desconto(valor_original, percentual):\n    \"\"\"Calcula o valor do desconto.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual deve estar entre 0 e 100\")\n    desconto = valor_original * (percentual / 100)\n    return valor_original - desconto\n\n<p>def test_calcular_desconto_10_porcento():<br>    assert calcular_desconto(100, 10) == 90</p>\n\n<p>def test_calcular_desconto_50_porcento():<br>    assert calcular_desconto(200, 50) == 100</p>\n\n<p>def test_calcular_desconto_invalido():<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 150)<br></code></pre></p>\n\n<h4>Frameworks Populares para Testes Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Framework</th><th>Características</th></tr>\n<tr><td>Java</td><td>JUnit 5, TestNG</td><td>Mais popular, extensível</td></tr>\n<tr><td>JavaScript</td><td>Jest, Mocha</td><td>Rápido, Mocking fácil</td></tr>\n<tr><td>Python</td><td>pytest, unittest</td><td>Sintaxe simples, fixtures</td></tr>\n<tr><td>C#</td><td>xUnit, NUnit</td><td>.NET ecosystem</td></tr>\n<tr><td>Go</td><td>testing (stdlib)</td><td>Simples, integrado</td></tr>\n</table></figure>\n\n<h4>Melhores Práticas para Testes Unitários</h4>\n\n<p>✅ <strong>Teste apenas uma coisa de cada vez</strong> - Um assert por teste é ideal  <br>✅ <strong>Nomes descritivos</strong> - <code>test_deve_retornar_erro_quando_usuario_invalido</code>  <br>✅ <strong>Independência</strong> - Testes não devem depender uns dos outros  <br>✅ <strong>Rapidez</strong> - Unit tests devem executar em milissegundos  <br>✅ <strong>Isolamento</strong> - Use mocks para dependências externas</p>\n\n<hr>\n<h3>Teste de Integração: Verificando Conexões</h3>\n\n<p>O teste de integração verifica a comunicação entre diferentes módulos ou componentes do sistema. Este tipo de teste é crucial para garantir que as partes do sistema funcionam corretamente quando combinadas.</p>\n\n<h4>Características Principais</h4>\n<ol><li><strong>Valida interfaces e interações entre componentes</strong> - Fluxo de dados correto</li>\n<li><strong>Identifica problemas de comunicação</strong> - API mismatches, protocolos</li>\n<li><strong>Pode ser realizado de forma incremental ou big-bang</strong> - Duas abordagens</li>\n<li><strong>Testa camadas de persistência</strong> - Bancos de dados, APIs externas</li>\n</ol>\n<h4>Estratégias de Integração</h4>\n\n<p>##### 1. Big-Bang Integration</p>\n\n<p>Todos os componentes são integrados simultaneamente e testados juntos.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Simples de implementar</li><br><li>Bom para sistemas pequenos</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Difícil localização de erros</li><br><li>Todos os módulos devem estar prontos</li><br></ol><br>##### 2. Incremental Integration (Bottom-Up)</p>\n\n<p>Começa pelos módulos mais baixos e集成 progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Defeitos fáceis de isolar</li><br><li>Feedback contínuo</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode ter módulos de alto nível sem testes até o final</li><br></ol><br>##### 3. Incremental Integration (Top-Down)</p>\n\n<p>Começa pelos módulos de mais alto nível e desce progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Interface do usuário testada primeiro</li><br><li>Protótipo funcional rápido</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Módulos de baixo nível simulados (stubs)</li><br></ol><br><h4>Exemplo de Teste de Integração (REST API)</h4></p>\n\n<pre><code>import requests\nimport pytest\n\n<p>class TestUserAPI:<br>    BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>def test_criar_usuario(self):<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"senha123\"<br>        }<br>        response = requests.post(f\"{self.BASE_URL}/usuarios\", json=payload)</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data</p>\n\n<p>def test_listar_usuarios(self):<br>        response = requests.get(f\"{self.BASE_URL}/usuarios\")</p>\n\n<p>assert response.status_code == 200<br>        assert isinstance(response.json(), list)<br></code></pre></p>\n\n<hr>\n<h3>Teste de Sistema: Visão Holística</h3>\n\n<p>O teste de sistema avalia o software como um todo, verificando se todos os componentes funcionam juntos para atender aos requisitos definidos.</p>\n\n<h4>O Que é Testado no Nível de Sistema?</h4>\n<ol><li><strong>Integração entre todos os módulos</strong></li>\n<li><strong>Fluxos de negócio completos</strong></li>\n<li><strong>Conformidade com requisitos funcionais</strong></li>\n<li><strong>Interface com sistemas externos</strong></li>\n<li><strong>Performance do sistema integrado</strong></li>\n<li><strong>Segurança end-to-end</strong></li>\n</ol>\n<h4>Exemplo: Fluxo de E-commerce</h4>\n\n<pre><code>Usuário → Login → Navegação → Carrinho → Checkout → Pagamento → Confirmação\n    ↓         ↓          ↓           ↓           ↓            ↓            ↓\n Cadastro   Session   Produtos    Estoque     Frete        Stripe     E-mail\n   ↕          ↕         ↕          ↕          ↕            ↕          ↕\n  DB        Redis     DB/API     DB         Correios      API       SMTP\n</code></pre>\n\n<p>Cada seta representa um ponto de integração que deve ser testado no nível de sistema.</p>\n\n<hr>\n<h3>Teste de Aceitação: Validando com o Cliente</h3>\n\n<p>O teste de aceitação determina se um produto ou sistema atende às expectativas e requisitos do cliente. Este é frequentemente o último nível de teste antes da entrega正式.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto certo?\"</strong></p>\n\n<h4>Tipos de Teste de Aceitação</h4>\n\n<p>##### 1. Teste de Aceitação do Usuário (UAT)</p>\n\n<p>Usuários finais testam o sistema em um ambiente semelhante ao de produção.</p>\n\n<p>##### 2. Teste de Aceitação Operacional (OAT)</p>\n\n<p>Equipe de operações validabackup, recuperação, relatórios.</p>\n\n<p>##### 3. Teste de Aceitação Contratual</p>\n\n<p>Verifica se o sistema atende aos critérios contratuais.</p>\n\n<h4>Características do UAT</h4>\n<ol><li>Geralmente envolve cooperação ou feedback do cliente</li>\n<li>Atividade de validação com dados reais</li>\n<li>Foco na usabilidade e fluxo de negócio</li>\n<li>Pode revelar requisitos mal entendidos</li>\n<li>Último checkpoint antes do go-live</li>\n</ol>\n<hr>\n<h3>Teste Funcional: Verificando Funcionalidades</h3>\n\n<p>O teste funcional determina se um recurso ou sistema funciona corretamente sem problemas. Verifica o sistema em diferentes níveis para garantir que todos os cenários são cobertos.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto da forma certa?\"</strong></p>\n\n<h4>Técnicas de Teste Funcional</h4>\n\n<p>##### 1. Teste Baseado em Requisitos<br><ol><li>Cada requisito tem casos de teste correspondentes</li><br><li>Rastreabilidade entre requisitos e testes</li><br><li>Cobertura completa</li><br></ol><br>##### 2. Teste Baseado em Casos de Uso<br><ol><li>Cenários de usuário documentados</li><br><li>Fluxos principais e alternativos</li><br><li>Pré-condições e pós-condições</li><br></ol><br>##### 3. Teste de Tabela de Decisão<br><ol><li>Combinações de condições e ações</li><br><li>Útil para regras de negócio complexas</li><br></ol><br>##### 4. Teste de Transição de Estado<br><ol><li>Mudanças de estado do sistema</li><br><li>Diagramas de estado</li><br></ol><br><hr><br><h2>Testes Não-Funcionais: Avaliando Qualidade Oculta</h2></p>\n\n<h3>Teste de Desempenho: Rapidez e Estabilidade</h3>\n\n<figure><img src=\"https://media.giphy.com/media/l0Iy69RBwNTRF0MXi/giphy.gif\" alt=\"Performance Testing - Testes de Desempenho\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de desempenho avalia a velocidade, responsividade e estabilidade do sistema sob carga de trabalho. É crítico para garantir que a aplicação atende aos SLAs (Service Level Agreements).</p>\n\n<h4>Subtipo 1: Teste de Carga (Load Testing)</h4>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas.</p>\n\n<p><strong>Métricas Coletadas:</strong><ol><li>Tempo de resposta (média, p95, p99)</li><br><li>Throughput (requisições por segundo)</li><br><li>Utilização de recursos (CPU, memória, disco)</li><br><li>Taxa de erros</li><br></ol><br><strong>Ferramentas Populares:</strong><ol><li>JMeter</li><br><li>Gatling</li><br><li>k6</li><br><li>Locust</li><br></ol><br><h4>Subtipo 2: Teste de Estresse (Stress Testing)</h4></p>\n\n<p>Avalia os limites do sistema além da capacidade normal para identificar o ponto de quebra.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar capacidade máxima</li><br><li>Verificar comportamento sob overload</li><br><li>Medir tempo de recuperação</li><br><li>Validar failovers</li><br></ol><br><h4>Subtipo 3: Teste de Resistência (Soak Testing)</h4></p>\n\n<p>Executa o sistema sob carga por períodos prolongados para identificar degradação gradual.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Conexões não fechadas</li><br><li>Acúmulo de logs</li><br><li>Degradação de performance</li><br></ol><br><h4>Subtipo 4: Teste de Pico (Spike Testing)</h4></p>\n\n<p>Avalia reações do sistema a picos súbitos de carga.</p>\n\n<p><strong>Cenário Exemplo:</strong><br><pre><code>Carga normal: 1000 usuários<br>Pico: 5000 usuários em 10 segundos<br>Recovery: Voltar para 1000 usuários<br></code></pre></p>\n\n<h4>Ferramentas de Teste de Desempenho</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>JMeter</strong></td><td>Open Source</td><td>Java</td><td>Enterprise, complexo</td></tr>\n<tr><td><strong>Gatling</strong></td><td>Open Source</td><td>Scala</td><td>DevOps, CI/CD</td></tr>\n<tr><td><strong>k6</strong></td><td>Open Source</td><td>JavaScript</td><td>Moderno, extensível</td></tr>\n<tr><td><strong>Locust</strong></td><td>Open Source</td><td>Python</td><td>Python teams</td></tr>\n<tr><td><strong>LoadRunner</strong></td><td>Comercial</td><td>Various</td><td>Enterprise</td></tr>\n</table></figure>\n\n<h4>Exemplo de Teste de Carga com k6</h4>\n\n<pre><code>// script.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },  // Ramp-up<br>    { duration: \'5m\', target: 100 },  // Steady state<br>    { duration: \'2m\', target: 200 },  // Spike<br>    { duration: \'5m\', target: 200 },  // Steady state<br>    { duration: \'2m\', target: 0 },    // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // Menos de 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/produtos\');<br>  check(res, {<br>    \'status é 200\': (r) =&gt; r.status === 200,<br>    \'tempo  r.timings.duration &lt; 500,<br>  });<br>  sleep(1);<br>}<br></code></pre></p>\n\n<hr>\n<h3>Teste de Segurança: Protegendo Dados e Sistemas</h3>\n\n<figure><img src=\"https://media.giphy.com/media/1qfDU4MJv3jWu34hEx/giphy.gif\" alt=\"Security Testing - Escudo de Segurança\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de segurança identifica vulnerabilidades e garante proteção de dados. Em um mundo cada vez mais digital, a segurança é prioridade.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n\n<p>##### 1. Teste de Penetração (Pen Test)</p>\n\n<p>Simula ataques para identificar vulnerabilidades antes que hackers maliciosos o façam.</p>\n\n<p><strong>Metodologias:</strong><ol><li>OWASP Testing Guide</li><br><li>PTES (Penetration Testing Execution Standard)</li><br><li>NIST SP 800-115</li><br></ol><br><strong>Tipos de Pentest:</strong><ol><li><strong>Black Box:</strong> Sem conhecimento prévio</li><br><li><strong>White Box:</strong> Código e documentação</li><br><li><strong>Gray Box:</strong> Conhecimento parcial</li><br></ol><br>##### 2. Varredura de Vulnerabilidade</p>\n\n<p>Identifica pontos fracos conhecidos através de scanning automatizado.</p>\n\n<p><strong>Ferramentas:</strong><ol><li>Nessus</li><br><li>OpenVAS</li><br><li>Qualys</li><br><li>Nexpose</li><br></ol><br>##### 3. Teste de Firewall e WAF</p>\n\n<p>Verifica configurações de segurança de firewalls e Web Application Firewalls.</p>\n\n<p><strong>O que testar:</strong><ol><li>Regras de firewall</li><br><li>Block de IPs maliciosos</li><br><li>Detecção de SQL Injection</li><br><li>Proteção XSS</li><br></ol><br>##### 4. Análise de Código Estático (SAST)</p>\n\n<p>Detecta vulnerabilidades no código-fonte sem executá-lo.</p>\n\n<p><strong>Ferramentas SAST:</strong><ol><li>SonarQube</li><br><li>Checkmarx</li><br><li>Fortify</li><br><li>Snyk Code</li><br></ol><br>##### 5. Análise de Componentes (SCA)</p>\n\n<p>Identifica vulnerabilidades em bibliotecas e dependências.</p>\n\n<p><strong>Ferramentas SCA:</strong><ol><li>Snyk</li><br><li>OWASP Dependency-Check</li><br><li>WhiteSource</li><br><li>Dependabot</li><br></ol><br><h4>OWASP Top 10: Vulnerabilidades Mais Comuns</h4><br><ol><li><strong>A01 - Broken Access Control</strong></li><br><li><strong>A02 - Cryptographic Failures</strong></li><br><li><strong>A03 - Injection</strong></li><br><li><strong>A04 - Insecure Design</strong></li><br><li><strong>A05 - Security Misconfiguration</strong></li><br><li><strong>A06 - Vulnerable Components</strong></li><br><li><strong>A07 - Authentication Failures</strong></li><br><li><strong>A08 - Software and Data Integrity Failures</strong></li><br><li><strong>A09 - Security Logging Failures</strong></li><br><li><strong>A10 - SSRF (Server-Side Request Forgery)</strong></li><br></ol><br><hr><br><h3>Teste de Usabilidade: Experiência do Usuário</h3></p>\n\n<p>Avalia a facilidade de uso e a experiência do usuário com o sistema. O teste de usabilidade é essencial para garantir que os usuários consigam realizar suas tarefas de forma eficiente.</p>\n\n<h4>Critérios de Usabilidade</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Critério</th><th>Definição</th><th>Métrica</th></tr>\n<tr><td><strong>Eficácia</strong></td><td>Usuário consegue completar tarefa?</td><td>Taxa de sucesso</td></tr>\n<tr><td><strong>Eficiência</strong></td><td>Quanto tempo leva?</td><td>Tempo de tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Usuário gostou?</td><td>Questionários SUS</td></tr>\n<tr><td><strong>Aprendizagem</strong></td><td>Quanto tempo para aprender?</td><td>Tempo até proficiência</td></tr>\n<tr><td><strong>Memorização</strong></td><td>Lembra como usar?</td><td>Retenção após pausa</td></tr>\n</table></figure>\n\n<h4>Métodos de Teste de Usabilidade</h4>\n<ol><li><strong>Testes com Usuários</strong> - Sessões gravadas com participantes</li>\n<li><strong>Análise Heurística</strong> - Avaliação por especialistas</li>\n<li><strong>Questionários</strong> - SUS, SEQ, NPS</li>\n<li><strong>Eye Tracking</strong> - Rastreamento ocular</li>\n<li><strong>Análise de Tarefas</strong> - Tempos e erros</li>\n</ol>\n<h4>Frameworks de Avaliação</h4>\n<ol><li><strong>Nielsen\'s Heurísticas</strong> (10 princípios)</li>\n<li><strong>ISO 9241-11</strong> (Usabilidade)</li>\n<li><strong>WCAG 2.1</strong> (Acessibilidade)</li>\n</ol>\n<hr>\n<h3>Teste de Compatibilidade: Funciona em Todo Lugar?</h3>\n\n<p>Verifica se o software funciona em diferentes ambientes, navegadores e dispositivos.</p>\n\n<h4>Tipos de Teste de Compatibilidade</h4>\n\n<p>##### 1. Teste de Navegador (Cross-Browser)<br><ol><li>Chrome, Firefox, Safari, Edge</li><br><li>Diferentes versões</li><br><li>Modos de compatibilidade</li><br></ol><br>##### 2. Teste Mobile<br><ol><li>iOS (iPhone, iPad)</li><br><li>Android (diferentes fabricantes)</li><br><li>Diferentes tamanhos de tela</li><br><li>Diferentes versões de OS</li><br></ol><br>##### 3. Teste de Sistema Operacional<br><ol><li>Windows 10, 11</li><br><li>macOS (versões diferentes)</li><br><li>Linux (distribuições populares)</li><br></ol><br>##### 4. Teste de Hardware<br><ol><li>Diferentes processadores</li><br><li>Diferentes quantidades de RAM</li><br><li>Diferentes resoluções de tela</li><br></ol><br><h4>Ferramentas de Teste Cross-Browser</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Cobertura</th><th>Preço</th></tr>\n<tr><td>BrowserStack</td><td>3000+ dispositivos</td><td>$29+/mês</td></tr>\n<tr><td>Sauce Labs</td><td>1000+ dispositivos</td><td>$39+/mês</td></tr>\n<tr><td>LambdaTest</td><td>3000+ dispositivos</td><td>$15+/mês</td></tr>\n<tr><td>CrossBrowserTesting</td><td>1500+ dispositivos</td><td>$29+/mês</td></tr>\n</table></figure>\n\n<hr>\n<h3>Teste de Recuperação: Resistência a Falhas</h3>\n\n<p>Avalia a capacidade do sistema de se recuperar de falhas e disasters. É crucial para sistemas críticos que não podem ficar fora do ar.</p>\n\n<h4>Cenários de Teste</h4>\n<ol><li><strong>Falha de Hardware</strong></li>\n</ol>   - Perda de disco\n   - Falha de memória\n   - Queda de servidor\n<ol><li><strong>Falha de Software</strong></li>\n</ol>   - Crash de aplicação\n   - Deadlock\n   - Exceções não tratadas\n<ol><li><strong>Falha de Rede</strong></li>\n</ol>   - Perda de conectividade\n   - Alta latência\n   - Timeout\n<ol><li><strong>Desastres</strong></li>\n</ol>   - Perda de datacenter\n   - Corrupção de dados\n   - Ataques DDoS\n\n<h4>Métricas de Recuperação</h4>\n<ol><li><strong>RTO (Recovery Time Objective):</strong> Tempo máximo para recuperação</li>\n<li><strong>RPO (Recovery Point Objective):</strong> Perda máxima de dados aceitável</li>\n<li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li>\n<li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li>\n</ol>\n<hr>\n<h2>Testes de Regressão: Mantendo a Qualidade</h2>\n\n<p>Executados sempre que o código é modificado para garantir que alterações não introduzam novos defeitos. Este é um dos tipos de teste mais importantes e frequentemente executados.</p>\n\n<h3>Quando Executar Testes de Regressão</h3>\n\n<p>✅ Após cada release de software  <br>✅ Após correção de bugs  <br>✅ Após atualizações de dependências  <br>✅ Após refactoring de código  <br>✅ Antes do deploy de produção</p>\n\n<h3>Estratégias de Testes de Regressão</h3>\n\n<h4>1. Regressão Completa</h4>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura total</li><br><li>Alta confiança</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Tempo longo</li><br><li>Custo elevado</li><br></ol><br><h4>2. Regressão Seletiva</h4></p>\n\n<p>Seleciona testes relevantes baseados em mudanças.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Mais rápido</li><br><li>Mais econômico</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode perder cobertura</li><br></ol><br><h4>3. Regressão Prioritária</h4></p>\n\n<p>Executa testes por prioridade (críticos &gt; altos &gt; médios &gt; baixos).</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura do crítico rápido</li><br><li>Decisões baseadas em risco</li><br></ol><br><h3>Automação de Testes de Regressão</h3></p>\n\n<p>A automação é essencial para testes de regressão eficazes:</p>\n\n<p><strong>Benefícios:</strong><ol><li>Execução frequente</li><br><li>Resultados consistentes</li><br><li>Rapidez</li><br><li>Cobertura ampla</li><br></ol><br><strong>Ferramentas Recomendadas:</strong><ol><li>Selenium WebDriver</li><br><li>Playwright</li><br><li>Cypress</li><br><li>Appium (mobile)</li><br><li>RestAssured (API)</li><br></ol><br><hr><br><h2>Pirâmide de Testes: Arquitetura Ideal</h2></p>\n\n<p>A pirâmide de testes é um conceito fundamental que guia a distribuição dos tipos de teste:</p>\n\n<pre><code>                    /\n                   /  \n                  / E2E        ← Poucos testes E2E (lentos, caros)\n                 /      \n                /Integração   ← Alguns testes de integração\n               /            \n              /  Unitários     ← Muitos testes unitários (rápidos, baratos)\n             /________________\n</code></pre>\n\n<h3>Proporções Ideais</h3>\n<ol><li><strong>Unitários:</strong> 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>Integração:</strong> 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>E2E:</strong> 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Compreender os diferentes tipos de testes de software é fundamental para construir uma estratégia de QA eficaz. Cada tipo de teste tem seu propósito específico e deve ser aplicado no momento adequado do ciclo de desenvolvimento.</p>\n\n<p><strong>Resumo dos Tipos de Testes:</strong></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Categoria</th><th>Tipo</th><th>Quando Usar</th><th>Objetivo</th></tr>\n<tr><td><strong>Funcional</strong></td><td>Unitário</td><td>Desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Integração</td><td>Pós-unitário</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Sistema</td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Aceitação</td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Performance</td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Segurança</td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Usabilidade</td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n</table></figure>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem todo projeto precisa de todos os tipos</li><br><li><strong>Priorize</strong> - Comece com unitários e integração</li><br><li><strong>Automatize</strong> - Regressão deve ser automática</li><br><li><strong>Meça</strong> - Cobertura, tempo, defeitos encontrados</li><br><li><strong>Melhore</strong> - Itere constantemente</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre Tipos de Testes</h3></p>\n\n<p><strong>P: Quantos tipos de testes existem?</strong>  <br>R: Existem dozens de tipos de testes classificados de diferentes formas. Os principais são funcionais e não-funcionais, cada um com subtipos específicos.</p>\n\n<p><strong>P: Qual a diferença entre teste de sistema e teste de aceitação?</strong>  <br>R: Teste de sistema verifica se o sistema atende aos requisitos técnicos. Teste de aceitação verifica se o sistema atende às expectativas do usuário/cliente.</p>\n\n<p><strong>P: Testes manuais podem ser substituídos por automatizados?</strong>  <br>R: Não completamente. Testes manuais são essenciais para exploratory testing, UX e cenários complexos. A automação complementa, não substitui.</p>\n\n<p><strong>P: Quando devo começar a testar?</strong>  <br>R: O mais cedo possível! O conceito de Shift-Left recomenda testes desde as primeiras fases do desenvolvimento.</p>\n\n<p><strong>P: Qual a ordem ideal de execução dos testes?</strong>  <br>R: Unitários → Integração → Sistema → Aceitação. Cada nível depende do anterior.</p>\n\n<hr>\n<em>Fonte: Selenium.dev, Atlassian, Vericode, ISTQB, OWASP</em>', 'Tipos de Testes de Software: Guia Completo com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '179-revision-v1', '', '', '2026-07-06 22:52:44', '2026-07-07 01:52:44', '', '179', 'http://localhost:8082/ideiasti/?p=465', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('466', '0', '2026-07-06 22:52:48', '2026-07-07 01:52:48', '', 'giphy-9', '', 'inherit', 'open', 'closed', '', 'giphy-9', '', '', '2026-07-06 22:52:48', '2026-07-07 01:52:48', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-9.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('467', '0', '2026-07-06 22:52:48', '2026-07-07 01:52:48', '<p><strong>Meta Description:</strong> Descubra como a Inteligência Artificial está revolucionando a QA: automação inteligente, geração de testes, detecção de anomalias e manutenção preditiva. Guia completo para profissionais.</p>\n\n<hr>\n<h2>Estado Atual da IA em QA</h2>\n\n<p>O <strong>World Quality Report 2025</strong> revela dados impressionantes: quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão ativamente buscando GenAI</strong> em práticas de Quality Engineering (QE), mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} alcançaram implementação em escala empresarial.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-9.gif\" alt=\"AI Brain - Inteligência Artificial em QA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Esta lacuna entre interesse e implementação representa uma oportunidade significativa para profissionais e organizações que souberem aproveitar efetivamente essas tecnologias.</p>\n\n<hr>\n<h2>Por Que a Adoção de IA em QA Está Crescendo?</h2>\n\n<h3>Drivers de Adoção</h3>\n<ol><li><strong>Volume de testes crescente</strong> - Sistemas mais complexos exigem mais testes</li>\n<li><strong>Pressure de velocidade</strong> - CI/CD demanda execuções mais rápidas</li>\n<li><strong>Escassez de profissionais</strong> - Demanda supera oferta de testadores</li>\n<li><strong>Qualidade em produção</strong> - Necessidade de monitoramento contínuo</li>\n<li><strong>Custos crescentes</strong> - Automação inteligente reduz despesas</li>\n</ol>\n<h3>Benefícios Comprovados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Impacto da IA</th></tr>\n<tr><td>Redução de tempo de teste</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de custos de QA</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Melhoria em cobertura</td><td>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Detecção precoce de bugs</td><td>3-5x mais cedo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Desafios de Adoção de IA em QA</h2>\n\n<h3>1. Desalinhamento Estratégico</h3>\n\n<p>Existe um hiato crescente entre o interesse organizacional em GenAI e a prontidão real para adoção efetiva dentro de QE. O caminho da experimentação para implementação é mais complexo do que o antecipado.</p>\n\n<h4>Sinais de Desalinhamento</h4>\n\n<ul><li>GenAI vista como \"solução mágica\" sem estratégia clara</li><ol><li>Falta de alinhamento entre TI e negócios</li>\n<li>Expectativas irreais sobre capacidades</li>\n<li>Subestimação de esforço de integração</li>\n</ol>\n<h3>2. Complexidade de Implementação</h3>\n\n<p>A implementação de IA em QA requer alinhamento entre inovação operacional e oversight estratégico. Desafios incluem:</p>\n\n<h4>Desafios Técnicos</h4>\n<ol><li>Integração com sistemas legados</li>\n<li>Qualidade dos dados de treinamento</li>\n<li>Escolha de modelos adequados</li>\n<li>Manutenção de modelos em produção</li>\n</ol>\n<h4>Desafios Organizacionais</h4>\n<ol><li>Resistência cultural</li>\n<li>Falta de competências</li>\n<li>Processos não adaptados</li>\n<li>Governança de IA</li>\n</ol>\n<h3>3. Questões Éticas e de Governança</h3>\n<ol><li>Viés em modelos de IA</li>\n<li>Transparência nas decisões</li>\n<li>Responsabilidade por falhas</li>\n<li>Conformidade regulatória</li>\n</ol>\n<hr>\n<h2>Aplicações de IA em QA: Casos de Uso Detalhados</h2>\n\n<h3>1. Geração Automatizada de Testes</h3>\n\n<p>IA pode gerar casos de teste automaticamente baseados em requisitos e código. Esta é uma das aplicações mais promissoras.</p>\n\n<figure><img src=\"https://media.giphy.com/media/VbZ0cWw6cVPMM/giphy.gif\" alt=\"Automação de Testes com IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Requisitos → Análise de NLP → Cenários de Teste → Casos de Teste\n    ↓                                                        ↓\n Código → Análise Estática → Cobertura → Testes Sugeridos\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de unit tests</td><td>Diffblue</td></tr>\n<tr><td><strong>Testim</strong></td><td>Testes E2E com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>Automação sem código com IA</td><td>Avo Automation</td></tr>\n</table></figure>\n\n<h4>Exemplo: Geração de Testes com GenAI</h4>\n\n<pre><code># Exemplo conceitual de como IA pode gerar testes\nimport openai\n\n<p>def gerar_testes_para_requisito(requisito):<br>    prompt = f\"\"\"<br>    Gere casos de teste para o seguinte requisito:</p>\n\n<p>Requisito: {requisito}</p>\n\n<p>Formato de saída (JSON):<br>    {{<br>        \"casos_de_teste\": [<br>            {{<br>                \"id\": \"CT-001\",<br>                \"titulo\": \"...\",<br>                \"pre_condicoes\": [...],<br>                \"passos\": [...],<br>                \"dados_teste\": {{...}},<br>                \"resultado_esperado\": \"...\"<br>            }}<br>        ]<br>    }}<br>    \"\"\"</p>\n\n<p>response = openai.chat.completions.create(<br>        model=\"gpt-4\",<br>        messages=[{\"role\": \"user\", \"content\": prompt}]<br>    )</p>\n\n<p>return json.loads(response.choices[0].message.content)<br></code></pre></p>\n\n<h3>2. Detecção de Anomalias</h3>\n\n<p>Algoritmos de machine learning identificam padrões incomuns que indicam defeitos, revolucionando o monitoramento de qualidade.</p>\n\n<h4>Técnicas Utilizadas</h4>\n\n<p>##### Análise de Séries Temporais<br><ol><li>Identificação de anomalias em métricas de performance</li><br><li>Detecção de degradação gradual</li><br><li>Alertas proativos sobre problemas</li><br></ol><br>##### Clustering<br><ol><li>Agrupamento de testes similares</li><br><li>Identificação de testes atípicos</li><br><li>Detecção de padrões de falha</li><br></ol><br>##### Redes Neurais<br><ol><li>Detecção de padrões complexos</li><br><li>Aprendizado de comportamentos normais</li><br><li>Previsão de falhas</li><br></ol><br><h4>Ferramentas de Detecção de Anomalias</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Aplicação</th></tr>\n<tr><td><strong>Elastic APM</strong></td><td>APM</td><td>Detecção de anomalias em produção</td></tr>\n<tr><td><strong>Datadog</strong></td><td>Monitoring</td><td>ML para métricas</td></tr>\n<tr><td><strong>New Relic</strong></td><td>APM</td><td>Detecção inteligente</td></tr>\n<tr><td><strong>Grafana + Loki</strong></td><td>Logging</td><td>Análise de logs com ML</td></tr>\n</table></figure>\n\n<h3>3. Manutenção Inteligente de Testes</h3>\n\n<p>IA ajuda a identificar e remover testes obsoletos ou flaky, mantendo a suite de testes saudável.</p>\n\n<h4>Problemas que a IA Resolve</h4>\n\n<p><strong>Testes Flaky (Instáveis)</strong><br><ol><li>Identificação de padrões que causam instabilidade</li><br><li>Predição de quais testes podem falhar</li><br><li>Sugestões de correções</li><br><li>Quarentena automática</li><br></ol><br><strong>Testes Obsoletos</strong><br><ol><li>Detecção de funcionalidades removidas</li><br><li>Identificação de código não coberto</li><br><li>Sugestões de remoção segura</li><br></ol><br><h4>Exemplo de Detecção de Testes Flaky</h4></p>\n\n<pre><code># Sistema simplificado de detecção de testes flaky\nclass FlakyTestDetector:\n    def __init__(self):\n        self.test_history = {}\n        self.ml_model = load_trained_model()\n\n<p>def analyze_test(self, test_name, execution_history):<br>        features = self.extract_features(execution_history)<br>        flaky_probability = self.ml_model.predict_proba([features])[0]</p>\n\n<p>if flaky_probability &gt; 0.7:<br>            return {<br>                \"test\": test_name,<br>                \"flaky_probability\": flaky_probability,<br>                \"recommendation\": \"QUARANTINE\",<br>                \"reasons\": self.explain_prediction(features)<br>            }<br>        return {\"test\": test_name, \"flaky_probability\": flaky_probability}</p>\n\n<p>def extract_features(self, history):<br>        return [<br>            history.success_rate,<br>            history.avg_duration,<br>            history.recent_failures,<br>            history.environment_changes,<br>            history.dependency_changes<br>        ]<br></code></pre></p>\n\n<h3>4. Análise de Código Estático com IA</h3>\n\n<p>Identifica potenciais problemas de qualidade antes da execução, usando análise semântica avançada.</p>\n\n<h4>Capacidades Avançadas</h4>\n<ol><li><strong>Detecção de vulnerabilidades</strong> - OWASP Top 10</li>\n<li><strong>Análise de dependências</strong> - Bibliotecas desatualizadas</li>\n<li><strong>Code smells</strong> - Padrões problemáticos</li>\n<li><strong>Débito técnico</strong> - Métricas de qualidade</li>\n</ol>\n<h4>Ferramentas com IA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Capacidades IA</th><th>Integração</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Débito técnico, code smells</td><td>CI/CD</td></tr>\n<tr><td><strong>Snyk</strong></td><td>Vulnerabilidades, licenças</td><td>IDE, CI</td></tr>\n<tr><td><strong>CodeClimate</strong></td><td>Quality, maintainability</td><td>GitHub</td></tr>\n<tr><td><strong>DeepSource</strong></td><td>Análise estática com ML</td><td>Git</td></tr>\n</table></figure>\n\n<h3>5. Testes Visuais Automatizados</h3>\n\n<p>Comparação de interfaces visuais usando visão computacional para detectar regressões.</p>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Página Capturada → Modelo de Visão Computacional → Comparação com Baseline\n     ↓                          ↓                                    ↓\n  Screenshots           Detecção de Elementos           Diff Visual\n                                            ↓\n                                    Alertas de Regressão\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tecnologia</th><th>Diferencial</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Visual AI</td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de precisão</td></tr>\n<tr><td><strong> Percy</strong></td><td>Visual testing</td><td>Integração simples</td></tr>\n<tr><td><strong>Chromatic</strong></td><td>Visual regression</td><td>Para Storybook</td></tr>\n<tr><td><strong>Lost Pixel</strong></td><td>Open source</td><td>Self-hosted</td></tr>\n</table></figure>\n\n<h3>6. Oráculos de Teste Baseados em IA</h3>\n\n<p>Validação de resultados usando modelos treinados para determinar se o comportamento está correto.</p>\n\n<h4>Tipos de Oráculos</h4>\n<ol><li><strong>Oráculo de Imagem</strong> - Validação visual de UI</li>\n<li><strong>Oráculo de Texto</strong> - Análise de conteúdo</li>\n<li><strong>Oráculo de Comportamento</strong> - Detecção de anomalias</li>\n<li><strong>Oráculo de Dados</strong> - Validação de datasets</li>\n</ol>\n<hr>\n<h2>Ferramentas de IA para QA: Comparativo</h2>\n\n<h3>Plataformas Completas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Testim</strong></td><td>Automação inteligente E2E</td><td>$600+/mês</td><td>Equipes enterprise</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Automação com ML</td><td>Sob consulta</td><td>Escala enterprise</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>$500+/mês</td><td>CI/CD integrado</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>No-code com IA</td><td>Sob consulta</td><td>Enterprise</td></tr>\n<tr><td><strong>Perfecto</strong></td><td>Testes mobile/web com IA</td><td>Sob consulta</td><td>Mobile testing</td></tr>\n</table></figure>\n\n<h3>Ferramentas Especializadas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais</td><td>$100+/mês</td><td>UI testing</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Unit tests</td><td>$299/assinante</td><td>Dev teams</td></tr>\n<tr><td><strong>Snyk</strong></td><td>SCA</td><td>Grátis + Pro</td><td>Developers</td></tr>\n<tr><td><strong>SonarCloud</strong></td><td>SAST</td><td>Grátis + Pro</td><td>CI/CD</td></tr>\n</table></figure>\n\n<h3>Ferramentas Emerging (2025-2026)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Status</th></tr>\n<tr><td><strong>CodiumAI</strong></td><td>Testes gerados automaticamente</td><td>Beta</td></tr>\n<tr><td><strong>Mutable AI</strong></td><td>Code review + tests</td><td>Beta</td></tr>\n<tr><td><strong>Dagger</strong></td><td>CI/CD programável</td><td>GA</td></tr>\n<tr><td><strong>Trunk</strong></td><td>Linting inteligente</td><td>GA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando IA em QA: Roadmap Prático</h2>\n\n<h3>Fase 1: Avaliação e Planejamento (1-2 meses)</h3>\n\n<h4>Checklist de Avaliação</h4>\n<ol><li>[ ] Mapeamento de processos atuais de QA</li>\n<li>[ ] Identificação de pontos de dor</li>\n<li>[ ] Análise de ROI potencial</li>\n<li>[ ] Avaliação de maturidade tecnológica</li>\n<li>[ ] Levantamento de stakeholders</li>\n</ol>\n<h4>Métricas de Baseline</h4>\n\n<p>Antes de implementar, estabeleça métricas de referência:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Ferramenta</th></tr>\n<tr><td>Tempo de teste</td><td>Duração de suite</td><td>CI/CD logs</td></tr>\n<tr><td>Cobertura de teste</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>Coverage tools</td></tr>\n<tr><td>Taxa de defeitos</td><td>Bugs em produção</td><td>Bug tracker</td></tr>\n<tr><td>Testes flaky</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas instáveis</td><td>CI/CD</td></tr>\n<tr><td>Custo de QA</td><td>$/teste executado</td><td>Financeiro</td></tr>\n</table></figure>\n\n<h3>Fase 2: Pilot (2-3 meses)</h3>\n\n<h4>Escolha do Piloto</h4>\n\n<p>Selecione um projeto ou área com:<br><ol><li>✅ Escopo controlado</li><br><li>✅ Equipe aberta a inovação</li><br><li>✅ Processos definidos</li><br><li>✅ Métricas disponíveis</li><br></ol><br><h4>Pilotos Recomendados</h4><br><ol><li><strong>Geração de unit tests</strong> - Diffblue, CodiumAI</li><br><li><strong>Testes visuais</strong> - Applitools</li><br><li><strong>Detecção de flaky tests</strong> - Ferramentas de CI</li><br><li><strong>Análise estática</strong> - SonarQube, Snyk</li><br></ol><br><h3>Fase 3: Expansão (3-6 meses)</h3></p>\n\n<h4>Escalar Sucesso</h4>\n<ol><li>Documente aprendizados</li>\n<li>Treine outras equipes</li>\n<li>Padronize processos</li>\n<li>Melhore integrações</li>\n</ol>\n<h4>KPIs de Sucesso</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Meta (6 meses)</th></tr>\n<tr><td>Redução de tempo de teste</td><td>30-40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Aumento de cobertura</td><td>20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de defeitos em prod</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>ROI positivo</td><td>Sim</td></tr>\n</table></figure>\n\n<h3>Fase 4: Maturidade (6-12 meses)</h3>\n\n<h4>Implementação Enterprise</h4>\n<ol><li>Integração completa com CI/CD</li>\n<li>IA em produção (monitoramento)</li>\n<li>Maintenance automatizado</li>\n<li>Reporting avançado</li>\n</ol>\n<hr>\n<h2>Futuro da IA em QA: Tendências 2026-2028</h2>\n\n<h3>1. Testes Autônomos</h3>\n\n<p>Sistemas que automaticamente:<br><ol><li>Geram testes baseados em requisitos</li><br><li>Executam testes continuamente</li><br><li>Detectam e reportam falhas</li><br><li>Propõem correções</li><br></ol><br><h3>2. Manutenção Preditiva</h3></p>\n\n<p>IA que prevê:<br><ol><li>Quando testes vão falhar</li><br><li>Quando código precisa de mais testes</li><br><li>Quando componentes estão em risco</li><br><li>Quando fazer refactoring</li><br></ol><br><h3>3. GenAI Nativa em QA</h3></p>\n\n<p>Modelos treinados especificamente para:<br><ol><li>Entender código e testes</li><br><li>Gerar código de teste</li><br><li>Analisar requisitos</li><br><li>Documentar testes</li><br></ol><br><h3>4. Testes em Produção com IA</h3></p>\n\n<p>Monitoramento inteligente:<br><ol><li>Detecção de anomalias em produção</li><br><li>Geração automática de testes de regressão</li><br><li>Validação de deployments</li><br><li>Root cause analysis</li><br></ol><br><hr><br><h2>Considerações Éticas e Best Practices</h2></p>\n\n<h3>Governança de IA em QA</h3>\n\n<h4>Princípios</h4>\n<ol><li><strong>Transparência</strong> - Documente como a IA toma decisões</li>\n<li><strong>Responsabilidade</strong> - Humanos mantêm responsabilidade final</li>\n<li><strong>Fairness</strong> - Evite viés em modelos</li>\n<li><strong>Privacidade</strong> - Proteja dados sensíveis</li>\n<li><strong>Segurança</strong> - Proteja modelos contra ataques</li>\n</ol>\n<h4>Checklist de Governança</h4>\n<ol><li>[ ] Política de uso de IA em QA documentada</li>\n<li>[ ] Processos de revisão de decisões de IA</li>\n<li>[ ] Documentação de modelos utilizados</li>\n<li>[ ] Plano de contingência para falhas de IA</li>\n<li>[ ] Treinamento de equipe em uso responsável</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A IA está transformando fundamentalmente a QA, oferecendo oportunidades sem precedentes para aumentar eficiência, cobertura e qualidade. Embora a adoção em escala ainda seja um desafio, organizações que investem estrategicamente em IA para QA estão obtendo vantagens competitivas significativas.</p>\n\n<p><strong>Resumo dos Principais Aprendizados:</strong></p>\n\n<p>✅ IA pode reduzir tempo de teste em 40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}  <br>✅ GenAI está sendo buscada por 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações, mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram em escala  <br>✅ Ferramentas como Playwright, Applitools e Testim estão liderando a adoção  <br>✅ Implementação requer estratégia, não apenas ferramentas  <br>✅ Futuro aponta para testes autônomos e manutenção preditiva</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem toda organização precisa de todas as capacidades</li><br><li><strong>Comece pequeno</strong> - Pilotos controlados são mais eficazes</li><br><li><strong>Meça resultados</strong> - Métricas são essenciais</li><br><li><strong>Treine sua equipe</strong> - Competências em IA são necessárias</li><br><li><strong>Governarize</strong> - Adote práticas éticas desde o início</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre IA em QA</h3></p>\n\n<p><strong>P: A IA vai substituir testadores humanos?</strong>  <br>R: Não. A IA complementa o trabalho humano, permitindo que testadores foquem em atividades estratégicas, exploratory testing e design de testes.</p>\n\n<p><strong>P: Qual é o ROI da implementação de IA em QA?</strong>  <br>R: O ROI típico é de 200-500{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em 12-18 meses, considerando redução de tempo de teste, aumento de cobertura e redução de defeitos em produção.</p>\n\n<p><strong>P: Preciso de especialistas em dados para implementar IA em QA?</strong>  <br>R: Não necessariamente. Muitas ferramentas são \"plug-and-play\" e não requerem conhecimento de ML. No entanto, para implementações avançadas, especialistas são úteis.</p>\n\n<p><strong>P: Quais são os principais riscos do uso de IA em QA?</strong>  <br>R: Os principais riscos incluem: dependência excessiva, viés em modelos, falta de transparência e custos inesperados de manutenção.</p>\n\n<p><strong>P: Quando devo começar a usar IA em QA?</strong>  <br>R: Se você tem mais de 100 testes automatizados ou gastando mais de 20 horas/semana em QA, é um bom momento para avaliar ferramentas de IA.</p>\n\n<hr>\n<em>Fonte: World Quality Report 2025, Software Testing Magazine, Gartner Research, IEEE Software</em>', 'Inteligência Artificial em Quality Assurance: Guia Completo para 2025-2026', '', 'inherit', 'closed', 'closed', '', '181-revision-v1', '', '', '2026-07-06 22:52:48', '2026-07-07 01:52:48', '', '181', 'http://localhost:8082/ideiasti/?p=467', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('468', '0', '2026-07-06 22:55:46', '2026-07-07 01:55:46', '<h2>Introdução</h2>\n\n<p>O <strong>Blog QA Brasil</strong> valoriza sua privacidade. Esta Política de Privacidade descreve como coletamos, usamos, armazenamos e protegemos seus dados pessoais quando você utiliza nosso site, em conformidade com a <strong>Lei Geral de Proteção de Dados (LGPD - Lei nº 13.709/2018)</strong>.</p>\n\n<p>Última atualização: Julho de 2026</p>\n\n<hr>\n<h2>1. Dados que Coletamos</h2>\n\n<h3>1.1 Dados Fornecidos por Você</h3>\n\n<ul><li><strong>Comentários</strong> — Nome, e-mail e conteúdo do comentário</li><ol><li><strong>Newsletter</strong> — Nome e e-mail</li>\n<li><strong>Contato</strong> — Informações enviadas via formulários</li>\n<li><strong>Inscrições</strong> — Dados fornecidos ao se cadastrar em recursos</li>\n</ol>\n<h3>1.2 Dados Coletados Automaticamente</h3>\n<ol><li><strong>Cookies</strong> — Preferências de navegação e consentimento</li>\n<li><strong>Analytics</strong> — Páginas visitadas, tempo de navegação, origem do tráfego</li>\n<li><strong>Endereço IP</strong> — Coletado anonimamente para segurança e analytics</li>\n<li><strong>Navegador e dispositivo</strong> — Informações técnicas sobre sua visita</li>\n</ol>\n<hr>\n<h2>2. Como Usamos Seus Dados</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Finalidade</th><th>Base Legal (LGPD)</th></tr>\n<tr><td>Publicar comentários</td><td>Consentimento</td></tr>\n<tr><td>Enviar newsletter</td><td>Consentimento</td></tr>\n<tr><td>Melhorar o conteúdo</td><td>Interesse legítimo</td></tr>\n<tr><td>Segurança do site</td><td>Interesse legítimo</td></tr>\n<tr><td>Cumprir obrigações legais</td><td>Obrigação legal</td></tr>\n</table></figure>\n\n<hr>\n<h2>3. Cookies</h2>\n\n<h3>3.1 O Que São Cookies</h3>\n\n<p>Cookies são pequenos arquivos armazenados no seu navegador que nos ajudam a melhorar sua experiência de navegação.</p>\n\n<h3>3.2 Tipos de Cookies</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo</th><th>Finalidade</th><th>Armazenamento</th></tr>\n<tr><td><strong>Essenciais</strong></td><td>Funcionamento básico do site</td><td>Sessão</td></tr>\n<tr><td><strong>Funcionais</strong></td><td>Preferências do usuário</td><td>1 ano</td></tr>\n<tr><td><strong>Analíticos</strong></td><td>Métricas de uso</td><td>2 anos</td></tr>\n<tr><td><strong>Marketing</strong></td><td>Conteúdo relevante</td><td>2 anos</td></tr>\n</table></figure>\n\n<h3>3.3 Gerenciamento</h3>\n\n<p>Você pode controlar os cookies através das configurações do seu navegador ou através do nosso painel de preferências disponível no site.</p>\n\n<hr>\n<h2>4. Compartilhamento de Dados</h2>\n\n<h3>4.1 Com Quem Compartilhamos</h3>\n<ol><li><strong>Google Analytics</strong> — Métricas de audiência (anonimizadas)</li>\n<li><strong>Provedor de E-mail</strong> — Newsletter (apenas e-mail)</li>\n<li><strong>Autoridades legais</strong> — Quando exigido por lei</li>\n</ol>\n<h3>4.2 Compromisso</h3>\n\n<p><strong>Não vendemos</strong> seus dados pessoais para terceiros. <strong>Não compartilhamos</strong> dados além do necessário para os serviços descritos.</p>\n\n<hr>\n<h2>5. Seus Direitos (LGPD)</h2>\n\n<p>De acordo com a LGPD, você tem direito a:<br><ol><li><strong>Confirmação</strong> da existência de tratamento de dados</li><br><li><strong>Acesso</strong> aos seus dados pessoais</li><br><li><strong>Correção</strong> de dados incompletos ou incorretos</li><br><li><strong>Exclusão</strong> de dados tratados com consentimento</li><br><li><strong>Portabilidade</strong> dos dados</li><br><li><strong>Revogação</strong> do consentimento a qualquer momento</li><br></ol><br>Para exercer seus direitos, entre em contato pelo e-mail abaixo.</p>\n\n<hr>\n<h2>6. Armazenamento e Segurança</h2>\n\n<h3>6.1 Medidas de Segurança</h3>\n<ol><li>Criptografia SSL/TLS nas comunicações</li>\n<li>Acesso restrito a dados pessoais</li>\n<li>Revisões periódicas de segurança</li></ol></ul>\n\n<h3>6.2 Período de Armazenamento</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo de Dado</th><th>Período</th></tr>\n<tr><td>Comentários</td><td>Indeterminado (até solicitação de exclusão)</td></tr>\n<tr><td>Newsletter</td><td>Até descadastro</td></tr>\n<tr><td>Analytics</td><td>Anonimizado após 24 meses</td></tr>\n<tr><td>Logs de servidor</td><td>6 meses</td></tr>\n</table></figure>\n\n<hr>\n<h2>7. Direitos de Imagem</h2>\n\n<h3>7.1 Imagens do Site</h3>\n\n<p>Utilizamos imagens de fontes como <strong>Unsplash, Giphy e Pexels</strong> sob licenças permissivas. Quando aplicável, creditamos os autores.</p>\n\n<h3>7.2 Conteúdo do Usuário</h3>\n\n<p>Ao enviar comentários com imagens ou links, você é responsável pelo conteúdo enviado.</p>\n\n<hr>\n<h2>8. Alterações nesta Política</h2>\n\n<p>Reservamo-nos o direito de atualizar esta política a qualquer momento:<br><ol><li>Publicaremos a versão atualizada nesta página</li><br><li>Atualizaremos a data de \"Última atualização\"</li><br><li>Mudanças significativas serão notificadas via newsletter (quando aplicável)</li><br></ol><br><hr><br><h2>9. Contato</h2></p>\n\n<p>Para questões sobre privacidade e proteção de dados:</p>\n\n<p><strong>Blog Ideiasti</strong><br>E-mail: pcyasuic@outlook.com</p>\n\n<hr>\n<em>Esta Política de Privacidade foi elaborada em conformidade com a Lei Geral de Proteção de Dados (LGPD - Lei nº 13.709/2018).</em>', 'Política de Privacidade', '', 'inherit', 'closed', 'closed', '', '452-revision-v1', '', '', '2026-07-06 22:55:46', '2026-07-07 01:55:46', '', '452', 'http://localhost:8082/ideiasti/?p=468', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('469', '0', '2026-07-06 22:55:52', '2026-07-07 01:55:52', '', 'giphy-10', '', 'inherit', 'open', 'closed', '', 'giphy-10', '', '', '2026-07-06 22:55:52', '2026-07-07 01:55:52', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-10.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('470', '0', '2026-07-06 22:55:54', '2026-07-07 01:55:54', '<p><strong>Meta Description:</strong> Conheça todos os tipos de testes de software: funcionais, não-funcionais, unitários, integração, sistema e mais. Guia completo com definições, objetivos e melhores práticas.</p>\n\n<hr>\n<h2>Introdução aos Tipos de Testes de Software</h2>\n\n<p>Os testes de software são uma atividade crítica no ciclo de desenvolvimento de sistemas. Compreender os diferentes tipos de testes e quando aplicá-los é fundamental para garantir a qualidade e confiabilidade das aplicações.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-10.gif\" alt=\"Pirâmide de Testes - Hierarquia de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este guia completo apresenta uma categorização detalhada dos principais tipos de testes de software, suas finalidades, características e quando cada um deve ser utilizado no seu projeto.</p>\n\n<hr>\n<h2>Categorização Geral dos Testes</h2>\n\n<p>Os testes de software podem ser divididos em duas categorias principais:</p>\n\n<h3>1. Testes Funcionais</h3>\n\n<p>Verificam se o software funciona conforme especificado, testando funcionalidades específicas e requisitos do negócio.</p>\n\n<h3>2. Testes Não-Funcionais</h3>\n\n<p>Avaliam características como performance, segurança, usabilidade e confiabilidade, que não estão relacionadas a funcionalidades específicas.</p>\n\n<hr>\n<h2>Testes Funcionais: Garantindo o Comportamento Correto</h2>\n\n<h3>Teste Unitário: A Base de Tudo</h3>\n\n<p>O teste unitário é o tipo mais básico de teste, onde cada unidade de código (geralmente uma função ou método) é testada isoladamente. Esta atividade é realizada durante as etapas de desenvolvimento pelos próprios desenvolvedores.</p>\n\n<h4>Objetivos dos Testes Unitários</h4>\n\n<ul><li><strong>Identificar falhas em componentes individuais</strong> - Detectar problemas cedo</li><ol><li><strong>Garantir que cada função trabalha corretamente</strong> - Validação granular</li>\n<li><strong>Facilitar a detecção precoce de defeitos</strong> - Redução de custos</li>\n<li><strong>Documentar o código</strong> - Testes como especificação executável</li>\n<li><strong>Permitir refactoring seguro</strong> - Confiança ao modificar código</li>\n</ol>\n<h4>Exemplo Prático em Python (pytest)</h4>\n\n<pre><code>def calcular_desconto(valor_original, percentual):\n    \"\"\"Calcula o valor do desconto.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual deve estar entre 0 e 100\")\n    desconto = valor_original * (percentual / 100)\n    return valor_original - desconto\n\n<p>def test_calcular_desconto_10_porcento():<br>    assert calcular_desconto(100, 10) == 90</p>\n\n<p>def test_calcular_desconto_50_porcento():<br>    assert calcular_desconto(200, 50) == 100</p>\n\n<p>def test_calcular_desconto_invalido():<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 150)<br></code></pre></p>\n\n<h4>Frameworks Populares para Testes Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Framework</th><th>Características</th></tr>\n<tr><td>Java</td><td>JUnit 5, TestNG</td><td>Mais popular, extensível</td></tr>\n<tr><td>JavaScript</td><td>Jest, Mocha</td><td>Rápido, Mocking fácil</td></tr>\n<tr><td>Python</td><td>pytest, unittest</td><td>Sintaxe simples, fixtures</td></tr>\n<tr><td>C#</td><td>xUnit, NUnit</td><td>.NET ecosystem</td></tr>\n<tr><td>Go</td><td>testing (stdlib)</td><td>Simples, integrado</td></tr>\n</table></figure>\n\n<h4>Melhores Práticas para Testes Unitários</h4>\n\n<p>✅ <strong>Teste apenas uma coisa de cada vez</strong> - Um assert por teste é ideal  <br>✅ <strong>Nomes descritivos</strong> - <code>test_deve_retornar_erro_quando_usuario_invalido</code>  <br>✅ <strong>Independência</strong> - Testes não devem depender uns dos outros  <br>✅ <strong>Rapidez</strong> - Unit tests devem executar em milissegundos  <br>✅ <strong>Isolamento</strong> - Use mocks para dependências externas</p>\n\n<hr>\n<h3>Teste de Integração: Verificando Conexões</h3>\n\n<p>O teste de integração verifica a comunicação entre diferentes módulos ou componentes do sistema. Este tipo de teste é crucial para garantir que as partes do sistema funcionam corretamente quando combinadas.</p>\n\n<h4>Características Principais</h4>\n<ol><li><strong>Valida interfaces e interações entre componentes</strong> - Fluxo de dados correto</li>\n<li><strong>Identifica problemas de comunicação</strong> - API mismatches, protocolos</li>\n<li><strong>Pode ser realizado de forma incremental ou big-bang</strong> - Duas abordagens</li>\n<li><strong>Testa camadas de persistência</strong> - Bancos de dados, APIs externas</li>\n</ol>\n<h4>Estratégias de Integração</h4>\n\n<p>##### 1. Big-Bang Integration</p>\n\n<p>Todos os componentes são integrados simultaneamente e testados juntos.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Simples de implementar</li><br><li>Bom para sistemas pequenos</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Difícil localização de erros</li><br><li>Todos os módulos devem estar prontos</li><br></ol><br>##### 2. Incremental Integration (Bottom-Up)</p>\n\n<p>Começa pelos módulos mais baixos e集成 progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Defeitos fáceis de isolar</li><br><li>Feedback contínuo</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode ter módulos de alto nível sem testes até o final</li><br></ol><br>##### 3. Incremental Integration (Top-Down)</p>\n\n<p>Começa pelos módulos de mais alto nível e desce progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Interface do usuário testada primeiro</li><br><li>Protótipo funcional rápido</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Módulos de baixo nível simulados (stubs)</li><br></ol><br><h4>Exemplo de Teste de Integração (REST API)</h4></p>\n\n<pre><code>import requests\nimport pytest\n\n<p>class TestUserAPI:<br>    BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>def test_criar_usuario(self):<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"senha123\"<br>        }<br>        response = requests.post(f\"{self.BASE_URL}/usuarios\", json=payload)</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data</p>\n\n<p>def test_listar_usuarios(self):<br>        response = requests.get(f\"{self.BASE_URL}/usuarios\")</p>\n\n<p>assert response.status_code == 200<br>        assert isinstance(response.json(), list)<br></code></pre></p>\n\n<hr>\n<h3>Teste de Sistema: Visão Holística</h3>\n\n<p>O teste de sistema avalia o software como um todo, verificando se todos os componentes funcionam juntos para atender aos requisitos definidos.</p>\n\n<h4>O Que é Testado no Nível de Sistema?</h4>\n<ol><li><strong>Integração entre todos os módulos</strong></li>\n<li><strong>Fluxos de negócio completos</strong></li>\n<li><strong>Conformidade com requisitos funcionais</strong></li>\n<li><strong>Interface com sistemas externos</strong></li>\n<li><strong>Performance do sistema integrado</strong></li>\n<li><strong>Segurança end-to-end</strong></li>\n</ol>\n<h4>Exemplo: Fluxo de E-commerce</h4>\n\n<pre><code>Usuário → Login → Navegação → Carrinho → Checkout → Pagamento → Confirmação\n    ↓         ↓          ↓           ↓           ↓            ↓            ↓\n Cadastro   Session   Produtos    Estoque     Frete        Stripe     E-mail\n   ↕          ↕         ↕          ↕          ↕            ↕          ↕\n  DB        Redis     DB/API     DB         Correios      API       SMTP\n</code></pre>\n\n<p>Cada seta representa um ponto de integração que deve ser testado no nível de sistema.</p>\n\n<hr>\n<h3>Teste de Aceitação: Validando com o Cliente</h3>\n\n<p>O teste de aceitação determina se um produto ou sistema atende às expectativas e requisitos do cliente. Este é frequentemente o último nível de teste antes da entrega正式.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto certo?\"</strong></p>\n\n<h4>Tipos de Teste de Aceitação</h4>\n\n<p>##### 1. Teste de Aceitação do Usuário (UAT)</p>\n\n<p>Usuários finais testam o sistema em um ambiente semelhante ao de produção.</p>\n\n<p>##### 2. Teste de Aceitação Operacional (OAT)</p>\n\n<p>Equipe de operações validabackup, recuperação, relatórios.</p>\n\n<p>##### 3. Teste de Aceitação Contratual</p>\n\n<p>Verifica se o sistema atende aos critérios contratuais.</p>\n\n<h4>Características do UAT</h4>\n<ol><li>Geralmente envolve cooperação ou feedback do cliente</li>\n<li>Atividade de validação com dados reais</li>\n<li>Foco na usabilidade e fluxo de negócio</li>\n<li>Pode revelar requisitos mal entendidos</li>\n<li>Último checkpoint antes do go-live</li>\n</ol>\n<hr>\n<h3>Teste Funcional: Verificando Funcionalidades</h3>\n\n<p>O teste funcional determina se um recurso ou sistema funciona corretamente sem problemas. Verifica o sistema em diferentes níveis para garantir que todos os cenários são cobertos.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto da forma certa?\"</strong></p>\n\n<h4>Técnicas de Teste Funcional</h4>\n\n<p>##### 1. Teste Baseado em Requisitos<br><ol><li>Cada requisito tem casos de teste correspondentes</li><br><li>Rastreabilidade entre requisitos e testes</li><br><li>Cobertura completa</li><br></ol><br>##### 2. Teste Baseado em Casos de Uso<br><ol><li>Cenários de usuário documentados</li><br><li>Fluxos principais e alternativos</li><br><li>Pré-condições e pós-condições</li><br></ol><br>##### 3. Teste de Tabela de Decisão<br><ol><li>Combinações de condições e ações</li><br><li>Útil para regras de negócio complexas</li><br></ol><br>##### 4. Teste de Transição de Estado<br><ol><li>Mudanças de estado do sistema</li><br><li>Diagramas de estado</li><br></ol><br><hr><br><h2>Testes Não-Funcionais: Avaliando Qualidade Oculta</h2></p>\n\n<h3>Teste de Desempenho: Rapidez e Estabilidade</h3>\n\n<figure><img src=\"https://media.giphy.com/media/l0Iy69RBwNTRF0MXi/giphy.gif\" alt=\"Performance Testing - Testes de Desempenho\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de desempenho avalia a velocidade, responsividade e estabilidade do sistema sob carga de trabalho. É crítico para garantir que a aplicação atende aos SLAs (Service Level Agreements).</p>\n\n<h4>Subtipo 1: Teste de Carga (Load Testing)</h4>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas.</p>\n\n<p><strong>Métricas Coletadas:</strong><ol><li>Tempo de resposta (média, p95, p99)</li><br><li>Throughput (requisições por segundo)</li><br><li>Utilização de recursos (CPU, memória, disco)</li><br><li>Taxa de erros</li><br></ol><br><strong>Ferramentas Populares:</strong><ol><li>JMeter</li><br><li>Gatling</li><br><li>k6</li><br><li>Locust</li><br></ol><br><h4>Subtipo 2: Teste de Estresse (Stress Testing)</h4></p>\n\n<p>Avalia os limites do sistema além da capacidade normal para identificar o ponto de quebra.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar capacidade máxima</li><br><li>Verificar comportamento sob overload</li><br><li>Medir tempo de recuperação</li><br><li>Validar failovers</li><br></ol><br><h4>Subtipo 3: Teste de Resistência (Soak Testing)</h4></p>\n\n<p>Executa o sistema sob carga por períodos prolongados para identificar degradação gradual.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Conexões não fechadas</li><br><li>Acúmulo de logs</li><br><li>Degradação de performance</li><br></ol><br><h4>Subtipo 4: Teste de Pico (Spike Testing)</h4></p>\n\n<p>Avalia reações do sistema a picos súbitos de carga.</p>\n\n<p><strong>Cenário Exemplo:</strong><br><pre><code>Carga normal: 1000 usuários<br>Pico: 5000 usuários em 10 segundos<br>Recovery: Voltar para 1000 usuários<br></code></pre></p>\n\n<h4>Ferramentas de Teste de Desempenho</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>JMeter</strong></td><td>Open Source</td><td>Java</td><td>Enterprise, complexo</td></tr>\n<tr><td><strong>Gatling</strong></td><td>Open Source</td><td>Scala</td><td>DevOps, CI/CD</td></tr>\n<tr><td><strong>k6</strong></td><td>Open Source</td><td>JavaScript</td><td>Moderno, extensível</td></tr>\n<tr><td><strong>Locust</strong></td><td>Open Source</td><td>Python</td><td>Python teams</td></tr>\n<tr><td><strong>LoadRunner</strong></td><td>Comercial</td><td>Various</td><td>Enterprise</td></tr>\n</table></figure>\n\n<h4>Exemplo de Teste de Carga com k6</h4>\n\n<pre><code>// script.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },  // Ramp-up<br>    { duration: \'5m\', target: 100 },  // Steady state<br>    { duration: \'2m\', target: 200 },  // Spike<br>    { duration: \'5m\', target: 200 },  // Steady state<br>    { duration: \'2m\', target: 0 },    // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // Menos de 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/produtos\');<br>  check(res, {<br>    \'status é 200\': (r) =&gt; r.status === 200,<br>    \'tempo  r.timings.duration &lt; 500,<br>  });<br>  sleep(1);<br>}<br></code></pre></p>\n\n<hr>\n<h3>Teste de Segurança: Protegendo Dados e Sistemas</h3>\n\n<figure><img src=\"https://media.giphy.com/media/1qfDU4MJv3jWu34hEx/giphy.gif\" alt=\"Security Testing - Escudo de Segurança\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de segurança identifica vulnerabilidades e garante proteção de dados. Em um mundo cada vez mais digital, a segurança é prioridade.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n\n<p>##### 1. Teste de Penetração (Pen Test)</p>\n\n<p>Simula ataques para identificar vulnerabilidades antes que hackers maliciosos o façam.</p>\n\n<p><strong>Metodologias:</strong><ol><li>OWASP Testing Guide</li><br><li>PTES (Penetration Testing Execution Standard)</li><br><li>NIST SP 800-115</li><br></ol><br><strong>Tipos de Pentest:</strong><ol><li><strong>Black Box:</strong> Sem conhecimento prévio</li><br><li><strong>White Box:</strong> Código e documentação</li><br><li><strong>Gray Box:</strong> Conhecimento parcial</li><br></ol><br>##### 2. Varredura de Vulnerabilidade</p>\n\n<p>Identifica pontos fracos conhecidos através de scanning automatizado.</p>\n\n<p><strong>Ferramentas:</strong><ol><li>Nessus</li><br><li>OpenVAS</li><br><li>Qualys</li><br><li>Nexpose</li><br></ol><br>##### 3. Teste de Firewall e WAF</p>\n\n<p>Verifica configurações de segurança de firewalls e Web Application Firewalls.</p>\n\n<p><strong>O que testar:</strong><ol><li>Regras de firewall</li><br><li>Block de IPs maliciosos</li><br><li>Detecção de SQL Injection</li><br><li>Proteção XSS</li><br></ol><br>##### 4. Análise de Código Estático (SAST)</p>\n\n<p>Detecta vulnerabilidades no código-fonte sem executá-lo.</p>\n\n<p><strong>Ferramentas SAST:</strong><ol><li>SonarQube</li><br><li>Checkmarx</li><br><li>Fortify</li><br><li>Snyk Code</li><br></ol><br>##### 5. Análise de Componentes (SCA)</p>\n\n<p>Identifica vulnerabilidades em bibliotecas e dependências.</p>\n\n<p><strong>Ferramentas SCA:</strong><ol><li>Snyk</li><br><li>OWASP Dependency-Check</li><br><li>WhiteSource</li><br><li>Dependabot</li><br></ol><br><h4>OWASP Top 10: Vulnerabilidades Mais Comuns</h4><br><ol><li><strong>A01 - Broken Access Control</strong></li><br><li><strong>A02 - Cryptographic Failures</strong></li><br><li><strong>A03 - Injection</strong></li><br><li><strong>A04 - Insecure Design</strong></li><br><li><strong>A05 - Security Misconfiguration</strong></li><br><li><strong>A06 - Vulnerable Components</strong></li><br><li><strong>A07 - Authentication Failures</strong></li><br><li><strong>A08 - Software and Data Integrity Failures</strong></li><br><li><strong>A09 - Security Logging Failures</strong></li><br><li><strong>A10 - SSRF (Server-Side Request Forgery)</strong></li><br></ol><br><hr><br><h3>Teste de Usabilidade: Experiência do Usuário</h3></p>\n\n<p>Avalia a facilidade de uso e a experiência do usuário com o sistema. O teste de usabilidade é essencial para garantir que os usuários consigam realizar suas tarefas de forma eficiente.</p>\n\n<h4>Critérios de Usabilidade</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Critério</th><th>Definição</th><th>Métrica</th></tr>\n<tr><td><strong>Eficácia</strong></td><td>Usuário consegue completar tarefa?</td><td>Taxa de sucesso</td></tr>\n<tr><td><strong>Eficiência</strong></td><td>Quanto tempo leva?</td><td>Tempo de tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Usuário gostou?</td><td>Questionários SUS</td></tr>\n<tr><td><strong>Aprendizagem</strong></td><td>Quanto tempo para aprender?</td><td>Tempo até proficiência</td></tr>\n<tr><td><strong>Memorização</strong></td><td>Lembra como usar?</td><td>Retenção após pausa</td></tr>\n</table></figure>\n\n<h4>Métodos de Teste de Usabilidade</h4>\n<ol><li><strong>Testes com Usuários</strong> - Sessões gravadas com participantes</li>\n<li><strong>Análise Heurística</strong> - Avaliação por especialistas</li>\n<li><strong>Questionários</strong> - SUS, SEQ, NPS</li>\n<li><strong>Eye Tracking</strong> - Rastreamento ocular</li>\n<li><strong>Análise de Tarefas</strong> - Tempos e erros</li>\n</ol>\n<h4>Frameworks de Avaliação</h4>\n<ol><li><strong>Nielsen\'s Heurísticas</strong> (10 princípios)</li>\n<li><strong>ISO 9241-11</strong> (Usabilidade)</li>\n<li><strong>WCAG 2.1</strong> (Acessibilidade)</li>\n</ol>\n<hr>\n<h3>Teste de Compatibilidade: Funciona em Todo Lugar?</h3>\n\n<p>Verifica se o software funciona em diferentes ambientes, navegadores e dispositivos.</p>\n\n<h4>Tipos de Teste de Compatibilidade</h4>\n\n<p>##### 1. Teste de Navegador (Cross-Browser)<br><ol><li>Chrome, Firefox, Safari, Edge</li><br><li>Diferentes versões</li><br><li>Modos de compatibilidade</li><br></ol><br>##### 2. Teste Mobile<br><ol><li>iOS (iPhone, iPad)</li><br><li>Android (diferentes fabricantes)</li><br><li>Diferentes tamanhos de tela</li><br><li>Diferentes versões de OS</li><br></ol><br>##### 3. Teste de Sistema Operacional<br><ol><li>Windows 10, 11</li><br><li>macOS (versões diferentes)</li><br><li>Linux (distribuições populares)</li><br></ol><br>##### 4. Teste de Hardware<br><ol><li>Diferentes processadores</li><br><li>Diferentes quantidades de RAM</li><br><li>Diferentes resoluções de tela</li><br></ol><br><h4>Ferramentas de Teste Cross-Browser</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Cobertura</th><th>Preço</th></tr>\n<tr><td>BrowserStack</td><td>3000+ dispositivos</td><td>$29+/mês</td></tr>\n<tr><td>Sauce Labs</td><td>1000+ dispositivos</td><td>$39+/mês</td></tr>\n<tr><td>LambdaTest</td><td>3000+ dispositivos</td><td>$15+/mês</td></tr>\n<tr><td>CrossBrowserTesting</td><td>1500+ dispositivos</td><td>$29+/mês</td></tr>\n</table></figure>\n\n<hr>\n<h3>Teste de Recuperação: Resistência a Falhas</h3>\n\n<p>Avalia a capacidade do sistema de se recuperar de falhas e disasters. É crucial para sistemas críticos que não podem ficar fora do ar.</p>\n\n<h4>Cenários de Teste</h4>\n<ol><li><strong>Falha de Hardware</strong></li>\n</ol>   - Perda de disco\n   - Falha de memória\n   - Queda de servidor\n<ol><li><strong>Falha de Software</strong></li>\n</ol>   - Crash de aplicação\n   - Deadlock\n   - Exceções não tratadas\n<ol><li><strong>Falha de Rede</strong></li>\n</ol>   - Perda de conectividade\n   - Alta latência\n   - Timeout\n<ol><li><strong>Desastres</strong></li>\n</ol>   - Perda de datacenter\n   - Corrupção de dados\n   - Ataques DDoS\n\n<h4>Métricas de Recuperação</h4>\n<ol><li><strong>RTO (Recovery Time Objective):</strong> Tempo máximo para recuperação</li>\n<li><strong>RPO (Recovery Point Objective):</strong> Perda máxima de dados aceitável</li>\n<li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li>\n<li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li>\n</ol>\n<hr>\n<h2>Testes de Regressão: Mantendo a Qualidade</h2>\n\n<p>Executados sempre que o código é modificado para garantir que alterações não introduzam novos defeitos. Este é um dos tipos de teste mais importantes e frequentemente executados.</p>\n\n<h3>Quando Executar Testes de Regressão</h3>\n\n<p>✅ Após cada release de software  <br>✅ Após correção de bugs  <br>✅ Após atualizações de dependências  <br>✅ Após refactoring de código  <br>✅ Antes do deploy de produção</p>\n\n<h3>Estratégias de Testes de Regressão</h3>\n\n<h4>1. Regressão Completa</h4>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura total</li><br><li>Alta confiança</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Tempo longo</li><br><li>Custo elevado</li><br></ol><br><h4>2. Regressão Seletiva</h4></p>\n\n<p>Seleciona testes relevantes baseados em mudanças.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Mais rápido</li><br><li>Mais econômico</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode perder cobertura</li><br></ol><br><h4>3. Regressão Prioritária</h4></p>\n\n<p>Executa testes por prioridade (críticos &gt; altos &gt; médios &gt; baixos).</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura do crítico rápido</li><br><li>Decisões baseadas em risco</li><br></ol><br><h3>Automação de Testes de Regressão</h3></p>\n\n<p>A automação é essencial para testes de regressão eficazes:</p>\n\n<p><strong>Benefícios:</strong><ol><li>Execução frequente</li><br><li>Resultados consistentes</li><br><li>Rapidez</li><br><li>Cobertura ampla</li><br></ol><br><strong>Ferramentas Recomendadas:</strong><ol><li>Selenium WebDriver</li><br><li>Playwright</li><br><li>Cypress</li><br><li>Appium (mobile)</li><br><li>RestAssured (API)</li><br></ol><br><hr><br><h2>Pirâmide de Testes: Arquitetura Ideal</h2></p>\n\n<p>A pirâmide de testes é um conceito fundamental que guia a distribuição dos tipos de teste:</p>\n\n<pre><code>                    /\n                   /  \n                  / E2E        ← Poucos testes E2E (lentos, caros)\n                 /      \n                /Integração   ← Alguns testes de integração\n               /            \n              /  Unitários     ← Muitos testes unitários (rápidos, baratos)\n             /________________\n</code></pre>\n\n<h3>Proporções Ideais</h3>\n<ol><li><strong>Unitários:</strong> 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>Integração:</strong> 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>E2E:</strong> 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Compreender os diferentes tipos de testes de software é fundamental para construir uma estratégia de QA eficaz. Cada tipo de teste tem seu propósito específico e deve ser aplicado no momento adequado do ciclo de desenvolvimento.</p>\n\n<p><strong>Resumo dos Tipos de Testes:</strong></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Categoria</th><th>Tipo</th><th>Quando Usar</th><th>Objetivo</th></tr>\n<tr><td><strong>Funcional</strong></td><td>Unitário</td><td>Desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Integração</td><td>Pós-unitário</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Sistema</td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Aceitação</td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Performance</td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Segurança</td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Usabilidade</td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n</table></figure>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem todo projeto precisa de todos os tipos</li><br><li><strong>Priorize</strong> - Comece com unitários e integração</li><br><li><strong>Automatize</strong> - Regressão deve ser automática</li><br><li><strong>Meça</strong> - Cobertura, tempo, defeitos encontrados</li><br><li><strong>Melhore</strong> - Itere constantemente</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre Tipos de Testes</h3></p>\n\n<p><strong>P: Quantos tipos de testes existem?</strong>  <br>R: Existem dozens de tipos de testes classificados de diferentes formas. Os principais são funcionais e não-funcionais, cada um com subtipos específicos.</p>\n\n<p><strong>P: Qual a diferença entre teste de sistema e teste de aceitação?</strong>  <br>R: Teste de sistema verifica se o sistema atende aos requisitos técnicos. Teste de aceitação verifica se o sistema atende às expectativas do usuário/cliente.</p>\n\n<p><strong>P: Testes manuais podem ser substituídos por automatizados?</strong>  <br>R: Não completamente. Testes manuais são essenciais para exploratory testing, UX e cenários complexos. A automação complementa, não substitui.</p>\n\n<p><strong>P: Quando devo começar a testar?</strong>  <br>R: O mais cedo possível! O conceito de Shift-Left recomenda testes desde as primeiras fases do desenvolvimento.</p>\n\n<p><strong>P: Qual a ordem ideal de execução dos testes?</strong>  <br>R: Unitários → Integração → Sistema → Aceitação. Cada nível depende do anterior.</p>\n\n<hr>\n<em>Fonte: Selenium.dev, Atlassian, Vericode, ISTQB, OWASP</em>', 'Tipos de Testes de Software: Guia Completo com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '179-revision-v1', '', '', '2026-07-06 22:55:54', '2026-07-07 01:55:54', '', '179', 'http://localhost:8082/ideiasti/?p=470', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('471', '0', '2026-07-06 22:55:57', '2026-07-07 01:55:57', '', 'giphy-11', '', 'inherit', 'open', 'closed', '', 'giphy-11', '', '', '2026-07-06 22:55:57', '2026-07-07 01:55:57', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-11.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('472', '0', '2026-07-06 22:55:58', '2026-07-07 01:55:58', '<p><strong>Meta Description:</strong> Descubra como a Inteligência Artificial está revolucionando a QA: automação inteligente, geração de testes, detecção de anomalias e manutenção preditiva. Guia completo para profissionais.</p>\n\n<hr>\n<h2>Estado Atual da IA em QA</h2>\n\n<p>O <strong>World Quality Report 2025</strong> revela dados impressionantes: quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão ativamente buscando GenAI</strong> em práticas de Quality Engineering (QE), mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} alcançaram implementação em escala empresarial.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-11.gif\" alt=\"AI Brain - Inteligência Artificial em QA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Esta lacuna entre interesse e implementação representa uma oportunidade significativa para profissionais e organizações que souberem aproveitar efetivamente essas tecnologias.</p>\n\n<hr>\n<h2>Por Que a Adoção de IA em QA Está Crescendo?</h2>\n\n<h3>Drivers de Adoção</h3>\n<ol><li><strong>Volume de testes crescente</strong> - Sistemas mais complexos exigem mais testes</li>\n<li><strong>Pressure de velocidade</strong> - CI/CD demanda execuções mais rápidas</li>\n<li><strong>Escassez de profissionais</strong> - Demanda supera oferta de testadores</li>\n<li><strong>Qualidade em produção</strong> - Necessidade de monitoramento contínuo</li>\n<li><strong>Custos crescentes</strong> - Automação inteligente reduz despesas</li>\n</ol>\n<h3>Benefícios Comprovados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Impacto da IA</th></tr>\n<tr><td>Redução de tempo de teste</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de custos de QA</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Melhoria em cobertura</td><td>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Detecção precoce de bugs</td><td>3-5x mais cedo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Desafios de Adoção de IA em QA</h2>\n\n<h3>1. Desalinhamento Estratégico</h3>\n\n<p>Existe um hiato crescente entre o interesse organizacional em GenAI e a prontidão real para adoção efetiva dentro de QE. O caminho da experimentação para implementação é mais complexo do que o antecipado.</p>\n\n<h4>Sinais de Desalinhamento</h4>\n\n<ul><li>GenAI vista como \"solução mágica\" sem estratégia clara</li><ol><li>Falta de alinhamento entre TI e negócios</li>\n<li>Expectativas irreais sobre capacidades</li>\n<li>Subestimação de esforço de integração</li>\n</ol>\n<h3>2. Complexidade de Implementação</h3>\n\n<p>A implementação de IA em QA requer alinhamento entre inovação operacional e oversight estratégico. Desafios incluem:</p>\n\n<h4>Desafios Técnicos</h4>\n<ol><li>Integração com sistemas legados</li>\n<li>Qualidade dos dados de treinamento</li>\n<li>Escolha de modelos adequados</li>\n<li>Manutenção de modelos em produção</li>\n</ol>\n<h4>Desafios Organizacionais</h4>\n<ol><li>Resistência cultural</li>\n<li>Falta de competências</li>\n<li>Processos não adaptados</li>\n<li>Governança de IA</li>\n</ol>\n<h3>3. Questões Éticas e de Governança</h3>\n<ol><li>Viés em modelos de IA</li>\n<li>Transparência nas decisões</li>\n<li>Responsabilidade por falhas</li>\n<li>Conformidade regulatória</li>\n</ol>\n<hr>\n<h2>Aplicações de IA em QA: Casos de Uso Detalhados</h2>\n\n<h3>1. Geração Automatizada de Testes</h3>\n\n<p>IA pode gerar casos de teste automaticamente baseados em requisitos e código. Esta é uma das aplicações mais promissoras.</p>\n\n<figure><img src=\"https://media.giphy.com/media/VbZ0cWw6cVPMM/giphy.gif\" alt=\"Automação de Testes com IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Requisitos → Análise de NLP → Cenários de Teste → Casos de Teste\n    ↓                                                        ↓\n Código → Análise Estática → Cobertura → Testes Sugeridos\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de unit tests</td><td>Diffblue</td></tr>\n<tr><td><strong>Testim</strong></td><td>Testes E2E com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>Automação sem código com IA</td><td>Avo Automation</td></tr>\n</table></figure>\n\n<h4>Exemplo: Geração de Testes com GenAI</h4>\n\n<pre><code># Exemplo conceitual de como IA pode gerar testes\nimport openai\n\n<p>def gerar_testes_para_requisito(requisito):<br>    prompt = f\"\"\"<br>    Gere casos de teste para o seguinte requisito:</p>\n\n<p>Requisito: {requisito}</p>\n\n<p>Formato de saída (JSON):<br>    {{<br>        \"casos_de_teste\": [<br>            {{<br>                \"id\": \"CT-001\",<br>                \"titulo\": \"...\",<br>                \"pre_condicoes\": [...],<br>                \"passos\": [...],<br>                \"dados_teste\": {{...}},<br>                \"resultado_esperado\": \"...\"<br>            }}<br>        ]<br>    }}<br>    \"\"\"</p>\n\n<p>response = openai.chat.completions.create(<br>        model=\"gpt-4\",<br>        messages=[{\"role\": \"user\", \"content\": prompt}]<br>    )</p>\n\n<p>return json.loads(response.choices[0].message.content)<br></code></pre></p>\n\n<h3>2. Detecção de Anomalias</h3>\n\n<p>Algoritmos de machine learning identificam padrões incomuns que indicam defeitos, revolucionando o monitoramento de qualidade.</p>\n\n<h4>Técnicas Utilizadas</h4>\n\n<p>##### Análise de Séries Temporais<br><ol><li>Identificação de anomalias em métricas de performance</li><br><li>Detecção de degradação gradual</li><br><li>Alertas proativos sobre problemas</li><br></ol><br>##### Clustering<br><ol><li>Agrupamento de testes similares</li><br><li>Identificação de testes atípicos</li><br><li>Detecção de padrões de falha</li><br></ol><br>##### Redes Neurais<br><ol><li>Detecção de padrões complexos</li><br><li>Aprendizado de comportamentos normais</li><br><li>Previsão de falhas</li><br></ol><br><h4>Ferramentas de Detecção de Anomalias</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Aplicação</th></tr>\n<tr><td><strong>Elastic APM</strong></td><td>APM</td><td>Detecção de anomalias em produção</td></tr>\n<tr><td><strong>Datadog</strong></td><td>Monitoring</td><td>ML para métricas</td></tr>\n<tr><td><strong>New Relic</strong></td><td>APM</td><td>Detecção inteligente</td></tr>\n<tr><td><strong>Grafana + Loki</strong></td><td>Logging</td><td>Análise de logs com ML</td></tr>\n</table></figure>\n\n<h3>3. Manutenção Inteligente de Testes</h3>\n\n<p>IA ajuda a identificar e remover testes obsoletos ou flaky, mantendo a suite de testes saudável.</p>\n\n<h4>Problemas que a IA Resolve</h4>\n\n<p><strong>Testes Flaky (Instáveis)</strong><br><ol><li>Identificação de padrões que causam instabilidade</li><br><li>Predição de quais testes podem falhar</li><br><li>Sugestões de correções</li><br><li>Quarentena automática</li><br></ol><br><strong>Testes Obsoletos</strong><br><ol><li>Detecção de funcionalidades removidas</li><br><li>Identificação de código não coberto</li><br><li>Sugestões de remoção segura</li><br></ol><br><h4>Exemplo de Detecção de Testes Flaky</h4></p>\n\n<pre><code># Sistema simplificado de detecção de testes flaky\nclass FlakyTestDetector:\n    def __init__(self):\n        self.test_history = {}\n        self.ml_model = load_trained_model()\n\n<p>def analyze_test(self, test_name, execution_history):<br>        features = self.extract_features(execution_history)<br>        flaky_probability = self.ml_model.predict_proba([features])[0]</p>\n\n<p>if flaky_probability &gt; 0.7:<br>            return {<br>                \"test\": test_name,<br>                \"flaky_probability\": flaky_probability,<br>                \"recommendation\": \"QUARANTINE\",<br>                \"reasons\": self.explain_prediction(features)<br>            }<br>        return {\"test\": test_name, \"flaky_probability\": flaky_probability}</p>\n\n<p>def extract_features(self, history):<br>        return [<br>            history.success_rate,<br>            history.avg_duration,<br>            history.recent_failures,<br>            history.environment_changes,<br>            history.dependency_changes<br>        ]<br></code></pre></p>\n\n<h3>4. Análise de Código Estático com IA</h3>\n\n<p>Identifica potenciais problemas de qualidade antes da execução, usando análise semântica avançada.</p>\n\n<h4>Capacidades Avançadas</h4>\n<ol><li><strong>Detecção de vulnerabilidades</strong> - OWASP Top 10</li>\n<li><strong>Análise de dependências</strong> - Bibliotecas desatualizadas</li>\n<li><strong>Code smells</strong> - Padrões problemáticos</li>\n<li><strong>Débito técnico</strong> - Métricas de qualidade</li>\n</ol>\n<h4>Ferramentas com IA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Capacidades IA</th><th>Integração</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Débito técnico, code smells</td><td>CI/CD</td></tr>\n<tr><td><strong>Snyk</strong></td><td>Vulnerabilidades, licenças</td><td>IDE, CI</td></tr>\n<tr><td><strong>CodeClimate</strong></td><td>Quality, maintainability</td><td>GitHub</td></tr>\n<tr><td><strong>DeepSource</strong></td><td>Análise estática com ML</td><td>Git</td></tr>\n</table></figure>\n\n<h3>5. Testes Visuais Automatizados</h3>\n\n<p>Comparação de interfaces visuais usando visão computacional para detectar regressões.</p>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Página Capturada → Modelo de Visão Computacional → Comparação com Baseline\n     ↓                          ↓                                    ↓\n  Screenshots           Detecção de Elementos           Diff Visual\n                                            ↓\n                                    Alertas de Regressão\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tecnologia</th><th>Diferencial</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Visual AI</td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de precisão</td></tr>\n<tr><td><strong> Percy</strong></td><td>Visual testing</td><td>Integração simples</td></tr>\n<tr><td><strong>Chromatic</strong></td><td>Visual regression</td><td>Para Storybook</td></tr>\n<tr><td><strong>Lost Pixel</strong></td><td>Open source</td><td>Self-hosted</td></tr>\n</table></figure>\n\n<h3>6. Oráculos de Teste Baseados em IA</h3>\n\n<p>Validação de resultados usando modelos treinados para determinar se o comportamento está correto.</p>\n\n<h4>Tipos de Oráculos</h4>\n<ol><li><strong>Oráculo de Imagem</strong> - Validação visual de UI</li>\n<li><strong>Oráculo de Texto</strong> - Análise de conteúdo</li>\n<li><strong>Oráculo de Comportamento</strong> - Detecção de anomalias</li>\n<li><strong>Oráculo de Dados</strong> - Validação de datasets</li>\n</ol>\n<hr>\n<h2>Ferramentas de IA para QA: Comparativo</h2>\n\n<h3>Plataformas Completas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Testim</strong></td><td>Automação inteligente E2E</td><td>$600+/mês</td><td>Equipes enterprise</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Automação com ML</td><td>Sob consulta</td><td>Escala enterprise</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>$500+/mês</td><td>CI/CD integrado</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>No-code com IA</td><td>Sob consulta</td><td>Enterprise</td></tr>\n<tr><td><strong>Perfecto</strong></td><td>Testes mobile/web com IA</td><td>Sob consulta</td><td>Mobile testing</td></tr>\n</table></figure>\n\n<h3>Ferramentas Especializadas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais</td><td>$100+/mês</td><td>UI testing</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Unit tests</td><td>$299/assinante</td><td>Dev teams</td></tr>\n<tr><td><strong>Snyk</strong></td><td>SCA</td><td>Grátis + Pro</td><td>Developers</td></tr>\n<tr><td><strong>SonarCloud</strong></td><td>SAST</td><td>Grátis + Pro</td><td>CI/CD</td></tr>\n</table></figure>\n\n<h3>Ferramentas Emerging (2025-2026)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Status</th></tr>\n<tr><td><strong>CodiumAI</strong></td><td>Testes gerados automaticamente</td><td>Beta</td></tr>\n<tr><td><strong>Mutable AI</strong></td><td>Code review + tests</td><td>Beta</td></tr>\n<tr><td><strong>Dagger</strong></td><td>CI/CD programável</td><td>GA</td></tr>\n<tr><td><strong>Trunk</strong></td><td>Linting inteligente</td><td>GA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando IA em QA: Roadmap Prático</h2>\n\n<h3>Fase 1: Avaliação e Planejamento (1-2 meses)</h3>\n\n<h4>Checklist de Avaliação</h4>\n<ol><li>[ ] Mapeamento de processos atuais de QA</li>\n<li>[ ] Identificação de pontos de dor</li>\n<li>[ ] Análise de ROI potencial</li>\n<li>[ ] Avaliação de maturidade tecnológica</li>\n<li>[ ] Levantamento de stakeholders</li>\n</ol>\n<h4>Métricas de Baseline</h4>\n\n<p>Antes de implementar, estabeleça métricas de referência:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Ferramenta</th></tr>\n<tr><td>Tempo de teste</td><td>Duração de suite</td><td>CI/CD logs</td></tr>\n<tr><td>Cobertura de teste</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>Coverage tools</td></tr>\n<tr><td>Taxa de defeitos</td><td>Bugs em produção</td><td>Bug tracker</td></tr>\n<tr><td>Testes flaky</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas instáveis</td><td>CI/CD</td></tr>\n<tr><td>Custo de QA</td><td>$/teste executado</td><td>Financeiro</td></tr>\n</table></figure>\n\n<h3>Fase 2: Pilot (2-3 meses)</h3>\n\n<h4>Escolha do Piloto</h4>\n\n<p>Selecione um projeto ou área com:<br><ol><li>✅ Escopo controlado</li><br><li>✅ Equipe aberta a inovação</li><br><li>✅ Processos definidos</li><br><li>✅ Métricas disponíveis</li><br></ol><br><h4>Pilotos Recomendados</h4><br><ol><li><strong>Geração de unit tests</strong> - Diffblue, CodiumAI</li><br><li><strong>Testes visuais</strong> - Applitools</li><br><li><strong>Detecção de flaky tests</strong> - Ferramentas de CI</li><br><li><strong>Análise estática</strong> - SonarQube, Snyk</li><br></ol><br><h3>Fase 3: Expansão (3-6 meses)</h3></p>\n\n<h4>Escalar Sucesso</h4>\n<ol><li>Documente aprendizados</li>\n<li>Treine outras equipes</li>\n<li>Padronize processos</li>\n<li>Melhore integrações</li>\n</ol>\n<h4>KPIs de Sucesso</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Meta (6 meses)</th></tr>\n<tr><td>Redução de tempo de teste</td><td>30-40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Aumento de cobertura</td><td>20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de defeitos em prod</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>ROI positivo</td><td>Sim</td></tr>\n</table></figure>\n\n<h3>Fase 4: Maturidade (6-12 meses)</h3>\n\n<h4>Implementação Enterprise</h4>\n<ol><li>Integração completa com CI/CD</li>\n<li>IA em produção (monitoramento)</li>\n<li>Maintenance automatizado</li>\n<li>Reporting avançado</li>\n</ol>\n<hr>\n<h2>Futuro da IA em QA: Tendências 2026-2028</h2>\n\n<h3>1. Testes Autônomos</h3>\n\n<p>Sistemas que automaticamente:<br><ol><li>Geram testes baseados em requisitos</li><br><li>Executam testes continuamente</li><br><li>Detectam e reportam falhas</li><br><li>Propõem correções</li><br></ol><br><h3>2. Manutenção Preditiva</h3></p>\n\n<p>IA que prevê:<br><ol><li>Quando testes vão falhar</li><br><li>Quando código precisa de mais testes</li><br><li>Quando componentes estão em risco</li><br><li>Quando fazer refactoring</li><br></ol><br><h3>3. GenAI Nativa em QA</h3></p>\n\n<p>Modelos treinados especificamente para:<br><ol><li>Entender código e testes</li><br><li>Gerar código de teste</li><br><li>Analisar requisitos</li><br><li>Documentar testes</li><br></ol><br><h3>4. Testes em Produção com IA</h3></p>\n\n<p>Monitoramento inteligente:<br><ol><li>Detecção de anomalias em produção</li><br><li>Geração automática de testes de regressão</li><br><li>Validação de deployments</li><br><li>Root cause analysis</li><br></ol><br><hr><br><h2>Considerações Éticas e Best Practices</h2></p>\n\n<h3>Governança de IA em QA</h3>\n\n<h4>Princípios</h4>\n<ol><li><strong>Transparência</strong> - Documente como a IA toma decisões</li>\n<li><strong>Responsabilidade</strong> - Humanos mantêm responsabilidade final</li>\n<li><strong>Fairness</strong> - Evite viés em modelos</li>\n<li><strong>Privacidade</strong> - Proteja dados sensíveis</li>\n<li><strong>Segurança</strong> - Proteja modelos contra ataques</li>\n</ol>\n<h4>Checklist de Governança</h4>\n<ol><li>[ ] Política de uso de IA em QA documentada</li>\n<li>[ ] Processos de revisão de decisões de IA</li>\n<li>[ ] Documentação de modelos utilizados</li>\n<li>[ ] Plano de contingência para falhas de IA</li>\n<li>[ ] Treinamento de equipe em uso responsável</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A IA está transformando fundamentalmente a QA, oferecendo oportunidades sem precedentes para aumentar eficiência, cobertura e qualidade. Embora a adoção em escala ainda seja um desafio, organizações que investem estrategicamente em IA para QA estão obtendo vantagens competitivas significativas.</p>\n\n<p><strong>Resumo dos Principais Aprendizados:</strong></p>\n\n<p>✅ IA pode reduzir tempo de teste em 40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}  <br>✅ GenAI está sendo buscada por 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações, mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram em escala  <br>✅ Ferramentas como Playwright, Applitools e Testim estão liderando a adoção  <br>✅ Implementação requer estratégia, não apenas ferramentas  <br>✅ Futuro aponta para testes autônomos e manutenção preditiva</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem toda organização precisa de todas as capacidades</li><br><li><strong>Comece pequeno</strong> - Pilotos controlados são mais eficazes</li><br><li><strong>Meça resultados</strong> - Métricas são essenciais</li><br><li><strong>Treine sua equipe</strong> - Competências em IA são necessárias</li><br><li><strong>Governarize</strong> - Adote práticas éticas desde o início</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre IA em QA</h3></p>\n\n<p><strong>P: A IA vai substituir testadores humanos?</strong>  <br>R: Não. A IA complementa o trabalho humano, permitindo que testadores foquem em atividades estratégicas, exploratory testing e design de testes.</p>\n\n<p><strong>P: Qual é o ROI da implementação de IA em QA?</strong>  <br>R: O ROI típico é de 200-500{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em 12-18 meses, considerando redução de tempo de teste, aumento de cobertura e redução de defeitos em produção.</p>\n\n<p><strong>P: Preciso de especialistas em dados para implementar IA em QA?</strong>  <br>R: Não necessariamente. Muitas ferramentas são \"plug-and-play\" e não requerem conhecimento de ML. No entanto, para implementações avançadas, especialistas são úteis.</p>\n\n<p><strong>P: Quais são os principais riscos do uso de IA em QA?</strong>  <br>R: Os principais riscos incluem: dependência excessiva, viés em modelos, falta de transparência e custos inesperados de manutenção.</p>\n\n<p><strong>P: Quando devo começar a usar IA em QA?</strong>  <br>R: Se você tem mais de 100 testes automatizados ou gastando mais de 20 horas/semana em QA, é um bom momento para avaliar ferramentas de IA.</p>\n\n<hr>\n<em>Fonte: World Quality Report 2025, Software Testing Magazine, Gartner Research, IEEE Software</em>', 'Inteligência Artificial em Quality Assurance: Guia Completo para 2025-2026', '', 'inherit', 'closed', 'closed', '', '181-revision-v1', '', '', '2026-07-06 22:55:58', '2026-07-07 01:55:58', '', '181', 'http://localhost:8082/ideiasti/?p=472', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('474', '0', '2026-07-06 23:05:51', '2026-07-07 02:05:51', '', 'giphy-12', '', 'inherit', 'open', 'closed', '', 'giphy-12', '', '', '2026-07-06 23:05:51', '2026-07-07 02:05:51', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-12.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('475', '0', '2026-07-06 23:05:52', '2026-07-07 02:05:52', '<p><strong>Meta Description:</strong> Conheça todos os tipos de testes de software: funcionais, não-funcionais, unitários, integração, sistema e mais. Guia completo com definições, objetivos e melhores práticas.</p>\n\n<hr>\n<h2>Introdução aos Tipos de Testes de Software</h2>\n\n<p>Os testes de software são uma atividade crítica no ciclo de desenvolvimento de sistemas. Compreender os diferentes tipos de testes e quando aplicá-los é fundamental para garantir a qualidade e confiabilidade das aplicações.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-12.gif\" alt=\"Pirâmide de Testes - Hierarquia de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este guia completo apresenta uma categorização detalhada dos principais tipos de testes de software, suas finalidades, características e quando cada um deve ser utilizado no seu projeto.</p>\n\n<hr>\n<h2>Categorização Geral dos Testes</h2>\n\n<p>Os testes de software podem ser divididos em duas categorias principais:</p>\n\n<h3>1. Testes Funcionais</h3>\n\n<p>Verificam se o software funciona conforme especificado, testando funcionalidades específicas e requisitos do negócio.</p>\n\n<h3>2. Testes Não-Funcionais</h3>\n\n<p>Avaliam características como performance, segurança, usabilidade e confiabilidade, que não estão relacionadas a funcionalidades específicas.</p>\n\n<hr>\n<h2>Testes Funcionais: Garantindo o Comportamento Correto</h2>\n\n<h3>Teste Unitário: A Base de Tudo</h3>\n\n<p>O teste unitário é o tipo mais básico de teste, onde cada unidade de código (geralmente uma função ou método) é testada isoladamente. Esta atividade é realizada durante as etapas de desenvolvimento pelos próprios desenvolvedores.</p>\n\n<h4>Objetivos dos Testes Unitários</h4>\n\n<ul><li><strong>Identificar falhas em componentes individuais</strong> - Detectar problemas cedo</li><ol><li><strong>Garantir que cada função trabalha corretamente</strong> - Validação granular</li>\n<li><strong>Facilitar a detecção precoce de defeitos</strong> - Redução de custos</li>\n<li><strong>Documentar o código</strong> - Testes como especificação executável</li>\n<li><strong>Permitir refactoring seguro</strong> - Confiança ao modificar código</li>\n</ol>\n<h4>Exemplo Prático em Python (pytest)</h4>\n\n<pre><code>def calcular_desconto(valor_original, percentual):\n    \"\"\"Calcula o valor do desconto.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual deve estar entre 0 e 100\")\n    desconto = valor_original * (percentual / 100)\n    return valor_original - desconto\n\n<p>def test_calcular_desconto_10_porcento():<br>    assert calcular_desconto(100, 10) == 90</p>\n\n<p>def test_calcular_desconto_50_porcento():<br>    assert calcular_desconto(200, 50) == 100</p>\n\n<p>def test_calcular_desconto_invalido():<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 150)<br></code></pre></p>\n\n<h4>Frameworks Populares para Testes Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Framework</th><th>Características</th></tr>\n<tr><td>Java</td><td>JUnit 5, TestNG</td><td>Mais popular, extensível</td></tr>\n<tr><td>JavaScript</td><td>Jest, Mocha</td><td>Rápido, Mocking fácil</td></tr>\n<tr><td>Python</td><td>pytest, unittest</td><td>Sintaxe simples, fixtures</td></tr>\n<tr><td>C#</td><td>xUnit, NUnit</td><td>.NET ecosystem</td></tr>\n<tr><td>Go</td><td>testing (stdlib)</td><td>Simples, integrado</td></tr>\n</table></figure>\n\n<h4>Melhores Práticas para Testes Unitários</h4>\n\n<p>✅ <strong>Teste apenas uma coisa de cada vez</strong> - Um assert por teste é ideal  <br>✅ <strong>Nomes descritivos</strong> - <code>test_deve_retornar_erro_quando_usuario_invalido</code>  <br>✅ <strong>Independência</strong> - Testes não devem depender uns dos outros  <br>✅ <strong>Rapidez</strong> - Unit tests devem executar em milissegundos  <br>✅ <strong>Isolamento</strong> - Use mocks para dependências externas</p>\n\n<hr>\n<h3>Teste de Integração: Verificando Conexões</h3>\n\n<p>O teste de integração verifica a comunicação entre diferentes módulos ou componentes do sistema. Este tipo de teste é crucial para garantir que as partes do sistema funcionam corretamente quando combinadas.</p>\n\n<h4>Características Principais</h4>\n<ol><li><strong>Valida interfaces e interações entre componentes</strong> - Fluxo de dados correto</li>\n<li><strong>Identifica problemas de comunicação</strong> - API mismatches, protocolos</li>\n<li><strong>Pode ser realizado de forma incremental ou big-bang</strong> - Duas abordagens</li>\n<li><strong>Testa camadas de persistência</strong> - Bancos de dados, APIs externas</li>\n</ol>\n<h4>Estratégias de Integração</h4>\n\n<p>##### 1. Big-Bang Integration</p>\n\n<p>Todos os componentes são integrados simultaneamente e testados juntos.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Simples de implementar</li><br><li>Bom para sistemas pequenos</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Difícil localização de erros</li><br><li>Todos os módulos devem estar prontos</li><br></ol><br>##### 2. Incremental Integration (Bottom-Up)</p>\n\n<p>Começa pelos módulos mais baixos e集成 progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Defeitos fáceis de isolar</li><br><li>Feedback contínuo</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode ter módulos de alto nível sem testes até o final</li><br></ol><br>##### 3. Incremental Integration (Top-Down)</p>\n\n<p>Começa pelos módulos de mais alto nível e desce progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Interface do usuário testada primeiro</li><br><li>Protótipo funcional rápido</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Módulos de baixo nível simulados (stubs)</li><br></ol><br><h4>Exemplo de Teste de Integração (REST API)</h4></p>\n\n<pre><code>import requests\nimport pytest\n\n<p>class TestUserAPI:<br>    BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>def test_criar_usuario(self):<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"senha123\"<br>        }<br>        response = requests.post(f\"{self.BASE_URL}/usuarios\", json=payload)</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data</p>\n\n<p>def test_listar_usuarios(self):<br>        response = requests.get(f\"{self.BASE_URL}/usuarios\")</p>\n\n<p>assert response.status_code == 200<br>        assert isinstance(response.json(), list)<br></code></pre></p>\n\n<hr>\n<h3>Teste de Sistema: Visão Holística</h3>\n\n<p>O teste de sistema avalia o software como um todo, verificando se todos os componentes funcionam juntos para atender aos requisitos definidos.</p>\n\n<h4>O Que é Testado no Nível de Sistema?</h4>\n<ol><li><strong>Integração entre todos os módulos</strong></li>\n<li><strong>Fluxos de negócio completos</strong></li>\n<li><strong>Conformidade com requisitos funcionais</strong></li>\n<li><strong>Interface com sistemas externos</strong></li>\n<li><strong>Performance do sistema integrado</strong></li>\n<li><strong>Segurança end-to-end</strong></li>\n</ol>\n<h4>Exemplo: Fluxo de E-commerce</h4>\n\n<pre><code>Usuário → Login → Navegação → Carrinho → Checkout → Pagamento → Confirmação\n    ↓         ↓          ↓           ↓           ↓            ↓            ↓\n Cadastro   Session   Produtos    Estoque     Frete        Stripe     E-mail\n   ↕          ↕         ↕          ↕          ↕            ↕          ↕\n  DB        Redis     DB/API     DB         Correios      API       SMTP\n</code></pre>\n\n<p>Cada seta representa um ponto de integração que deve ser testado no nível de sistema.</p>\n\n<hr>\n<h3>Teste de Aceitação: Validando com o Cliente</h3>\n\n<p>O teste de aceitação determina se um produto ou sistema atende às expectativas e requisitos do cliente. Este é frequentemente o último nível de teste antes da entrega正式.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto certo?\"</strong></p>\n\n<h4>Tipos de Teste de Aceitação</h4>\n\n<p>##### 1. Teste de Aceitação do Usuário (UAT)</p>\n\n<p>Usuários finais testam o sistema em um ambiente semelhante ao de produção.</p>\n\n<p>##### 2. Teste de Aceitação Operacional (OAT)</p>\n\n<p>Equipe de operações validabackup, recuperação, relatórios.</p>\n\n<p>##### 3. Teste de Aceitação Contratual</p>\n\n<p>Verifica se o sistema atende aos critérios contratuais.</p>\n\n<h4>Características do UAT</h4>\n<ol><li>Geralmente envolve cooperação ou feedback do cliente</li>\n<li>Atividade de validação com dados reais</li>\n<li>Foco na usabilidade e fluxo de negócio</li>\n<li>Pode revelar requisitos mal entendidos</li>\n<li>Último checkpoint antes do go-live</li>\n</ol>\n<hr>\n<h3>Teste Funcional: Verificando Funcionalidades</h3>\n\n<p>O teste funcional determina se um recurso ou sistema funciona corretamente sem problemas. Verifica o sistema em diferentes níveis para garantir que todos os cenários são cobertos.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto da forma certa?\"</strong></p>\n\n<h4>Técnicas de Teste Funcional</h4>\n\n<p>##### 1. Teste Baseado em Requisitos<br><ol><li>Cada requisito tem casos de teste correspondentes</li><br><li>Rastreabilidade entre requisitos e testes</li><br><li>Cobertura completa</li><br></ol><br>##### 2. Teste Baseado em Casos de Uso<br><ol><li>Cenários de usuário documentados</li><br><li>Fluxos principais e alternativos</li><br><li>Pré-condições e pós-condições</li><br></ol><br>##### 3. Teste de Tabela de Decisão<br><ol><li>Combinações de condições e ações</li><br><li>Útil para regras de negócio complexas</li><br></ol><br>##### 4. Teste de Transição de Estado<br><ol><li>Mudanças de estado do sistema</li><br><li>Diagramas de estado</li><br></ol><br><hr><br><h2>Testes Não-Funcionais: Avaliando Qualidade Oculta</h2></p>\n\n<h3>Teste de Desempenho: Rapidez e Estabilidade</h3>\n\n<figure><img src=\"https://media.giphy.com/media/l0Iy69RBwNTRF0MXi/giphy.gif\" alt=\"Performance Testing - Testes de Desempenho\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de desempenho avalia a velocidade, responsividade e estabilidade do sistema sob carga de trabalho. É crítico para garantir que a aplicação atende aos SLAs (Service Level Agreements).</p>\n\n<h4>Subtipo 1: Teste de Carga (Load Testing)</h4>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas.</p>\n\n<p><strong>Métricas Coletadas:</strong><ol><li>Tempo de resposta (média, p95, p99)</li><br><li>Throughput (requisições por segundo)</li><br><li>Utilização de recursos (CPU, memória, disco)</li><br><li>Taxa de erros</li><br></ol><br><strong>Ferramentas Populares:</strong><ol><li>JMeter</li><br><li>Gatling</li><br><li>k6</li><br><li>Locust</li><br></ol><br><h4>Subtipo 2: Teste de Estresse (Stress Testing)</h4></p>\n\n<p>Avalia os limites do sistema além da capacidade normal para identificar o ponto de quebra.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar capacidade máxima</li><br><li>Verificar comportamento sob overload</li><br><li>Medir tempo de recuperação</li><br><li>Validar failovers</li><br></ol><br><h4>Subtipo 3: Teste de Resistência (Soak Testing)</h4></p>\n\n<p>Executa o sistema sob carga por períodos prolongados para identificar degradação gradual.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Conexões não fechadas</li><br><li>Acúmulo de logs</li><br><li>Degradação de performance</li><br></ol><br><h4>Subtipo 4: Teste de Pico (Spike Testing)</h4></p>\n\n<p>Avalia reações do sistema a picos súbitos de carga.</p>\n\n<p><strong>Cenário Exemplo:</strong><br><pre><code>Carga normal: 1000 usuários<br>Pico: 5000 usuários em 10 segundos<br>Recovery: Voltar para 1000 usuários<br></code></pre></p>\n\n<h4>Ferramentas de Teste de Desempenho</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>JMeter</strong></td><td>Open Source</td><td>Java</td><td>Enterprise, complexo</td></tr>\n<tr><td><strong>Gatling</strong></td><td>Open Source</td><td>Scala</td><td>DevOps, CI/CD</td></tr>\n<tr><td><strong>k6</strong></td><td>Open Source</td><td>JavaScript</td><td>Moderno, extensível</td></tr>\n<tr><td><strong>Locust</strong></td><td>Open Source</td><td>Python</td><td>Python teams</td></tr>\n<tr><td><strong>LoadRunner</strong></td><td>Comercial</td><td>Various</td><td>Enterprise</td></tr>\n</table></figure>\n\n<h4>Exemplo de Teste de Carga com k6</h4>\n\n<pre><code>// script.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },  // Ramp-up<br>    { duration: \'5m\', target: 100 },  // Steady state<br>    { duration: \'2m\', target: 200 },  // Spike<br>    { duration: \'5m\', target: 200 },  // Steady state<br>    { duration: \'2m\', target: 0 },    // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // Menos de 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/produtos\');<br>  check(res, {<br>    \'status é 200\': (r) =&gt; r.status === 200,<br>    \'tempo  r.timings.duration &lt; 500,<br>  });<br>  sleep(1);<br>}<br></code></pre></p>\n\n<hr>\n<h3>Teste de Segurança: Protegendo Dados e Sistemas</h3>\n\n<figure><img src=\"https://media.giphy.com/media/1qfDU4MJv3jWu34hEx/giphy.gif\" alt=\"Security Testing - Escudo de Segurança\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de segurança identifica vulnerabilidades e garante proteção de dados. Em um mundo cada vez mais digital, a segurança é prioridade.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n\n<p>##### 1. Teste de Penetração (Pen Test)</p>\n\n<p>Simula ataques para identificar vulnerabilidades antes que hackers maliciosos o façam.</p>\n\n<p><strong>Metodologias:</strong><ol><li>OWASP Testing Guide</li><br><li>PTES (Penetration Testing Execution Standard)</li><br><li>NIST SP 800-115</li><br></ol><br><strong>Tipos de Pentest:</strong><ol><li><strong>Black Box:</strong> Sem conhecimento prévio</li><br><li><strong>White Box:</strong> Código e documentação</li><br><li><strong>Gray Box:</strong> Conhecimento parcial</li><br></ol><br>##### 2. Varredura de Vulnerabilidade</p>\n\n<p>Identifica pontos fracos conhecidos através de scanning automatizado.</p>\n\n<p><strong>Ferramentas:</strong><ol><li>Nessus</li><br><li>OpenVAS</li><br><li>Qualys</li><br><li>Nexpose</li><br></ol><br>##### 3. Teste de Firewall e WAF</p>\n\n<p>Verifica configurações de segurança de firewalls e Web Application Firewalls.</p>\n\n<p><strong>O que testar:</strong><ol><li>Regras de firewall</li><br><li>Block de IPs maliciosos</li><br><li>Detecção de SQL Injection</li><br><li>Proteção XSS</li><br></ol><br>##### 4. Análise de Código Estático (SAST)</p>\n\n<p>Detecta vulnerabilidades no código-fonte sem executá-lo.</p>\n\n<p><strong>Ferramentas SAST:</strong><ol><li>SonarQube</li><br><li>Checkmarx</li><br><li>Fortify</li><br><li>Snyk Code</li><br></ol><br>##### 5. Análise de Componentes (SCA)</p>\n\n<p>Identifica vulnerabilidades em bibliotecas e dependências.</p>\n\n<p><strong>Ferramentas SCA:</strong><ol><li>Snyk</li><br><li>OWASP Dependency-Check</li><br><li>WhiteSource</li><br><li>Dependabot</li><br></ol><br><h4>OWASP Top 10: Vulnerabilidades Mais Comuns</h4><br><ol><li><strong>A01 - Broken Access Control</strong></li><br><li><strong>A02 - Cryptographic Failures</strong></li><br><li><strong>A03 - Injection</strong></li><br><li><strong>A04 - Insecure Design</strong></li><br><li><strong>A05 - Security Misconfiguration</strong></li><br><li><strong>A06 - Vulnerable Components</strong></li><br><li><strong>A07 - Authentication Failures</strong></li><br><li><strong>A08 - Software and Data Integrity Failures</strong></li><br><li><strong>A09 - Security Logging Failures</strong></li><br><li><strong>A10 - SSRF (Server-Side Request Forgery)</strong></li><br></ol><br><hr><br><h3>Teste de Usabilidade: Experiência do Usuário</h3></p>\n\n<p>Avalia a facilidade de uso e a experiência do usuário com o sistema. O teste de usabilidade é essencial para garantir que os usuários consigam realizar suas tarefas de forma eficiente.</p>\n\n<h4>Critérios de Usabilidade</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Critério</th><th>Definição</th><th>Métrica</th></tr>\n<tr><td><strong>Eficácia</strong></td><td>Usuário consegue completar tarefa?</td><td>Taxa de sucesso</td></tr>\n<tr><td><strong>Eficiência</strong></td><td>Quanto tempo leva?</td><td>Tempo de tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Usuário gostou?</td><td>Questionários SUS</td></tr>\n<tr><td><strong>Aprendizagem</strong></td><td>Quanto tempo para aprender?</td><td>Tempo até proficiência</td></tr>\n<tr><td><strong>Memorização</strong></td><td>Lembra como usar?</td><td>Retenção após pausa</td></tr>\n</table></figure>\n\n<h4>Métodos de Teste de Usabilidade</h4>\n<ol><li><strong>Testes com Usuários</strong> - Sessões gravadas com participantes</li>\n<li><strong>Análise Heurística</strong> - Avaliação por especialistas</li>\n<li><strong>Questionários</strong> - SUS, SEQ, NPS</li>\n<li><strong>Eye Tracking</strong> - Rastreamento ocular</li>\n<li><strong>Análise de Tarefas</strong> - Tempos e erros</li>\n</ol>\n<h4>Frameworks de Avaliação</h4>\n<ol><li><strong>Nielsen\'s Heurísticas</strong> (10 princípios)</li>\n<li><strong>ISO 9241-11</strong> (Usabilidade)</li>\n<li><strong>WCAG 2.1</strong> (Acessibilidade)</li>\n</ol>\n<hr>\n<h3>Teste de Compatibilidade: Funciona em Todo Lugar?</h3>\n\n<p>Verifica se o software funciona em diferentes ambientes, navegadores e dispositivos.</p>\n\n<h4>Tipos de Teste de Compatibilidade</h4>\n\n<p>##### 1. Teste de Navegador (Cross-Browser)<br><ol><li>Chrome, Firefox, Safari, Edge</li><br><li>Diferentes versões</li><br><li>Modos de compatibilidade</li><br></ol><br>##### 2. Teste Mobile<br><ol><li>iOS (iPhone, iPad)</li><br><li>Android (diferentes fabricantes)</li><br><li>Diferentes tamanhos de tela</li><br><li>Diferentes versões de OS</li><br></ol><br>##### 3. Teste de Sistema Operacional<br><ol><li>Windows 10, 11</li><br><li>macOS (versões diferentes)</li><br><li>Linux (distribuições populares)</li><br></ol><br>##### 4. Teste de Hardware<br><ol><li>Diferentes processadores</li><br><li>Diferentes quantidades de RAM</li><br><li>Diferentes resoluções de tela</li><br></ol><br><h4>Ferramentas de Teste Cross-Browser</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Cobertura</th><th>Preço</th></tr>\n<tr><td>BrowserStack</td><td>3000+ dispositivos</td><td>$29+/mês</td></tr>\n<tr><td>Sauce Labs</td><td>1000+ dispositivos</td><td>$39+/mês</td></tr>\n<tr><td>LambdaTest</td><td>3000+ dispositivos</td><td>$15+/mês</td></tr>\n<tr><td>CrossBrowserTesting</td><td>1500+ dispositivos</td><td>$29+/mês</td></tr>\n</table></figure>\n\n<hr>\n<h3>Teste de Recuperação: Resistência a Falhas</h3>\n\n<p>Avalia a capacidade do sistema de se recuperar de falhas e disasters. É crucial para sistemas críticos que não podem ficar fora do ar.</p>\n\n<h4>Cenários de Teste</h4>\n<ol><li><strong>Falha de Hardware</strong></li>\n</ol>   - Perda de disco\n   - Falha de memória\n   - Queda de servidor\n<ol><li><strong>Falha de Software</strong></li>\n</ol>   - Crash de aplicação\n   - Deadlock\n   - Exceções não tratadas\n<ol><li><strong>Falha de Rede</strong></li>\n</ol>   - Perda de conectividade\n   - Alta latência\n   - Timeout\n<ol><li><strong>Desastres</strong></li>\n</ol>   - Perda de datacenter\n   - Corrupção de dados\n   - Ataques DDoS\n\n<h4>Métricas de Recuperação</h4>\n<ol><li><strong>RTO (Recovery Time Objective):</strong> Tempo máximo para recuperação</li>\n<li><strong>RPO (Recovery Point Objective):</strong> Perda máxima de dados aceitável</li>\n<li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li>\n<li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li>\n</ol>\n<hr>\n<h2>Testes de Regressão: Mantendo a Qualidade</h2>\n\n<p>Executados sempre que o código é modificado para garantir que alterações não introduzam novos defeitos. Este é um dos tipos de teste mais importantes e frequentemente executados.</p>\n\n<h3>Quando Executar Testes de Regressão</h3>\n\n<p>✅ Após cada release de software  <br>✅ Após correção de bugs  <br>✅ Após atualizações de dependências  <br>✅ Após refactoring de código  <br>✅ Antes do deploy de produção</p>\n\n<h3>Estratégias de Testes de Regressão</h3>\n\n<h4>1. Regressão Completa</h4>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura total</li><br><li>Alta confiança</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Tempo longo</li><br><li>Custo elevado</li><br></ol><br><h4>2. Regressão Seletiva</h4></p>\n\n<p>Seleciona testes relevantes baseados em mudanças.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Mais rápido</li><br><li>Mais econômico</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode perder cobertura</li><br></ol><br><h4>3. Regressão Prioritária</h4></p>\n\n<p>Executa testes por prioridade (críticos &gt; altos &gt; médios &gt; baixos).</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura do crítico rápido</li><br><li>Decisões baseadas em risco</li><br></ol><br><h3>Automação de Testes de Regressão</h3></p>\n\n<p>A automação é essencial para testes de regressão eficazes:</p>\n\n<p><strong>Benefícios:</strong><ol><li>Execução frequente</li><br><li>Resultados consistentes</li><br><li>Rapidez</li><br><li>Cobertura ampla</li><br></ol><br><strong>Ferramentas Recomendadas:</strong><ol><li>Selenium WebDriver</li><br><li>Playwright</li><br><li>Cypress</li><br><li>Appium (mobile)</li><br><li>RestAssured (API)</li><br></ol><br><hr><br><h2>Pirâmide de Testes: Arquitetura Ideal</h2></p>\n\n<p>A pirâmide de testes é um conceito fundamental que guia a distribuição dos tipos de teste:</p>\n\n<pre><code>                    /\n                   /  \n                  / E2E        ← Poucos testes E2E (lentos, caros)\n                 /      \n                /Integração   ← Alguns testes de integração\n               /            \n              /  Unitários     ← Muitos testes unitários (rápidos, baratos)\n             /________________\n</code></pre>\n\n<h3>Proporções Ideais</h3>\n<ol><li><strong>Unitários:</strong> 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>Integração:</strong> 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>E2E:</strong> 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Compreender os diferentes tipos de testes de software é fundamental para construir uma estratégia de QA eficaz. Cada tipo de teste tem seu propósito específico e deve ser aplicado no momento adequado do ciclo de desenvolvimento.</p>\n\n<p><strong>Resumo dos Tipos de Testes:</strong></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Categoria</th><th>Tipo</th><th>Quando Usar</th><th>Objetivo</th></tr>\n<tr><td><strong>Funcional</strong></td><td>Unitário</td><td>Desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Integração</td><td>Pós-unitário</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Sistema</td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Aceitação</td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Performance</td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Segurança</td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Usabilidade</td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n</table></figure>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem todo projeto precisa de todos os tipos</li><br><li><strong>Priorize</strong> - Comece com unitários e integração</li><br><li><strong>Automatize</strong> - Regressão deve ser automática</li><br><li><strong>Meça</strong> - Cobertura, tempo, defeitos encontrados</li><br><li><strong>Melhore</strong> - Itere constantemente</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre Tipos de Testes</h3></p>\n\n<p><strong>P: Quantos tipos de testes existem?</strong>  <br>R: Existem dozens de tipos de testes classificados de diferentes formas. Os principais são funcionais e não-funcionais, cada um com subtipos específicos.</p>\n\n<p><strong>P: Qual a diferença entre teste de sistema e teste de aceitação?</strong>  <br>R: Teste de sistema verifica se o sistema atende aos requisitos técnicos. Teste de aceitação verifica se o sistema atende às expectativas do usuário/cliente.</p>\n\n<p><strong>P: Testes manuais podem ser substituídos por automatizados?</strong>  <br>R: Não completamente. Testes manuais são essenciais para exploratory testing, UX e cenários complexos. A automação complementa, não substitui.</p>\n\n<p><strong>P: Quando devo começar a testar?</strong>  <br>R: O mais cedo possível! O conceito de Shift-Left recomenda testes desde as primeiras fases do desenvolvimento.</p>\n\n<p><strong>P: Qual a ordem ideal de execução dos testes?</strong>  <br>R: Unitários → Integração → Sistema → Aceitação. Cada nível depende do anterior.</p>\n\n<hr>\n<em>Fonte: Selenium.dev, Atlassian, Vericode, ISTQB, OWASP</em>', 'Tipos de Testes de Software: Guia Completo com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '179-revision-v1', '', '', '2026-07-06 23:05:52', '2026-07-07 02:05:52', '', '179', 'http://localhost:8082/ideiasti/?p=475', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('476', '0', '2026-07-06 23:05:55', '2026-07-07 02:05:55', '', 'giphy-13', '', 'inherit', 'open', 'closed', '', 'giphy-13', '', '', '2026-07-06 23:05:55', '2026-07-07 02:05:55', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-13.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('477', '0', '2026-07-06 23:05:56', '2026-07-07 02:05:56', '<p><strong>Meta Description:</strong> Descubra como a Inteligência Artificial está revolucionando a QA: automação inteligente, geração de testes, detecção de anomalias e manutenção preditiva. Guia completo para profissionais.</p>\n\n<hr>\n<h2>Estado Atual da IA em QA</h2>\n\n<p>O <strong>World Quality Report 2025</strong> revela dados impressionantes: quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão ativamente buscando GenAI</strong> em práticas de Quality Engineering (QE), mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} alcançaram implementação em escala empresarial.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-13.gif\" alt=\"AI Brain - Inteligência Artificial em QA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Esta lacuna entre interesse e implementação representa uma oportunidade significativa para profissionais e organizações que souberem aproveitar efetivamente essas tecnologias.</p>\n\n<hr>\n<h2>Por Que a Adoção de IA em QA Está Crescendo?</h2>\n\n<h3>Drivers de Adoção</h3>\n<ol><li><strong>Volume de testes crescente</strong> - Sistemas mais complexos exigem mais testes</li>\n<li><strong>Pressure de velocidade</strong> - CI/CD demanda execuções mais rápidas</li>\n<li><strong>Escassez de profissionais</strong> - Demanda supera oferta de testadores</li>\n<li><strong>Qualidade em produção</strong> - Necessidade de monitoramento contínuo</li>\n<li><strong>Custos crescentes</strong> - Automação inteligente reduz despesas</li>\n</ol>\n<h3>Benefícios Comprovados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Impacto da IA</th></tr>\n<tr><td>Redução de tempo de teste</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de custos de QA</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Melhoria em cobertura</td><td>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Detecção precoce de bugs</td><td>3-5x mais cedo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Desafios de Adoção de IA em QA</h2>\n\n<h3>1. Desalinhamento Estratégico</h3>\n\n<p>Existe um hiato crescente entre o interesse organizacional em GenAI e a prontidão real para adoção efetiva dentro de QE. O caminho da experimentação para implementação é mais complexo do que o antecipado.</p>\n\n<h4>Sinais de Desalinhamento</h4>\n\n<ul><li>GenAI vista como \"solução mágica\" sem estratégia clara</li><ol><li>Falta de alinhamento entre TI e negócios</li>\n<li>Expectativas irreais sobre capacidades</li>\n<li>Subestimação de esforço de integração</li>\n</ol>\n<h3>2. Complexidade de Implementação</h3>\n\n<p>A implementação de IA em QA requer alinhamento entre inovação operacional e oversight estratégico. Desafios incluem:</p>\n\n<h4>Desafios Técnicos</h4>\n<ol><li>Integração com sistemas legados</li>\n<li>Qualidade dos dados de treinamento</li>\n<li>Escolha de modelos adequados</li>\n<li>Manutenção de modelos em produção</li>\n</ol>\n<h4>Desafios Organizacionais</h4>\n<ol><li>Resistência cultural</li>\n<li>Falta de competências</li>\n<li>Processos não adaptados</li>\n<li>Governança de IA</li>\n</ol>\n<h3>3. Questões Éticas e de Governança</h3>\n<ol><li>Viés em modelos de IA</li>\n<li>Transparência nas decisões</li>\n<li>Responsabilidade por falhas</li>\n<li>Conformidade regulatória</li>\n</ol>\n<hr>\n<h2>Aplicações de IA em QA: Casos de Uso Detalhados</h2>\n\n<h3>1. Geração Automatizada de Testes</h3>\n\n<p>IA pode gerar casos de teste automaticamente baseados em requisitos e código. Esta é uma das aplicações mais promissoras.</p>\n\n<figure><img src=\"https://media.giphy.com/media/VbZ0cWw6cVPMM/giphy.gif\" alt=\"Automação de Testes com IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Requisitos → Análise de NLP → Cenários de Teste → Casos de Teste\n    ↓                                                        ↓\n Código → Análise Estática → Cobertura → Testes Sugeridos\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de unit tests</td><td>Diffblue</td></tr>\n<tr><td><strong>Testim</strong></td><td>Testes E2E com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>Automação sem código com IA</td><td>Avo Automation</td></tr>\n</table></figure>\n\n<h4>Exemplo: Geração de Testes com GenAI</h4>\n\n<pre><code># Exemplo conceitual de como IA pode gerar testes\nimport openai\n\n<p>def gerar_testes_para_requisito(requisito):<br>    prompt = f\"\"\"<br>    Gere casos de teste para o seguinte requisito:</p>\n\n<p>Requisito: {requisito}</p>\n\n<p>Formato de saída (JSON):<br>    {{<br>        \"casos_de_teste\": [<br>            {{<br>                \"id\": \"CT-001\",<br>                \"titulo\": \"...\",<br>                \"pre_condicoes\": [...],<br>                \"passos\": [...],<br>                \"dados_teste\": {{...}},<br>                \"resultado_esperado\": \"...\"<br>            }}<br>        ]<br>    }}<br>    \"\"\"</p>\n\n<p>response = openai.chat.completions.create(<br>        model=\"gpt-4\",<br>        messages=[{\"role\": \"user\", \"content\": prompt}]<br>    )</p>\n\n<p>return json.loads(response.choices[0].message.content)<br></code></pre></p>\n\n<h3>2. Detecção de Anomalias</h3>\n\n<p>Algoritmos de machine learning identificam padrões incomuns que indicam defeitos, revolucionando o monitoramento de qualidade.</p>\n\n<h4>Técnicas Utilizadas</h4>\n\n<p>##### Análise de Séries Temporais<br><ol><li>Identificação de anomalias em métricas de performance</li><br><li>Detecção de degradação gradual</li><br><li>Alertas proativos sobre problemas</li><br></ol><br>##### Clustering<br><ol><li>Agrupamento de testes similares</li><br><li>Identificação de testes atípicos</li><br><li>Detecção de padrões de falha</li><br></ol><br>##### Redes Neurais<br><ol><li>Detecção de padrões complexos</li><br><li>Aprendizado de comportamentos normais</li><br><li>Previsão de falhas</li><br></ol><br><h4>Ferramentas de Detecção de Anomalias</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Aplicação</th></tr>\n<tr><td><strong>Elastic APM</strong></td><td>APM</td><td>Detecção de anomalias em produção</td></tr>\n<tr><td><strong>Datadog</strong></td><td>Monitoring</td><td>ML para métricas</td></tr>\n<tr><td><strong>New Relic</strong></td><td>APM</td><td>Detecção inteligente</td></tr>\n<tr><td><strong>Grafana + Loki</strong></td><td>Logging</td><td>Análise de logs com ML</td></tr>\n</table></figure>\n\n<h3>3. Manutenção Inteligente de Testes</h3>\n\n<p>IA ajuda a identificar e remover testes obsoletos ou flaky, mantendo a suite de testes saudável.</p>\n\n<h4>Problemas que a IA Resolve</h4>\n\n<p><strong>Testes Flaky (Instáveis)</strong><br><ol><li>Identificação de padrões que causam instabilidade</li><br><li>Predição de quais testes podem falhar</li><br><li>Sugestões de correções</li><br><li>Quarentena automática</li><br></ol><br><strong>Testes Obsoletos</strong><br><ol><li>Detecção de funcionalidades removidas</li><br><li>Identificação de código não coberto</li><br><li>Sugestões de remoção segura</li><br></ol><br><h4>Exemplo de Detecção de Testes Flaky</h4></p>\n\n<pre><code># Sistema simplificado de detecção de testes flaky\nclass FlakyTestDetector:\n    def __init__(self):\n        self.test_history = {}\n        self.ml_model = load_trained_model()\n\n<p>def analyze_test(self, test_name, execution_history):<br>        features = self.extract_features(execution_history)<br>        flaky_probability = self.ml_model.predict_proba([features])[0]</p>\n\n<p>if flaky_probability &gt; 0.7:<br>            return {<br>                \"test\": test_name,<br>                \"flaky_probability\": flaky_probability,<br>                \"recommendation\": \"QUARANTINE\",<br>                \"reasons\": self.explain_prediction(features)<br>            }<br>        return {\"test\": test_name, \"flaky_probability\": flaky_probability}</p>\n\n<p>def extract_features(self, history):<br>        return [<br>            history.success_rate,<br>            history.avg_duration,<br>            history.recent_failures,<br>            history.environment_changes,<br>            history.dependency_changes<br>        ]<br></code></pre></p>\n\n<h3>4. Análise de Código Estático com IA</h3>\n\n<p>Identifica potenciais problemas de qualidade antes da execução, usando análise semântica avançada.</p>\n\n<h4>Capacidades Avançadas</h4>\n<ol><li><strong>Detecção de vulnerabilidades</strong> - OWASP Top 10</li>\n<li><strong>Análise de dependências</strong> - Bibliotecas desatualizadas</li>\n<li><strong>Code smells</strong> - Padrões problemáticos</li>\n<li><strong>Débito técnico</strong> - Métricas de qualidade</li>\n</ol>\n<h4>Ferramentas com IA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Capacidades IA</th><th>Integração</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Débito técnico, code smells</td><td>CI/CD</td></tr>\n<tr><td><strong>Snyk</strong></td><td>Vulnerabilidades, licenças</td><td>IDE, CI</td></tr>\n<tr><td><strong>CodeClimate</strong></td><td>Quality, maintainability</td><td>GitHub</td></tr>\n<tr><td><strong>DeepSource</strong></td><td>Análise estática com ML</td><td>Git</td></tr>\n</table></figure>\n\n<h3>5. Testes Visuais Automatizados</h3>\n\n<p>Comparação de interfaces visuais usando visão computacional para detectar regressões.</p>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Página Capturada → Modelo de Visão Computacional → Comparação com Baseline\n     ↓                          ↓                                    ↓\n  Screenshots           Detecção de Elementos           Diff Visual\n                                            ↓\n                                    Alertas de Regressão\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tecnologia</th><th>Diferencial</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Visual AI</td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de precisão</td></tr>\n<tr><td><strong> Percy</strong></td><td>Visual testing</td><td>Integração simples</td></tr>\n<tr><td><strong>Chromatic</strong></td><td>Visual regression</td><td>Para Storybook</td></tr>\n<tr><td><strong>Lost Pixel</strong></td><td>Open source</td><td>Self-hosted</td></tr>\n</table></figure>\n\n<h3>6. Oráculos de Teste Baseados em IA</h3>\n\n<p>Validação de resultados usando modelos treinados para determinar se o comportamento está correto.</p>\n\n<h4>Tipos de Oráculos</h4>\n<ol><li><strong>Oráculo de Imagem</strong> - Validação visual de UI</li>\n<li><strong>Oráculo de Texto</strong> - Análise de conteúdo</li>\n<li><strong>Oráculo de Comportamento</strong> - Detecção de anomalias</li>\n<li><strong>Oráculo de Dados</strong> - Validação de datasets</li>\n</ol>\n<hr>\n<h2>Ferramentas de IA para QA: Comparativo</h2>\n\n<h3>Plataformas Completas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Testim</strong></td><td>Automação inteligente E2E</td><td>$600+/mês</td><td>Equipes enterprise</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Automação com ML</td><td>Sob consulta</td><td>Escala enterprise</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>$500+/mês</td><td>CI/CD integrado</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>No-code com IA</td><td>Sob consulta</td><td>Enterprise</td></tr>\n<tr><td><strong>Perfecto</strong></td><td>Testes mobile/web com IA</td><td>Sob consulta</td><td>Mobile testing</td></tr>\n</table></figure>\n\n<h3>Ferramentas Especializadas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais</td><td>$100+/mês</td><td>UI testing</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Unit tests</td><td>$299/assinante</td><td>Dev teams</td></tr>\n<tr><td><strong>Snyk</strong></td><td>SCA</td><td>Grátis + Pro</td><td>Developers</td></tr>\n<tr><td><strong>SonarCloud</strong></td><td>SAST</td><td>Grátis + Pro</td><td>CI/CD</td></tr>\n</table></figure>\n\n<h3>Ferramentas Emerging (2025-2026)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Status</th></tr>\n<tr><td><strong>CodiumAI</strong></td><td>Testes gerados automaticamente</td><td>Beta</td></tr>\n<tr><td><strong>Mutable AI</strong></td><td>Code review + tests</td><td>Beta</td></tr>\n<tr><td><strong>Dagger</strong></td><td>CI/CD programável</td><td>GA</td></tr>\n<tr><td><strong>Trunk</strong></td><td>Linting inteligente</td><td>GA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando IA em QA: Roadmap Prático</h2>\n\n<h3>Fase 1: Avaliação e Planejamento (1-2 meses)</h3>\n\n<h4>Checklist de Avaliação</h4>\n<ol><li>[ ] Mapeamento de processos atuais de QA</li>\n<li>[ ] Identificação de pontos de dor</li>\n<li>[ ] Análise de ROI potencial</li>\n<li>[ ] Avaliação de maturidade tecnológica</li>\n<li>[ ] Levantamento de stakeholders</li>\n</ol>\n<h4>Métricas de Baseline</h4>\n\n<p>Antes de implementar, estabeleça métricas de referência:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Ferramenta</th></tr>\n<tr><td>Tempo de teste</td><td>Duração de suite</td><td>CI/CD logs</td></tr>\n<tr><td>Cobertura de teste</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>Coverage tools</td></tr>\n<tr><td>Taxa de defeitos</td><td>Bugs em produção</td><td>Bug tracker</td></tr>\n<tr><td>Testes flaky</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas instáveis</td><td>CI/CD</td></tr>\n<tr><td>Custo de QA</td><td>$/teste executado</td><td>Financeiro</td></tr>\n</table></figure>\n\n<h3>Fase 2: Pilot (2-3 meses)</h3>\n\n<h4>Escolha do Piloto</h4>\n\n<p>Selecione um projeto ou área com:<br><ol><li>✅ Escopo controlado</li><br><li>✅ Equipe aberta a inovação</li><br><li>✅ Processos definidos</li><br><li>✅ Métricas disponíveis</li><br></ol><br><h4>Pilotos Recomendados</h4><br><ol><li><strong>Geração de unit tests</strong> - Diffblue, CodiumAI</li><br><li><strong>Testes visuais</strong> - Applitools</li><br><li><strong>Detecção de flaky tests</strong> - Ferramentas de CI</li><br><li><strong>Análise estática</strong> - SonarQube, Snyk</li><br></ol><br><h3>Fase 3: Expansão (3-6 meses)</h3></p>\n\n<h4>Escalar Sucesso</h4>\n<ol><li>Documente aprendizados</li>\n<li>Treine outras equipes</li>\n<li>Padronize processos</li>\n<li>Melhore integrações</li>\n</ol>\n<h4>KPIs de Sucesso</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Meta (6 meses)</th></tr>\n<tr><td>Redução de tempo de teste</td><td>30-40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Aumento de cobertura</td><td>20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de defeitos em prod</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>ROI positivo</td><td>Sim</td></tr>\n</table></figure>\n\n<h3>Fase 4: Maturidade (6-12 meses)</h3>\n\n<h4>Implementação Enterprise</h4>\n<ol><li>Integração completa com CI/CD</li>\n<li>IA em produção (monitoramento)</li>\n<li>Maintenance automatizado</li>\n<li>Reporting avançado</li>\n</ol>\n<hr>\n<h2>Futuro da IA em QA: Tendências 2026-2028</h2>\n\n<h3>1. Testes Autônomos</h3>\n\n<p>Sistemas que automaticamente:<br><ol><li>Geram testes baseados em requisitos</li><br><li>Executam testes continuamente</li><br><li>Detectam e reportam falhas</li><br><li>Propõem correções</li><br></ol><br><h3>2. Manutenção Preditiva</h3></p>\n\n<p>IA que prevê:<br><ol><li>Quando testes vão falhar</li><br><li>Quando código precisa de mais testes</li><br><li>Quando componentes estão em risco</li><br><li>Quando fazer refactoring</li><br></ol><br><h3>3. GenAI Nativa em QA</h3></p>\n\n<p>Modelos treinados especificamente para:<br><ol><li>Entender código e testes</li><br><li>Gerar código de teste</li><br><li>Analisar requisitos</li><br><li>Documentar testes</li><br></ol><br><h3>4. Testes em Produção com IA</h3></p>\n\n<p>Monitoramento inteligente:<br><ol><li>Detecção de anomalias em produção</li><br><li>Geração automática de testes de regressão</li><br><li>Validação de deployments</li><br><li>Root cause analysis</li><br></ol><br><hr><br><h2>Considerações Éticas e Best Practices</h2></p>\n\n<h3>Governança de IA em QA</h3>\n\n<h4>Princípios</h4>\n<ol><li><strong>Transparência</strong> - Documente como a IA toma decisões</li>\n<li><strong>Responsabilidade</strong> - Humanos mantêm responsabilidade final</li>\n<li><strong>Fairness</strong> - Evite viés em modelos</li>\n<li><strong>Privacidade</strong> - Proteja dados sensíveis</li>\n<li><strong>Segurança</strong> - Proteja modelos contra ataques</li>\n</ol>\n<h4>Checklist de Governança</h4>\n<ol><li>[ ] Política de uso de IA em QA documentada</li>\n<li>[ ] Processos de revisão de decisões de IA</li>\n<li>[ ] Documentação de modelos utilizados</li>\n<li>[ ] Plano de contingência para falhas de IA</li>\n<li>[ ] Treinamento de equipe em uso responsável</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A IA está transformando fundamentalmente a QA, oferecendo oportunidades sem precedentes para aumentar eficiência, cobertura e qualidade. Embora a adoção em escala ainda seja um desafio, organizações que investem estrategicamente em IA para QA estão obtendo vantagens competitivas significativas.</p>\n\n<p><strong>Resumo dos Principais Aprendizados:</strong></p>\n\n<p>✅ IA pode reduzir tempo de teste em 40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}  <br>✅ GenAI está sendo buscada por 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações, mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram em escala  <br>✅ Ferramentas como Playwright, Applitools e Testim estão liderando a adoção  <br>✅ Implementação requer estratégia, não apenas ferramentas  <br>✅ Futuro aponta para testes autônomos e manutenção preditiva</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem toda organização precisa de todas as capacidades</li><br><li><strong>Comece pequeno</strong> - Pilotos controlados são mais eficazes</li><br><li><strong>Meça resultados</strong> - Métricas são essenciais</li><br><li><strong>Treine sua equipe</strong> - Competências em IA são necessárias</li><br><li><strong>Governarize</strong> - Adote práticas éticas desde o início</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre IA em QA</h3></p>\n\n<p><strong>P: A IA vai substituir testadores humanos?</strong>  <br>R: Não. A IA complementa o trabalho humano, permitindo que testadores foquem em atividades estratégicas, exploratory testing e design de testes.</p>\n\n<p><strong>P: Qual é o ROI da implementação de IA em QA?</strong>  <br>R: O ROI típico é de 200-500{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em 12-18 meses, considerando redução de tempo de teste, aumento de cobertura e redução de defeitos em produção.</p>\n\n<p><strong>P: Preciso de especialistas em dados para implementar IA em QA?</strong>  <br>R: Não necessariamente. Muitas ferramentas são \"plug-and-play\" e não requerem conhecimento de ML. No entanto, para implementações avançadas, especialistas são úteis.</p>\n\n<p><strong>P: Quais são os principais riscos do uso de IA em QA?</strong>  <br>R: Os principais riscos incluem: dependência excessiva, viés em modelos, falta de transparência e custos inesperados de manutenção.</p>\n\n<p><strong>P: Quando devo começar a usar IA em QA?</strong>  <br>R: Se você tem mais de 100 testes automatizados ou gastando mais de 20 horas/semana em QA, é um bom momento para avaliar ferramentas de IA.</p>\n\n<hr>\n<em>Fonte: World Quality Report 2025, Software Testing Magazine, Gartner Research, IEEE Software</em>', 'Inteligência Artificial em Quality Assurance: Guia Completo para 2025-2026', '', 'inherit', 'closed', 'closed', '', '181-revision-v1', '', '', '2026-07-06 23:05:56', '2026-07-07 02:05:56', '', '181', 'http://localhost:8082/ideiasti/?p=477', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('479', '0', '2026-07-06 23:11:19', '2026-07-07 02:11:19', '<h2>Quem Somos</h2>\n\n<p>O <strong>Blog Ideiasti</strong> é uma plataforma educacional dedicada ao universo da Qualidade de Software e Testes de Software. Nascemos com o propósito de democratizar o conhecimento sobre QA, tornando acessível a profissionais, estudantes e empresas as melhores práticas e tendências do mercado.</p>\n\n<p>Nossa missão é <strong>transformar a forma como pensamos e praticamos a qualidade de software</strong>, contribuindo para a formação de profissionais mais capacitados e organizações mais competitivas.</p>\n\n<hr>\n<h2>Nossa História</h2>\n\n<h3>O Início</h3>\n\n<p>O Blog Ideiasti surgiu da necessidade de centralizar conteúdo de qualidade sobre Quality Assurance em português. Enquanto existiam diversos recursos em inglês, a comunidade brasileira carecia de uma fonte confiável e atualizada.</p>\n\n<h3>Nossa Evolução</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ano</th><th>Marco</th></tr>\n<tr><td><strong>2024</strong></td><td>Fundação do Blog Ideiasti</td></tr>\n<tr><td><strong>2024</strong></td><td>Primeiros 10 artigos publicados</td></tr>\n<tr><td><strong>2025</strong></td><td>Expansão para 40+ artigos especializados</td></tr>\n<tr><td><strong>2026</strong></td><td>Conteúdo contínuo e comunidade ativa</td></tr>\n</table></figure>\n\n<h3>Nossa Visão</h3>\n\n<p>Ser a <strong>principal referência em Qualidade de Software em português</strong>, abrangendo desde conceitos fundamentais até técnicas avançadas e emergentes.</p>\n\n<hr>\n<h2>O Que Oferecemos</h2>\n\n<h3>Conteúdo Especializado</h3>\n\n<p>Produzimos conteúdo educacional em diversas áreas:</p>\n\n<ul><li><strong>Fundamentos de QA</strong> — Conceitos, metodologias e padrões</li><ol><li><strong>Automação de Testes</strong> — Frameworks, ferramentas e estratégias</li>\n<li><strong>Testes Ágeis</strong> — Scrum, Kanban, XP e práticas DevOps</li>\n<li><strong>Testes de Performance</strong> — Load, stress e endurance testing</li>\n<li><strong>Testes de Segurança</strong> — OWASP, penetration testing</li>\n<li><strong>Tendências</strong> — IA, GenAI, continuous testing</li>\n</ol>\n<h3>Nossos Diferenciais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Diferencial</th><th>Descrição</th></tr>\n<tr><td><strong>Profundo</strong></td><td>Artigos técnicos detalhados e atualizados</td></tr>\n<tr><td><strong>Prático</strong></td><td>Exemplos reais e casos de uso</td></tr>\n<tr><td><strong>Atualizado</strong></td><td>Conteúdo alinhado com as tendências do mercado</td></tr>\n<tr><td><strong>Gratuito</strong></td><td>Todo conteúdo acessível sem custo</td></tr>\n<tr><td><strong>Em Português</strong></td><td>Linguagem nativa para brasileiros</td></tr>\n</table></figure>\n\n<hr>\n<h2>Metodologia de Conteúdo</h2>\n\n<h3>Como Criamos Artigos</h3>\n\n<p>Nosso processo editorial:<br><ol><li><strong>Pesquisa</strong> — Fontes confiáveis e atualizadas</li><br><li><strong>Estruturação</strong> — Organização lógica e didática</li><br><li><strong>Revisão</strong> — Verificação técnica e editorial</li><br><li><strong>Publicação</strong> — Formatação otimizada para SEO</li><br><li><strong>Atualização</strong> — Manutenção contínua do conteúdo</li><br></ol><br><h3>Nossas Fontes</h3></p>\n\n<p>Baseamos nosso conteúdo em:<br><ol><li><strong>Padrões Internacionais</strong> — ISO/IEC 25010, IEEE</li><br><li><strong>Frameworks Reconhecidos</strong> — ISTQB, CMMI</li><br><li><strong>Pesquisas de Mercado</strong> — Gartner, Forrester, World Quality Report</li><br><li><strong>Comunidade Técnica</strong> — Especialistas e profissionais do mercado</li><br><li><strong>Experiência Prática</strong> — Casos reais e melhores práticas</li><br></ol><br><hr><br><h2>Para Quem É o Blog</h2></p>\n\n<h3>Profissionais de TI</h3>\n\n<p>Se você é <strong>desenvolvedor, QA engineer, test analyst ou manager</strong>, encontrará:<br><ol><li>Estratégias avançadas de teste</li><br><li>Comparativos de ferramentas</li><br><li>Boas práticas de mercado</li><br><li>Preparação para certificações</li><br></ol><br><h3>Estudantes</h3></p>\n\n<p>Se você está <strong>aprendendo sobre QA</strong>, encontrará:<br><ol><li>Conceitos fundamentais explicados</li><br><li>Tutoriais passo a passo</li><br><li>Glossários e referências</li><br><li>Caminho de aprendizagem</li><br></ol><br><h3>Empresas</h3></p>\n\n<p>Se você representa uma <strong>empresa ou startup</strong>, encontrará:<br><ol><li>Cases de sucesso</li><br><li>ROI de qualidade de software</li><br><li>Estratégias de implementação</li><br><li>Métricas e KPIs</li></ol></ul></p>\n\n<hr>\n<h2>Entre em Contato</h2>\n\n<p>Estamos sempre abertos para ouvir você:</p>\n\n<p><strong>Blog Ideiasti</strong><br>E-mail: contato@ideiasti.com<br>Website: www.ideiasti.com</p>\n\n<hr>\n<h2>Junte-se a Nós</h2>\n\n<p>A qualidade de software é uma <strong>jornada, não um destino</strong>. Comece hoje mesmo a explorar nosso conteúdo e faça parte da nossa comunidade.</p>\n\n<p><strong>Obrigado por escolher o Blog Ideiasti como seu guia em Qualidade de Software!</strong></p>\n\n<hr>\n<em>Última atualização: Julho de 2026</em>', 'Sobre o Blog Ideiasti', '', 'inherit', 'closed', 'closed', '', '53-revision-v1', '', '', '2026-07-06 23:11:19', '2026-07-07 02:11:19', '', '53', 'http://localhost:8082/ideiasti/?p=479', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('480', '0', '2026-07-06 23:13:50', '2026-07-07 02:13:50', '<h2>Introdução</h2>\n\n<p>A automação de testes sempre foi um pilar essencial para garantir qualidade, velocidade e confiabilidade no desenvolvimento de software. Porém, o cenário mudou radicalmente nos últimos anos: a Inteligência Artificial deixou de ser um conceito futurista e passou a atuar como força motriz na evolução dos testes automatizados. Hoje, IA não é apenas um complemento — é um multiplicador de eficiência que redefine como equipes desenvolvem, validam e mantêm sistemas.<br><hr><br><h2>Desenvolvimento</h2></p>\n\n<p>A implementação de Inteligência Artificial nos testes automatizados exige uma abordagem estratégica que combine tecnologia, metodologia e cultura organizacional. O primeiro passo é compreender que IA não substitui o processo de QA tradicional, mas o potencializa. O desenvolvimento de uma arquitetura de testes inteligente começa pela integração entre ferramentas de automação e modelos de aprendizado de máquina capazes de interpretar padrões de falhas e sugerir melhorias contínuas.</p>\n\n<p>Durante o desenvolvimento, é essencial definir pipelines de CI/CD que incorporem módulos de IA para análise de regressão, priorização de testes e detecção de anomalias. Esses módulos podem ser treinados com dados históricos de execução, relatórios de bugs e métricas de desempenho, permitindo que o sistema aprenda e se adapte a cada nova versão do software.</p>\n\n<p>Outro ponto crítico é a integração entre IA e frameworks de teste como Selenium, Cypress ou Playwright. A IA pode gerar scripts automaticamente, identificar elementos dinâmicos na interface e ajustar os testes conforme o comportamento do usuário. Isso reduz drasticamente o tempo de manutenção e aumenta a confiabilidade dos resultados.</p>\n\n<p>Por fim, o sucesso do desenvolvimento depende da colaboração entre desenvolvedores, analistas de QA e cientistas de dados. Essa sinergia garante que os modelos de IA sejam alimentados com dados relevantes e que as decisões automatizadas estejam alinhadas aos objetivos de negócio. O resultado é um ciclo de testes mais inteligente, autônomo e escalável — capaz de acompanhar o ritmo acelerado da inovação tecnológica.</p>\n\n<hr>\n<h3>Tópico 1</h3>\n<ol><li>O salto dos testes tradicionais para testes inteligentes</li>\n</ol>Os testes automatizados tradicionais dependem de scripts rígidos, cenários pré-definidos e manutenção constante. Eles funcionam bem, mas têm limitações claras:\n\n<p>Quebram facilmente quando a interface muda</p>\n\n<p>Exigem grande esforço de manutenção</p>\n\n<p>Não conseguem prever cenários não mapeados</p>\n\n<p>Não aprendem com execuções anteriores</p>\n\n<p>A IA muda esse paradigma ao introduzir testes adaptativos, geração automática de casos, análise preditiva e detecção inteligente de falhas.</p>\n\n<hr>\n<h3>Tópico 2</h3>\n<ol><li>Como a IA transforma o ciclo de testes</li>\n</ol>Geração automática de casos de teste\nModelos de IA analisam requisitos, código-fonte e histórico de bugs para criar casos de teste completos, cobrindo cenários que humanos frequentemente ignoram.\nIsso reduz o tempo de planejamento e aumenta a cobertura de forma significativa.\n\n<p>Testes autossustentáveis<br>Ferramentas baseadas em IA identificam mudanças na interface ou no fluxo do sistema e ajustam automaticamente os scripts.<br>O resultado: menos testes quebrados e menos retrabalho.</p>\n\n<p>Detecção inteligente de falhas<br>Em vez de simplesmente apontar que “algo falhou”, a IA correlaciona logs, métricas e comportamento do sistema para sugerir a causa raiz.<br>Isso acelera o diagnóstico e reduz o tempo médio de resolução.</p>\n\n<p>Análise preditiva<br>Com base em dados históricos, a IA prevê áreas do sistema mais propensas a falhas, permitindo priorização inteligente e testes direcionados.</p>\n\n<hr><ol><li>Exemplos práticos de implementação</li>\n</ol>a) Testes de UI com visão computacional\nA IA interpreta elementos visuais da interface como um usuário humano faria, tornando testes mais resilientes a mudanças de layout.\n\n<p>b) Testes de API com modelos de linguagem<br>Modelos de IA geram payloads complexos, simulam comportamentos inesperados e validam respostas com base em padrões aprendidos.</p>\n\n<p>c) Testes de performance com análise comportamental<br>A IA identifica gargalos antes que eles se tornem críticos, simulando cargas realistas baseadas em uso real.</p>\n\n<hr><ol><li>Benefícios concretos para equipes de desenvolvimento</li>\n</ol>Redução de até 40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} no tempo de criação de testes\n\n<p>Cobertura ampliada sem aumento de esforço humano</p>\n\n<p>Menos falhas em produção</p>\n\n<p>Ciclos de entrega mais rápidos</p>\n\n<p>Menos dependência de especialistas em QA para tarefas repetitivas</p>\n\n<p>A IA libera o time para focar no que realmente importa: estratégia, arquitetura e inovação.</p>\n\n<hr><ol><li>Desafios e cuidados necessários</li>\n</ol>Nem tudo são flores — e é importante reconhecer isso.\n\n<p>Modelos de IA precisam de dados de qualidade</p>\n\n<p>A implementação exige mudança cultural</p>\n\n<p>Ferramentas inteligentes ainda podem gerar falsos positivos</p>\n\n<p>A supervisão humana continua indispensável</p>\n\n<p>IA não substitui profissionais de QA; ela amplia suas capacidades.</p>\n\n<hr><ol><li>O futuro dos testes automatizados</li>\n</ol>O caminho aponta para:\n\n<p>Testes totalmente autônomos, capazes de aprender continuamente</p>\n\n<p>Integração nativa com pipelines DevOps</p>\n\n<p>Ambientes de teste gerados automaticamente</p>\n\n<p>Simulações avançadas com agentes inteligentes</p>\n\n<p>A IA não é mais tendência — é o novo padrão.</p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes automatizados com IA representam uma revolução silenciosa, porém profunda. Eles elevam a qualidade, reduzem custos e aceleram entregas. Para empresas que buscam competitividade, adotar IA nos testes não é mais opcional: é estratégico.</p>\n\n<hr>\n<em>Última atualização: julho de 2026</em>', 'Testes Automatizados com Implementação de IA: A Nova Era da Qualidade de Software', '', 'publish', 'open', 'open', '', '41testesautomatizadoscomimplementacaodeiaanovaeradaqualidadedesoftware', '', '', '2026-07-06 23:13:50', '2026-07-07 02:13:50', '', '0', 'http://localhost:8082/ideiasti/41testesautomatizadoscomimplementacaodeiaanovaeradaqualidadedesoftware/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('481', '0', '2026-07-06 23:17:12', '2026-07-07 02:17:12', '', 'TestesIA-1', '', 'inherit', 'open', 'closed', '', 'testesia-1', '', '', '2026-07-06 23:17:12', '2026-07-07 02:17:12', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/TestesIA-1.png', '0', 'attachment', 'image/png', '0');

DROP TABLE IF EXISTS `wp_term_relationships`;
CREATE TABLE `wp_term_relationships` (
  `object_id` bigint(20) unsigned NOT NULL DEFAULT 0,
  `term_taxonomy_id` bigint(20) unsigned NOT NULL DEFAULT 0,
  `term_order` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`object_id`,`term_taxonomy_id`),
  KEY `term_taxonomy_id` (`term_taxonomy_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

INSERT INTO `wp_term_relationships` VALUES ('1', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('3', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('7', '2', '0');
INSERT INTO `wp_term_relationships` VALUES ('9', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('10', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('11', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('12', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('13', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('14', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('15', '7', '0');
INSERT INTO `wp_term_relationships` VALUES ('16', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('17', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('18', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('19', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('20', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('21', '9', '0');
INSERT INTO `wp_term_relationships` VALUES ('22', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('23', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('24', '10', '0');
INSERT INTO `wp_term_relationships` VALUES ('25', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('26', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('27', '11', '0');
INSERT INTO `wp_term_relationships` VALUES ('28', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('30', '12', '0');
INSERT INTO `wp_term_relationships` VALUES ('33', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('34', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('35', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('36', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('37', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('38', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('39', '7', '0');
INSERT INTO `wp_term_relationships` VALUES ('40', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('41', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('42', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('43', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('44', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('45', '9', '0');
INSERT INTO `wp_term_relationships` VALUES ('46', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('47', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('48', '10', '0');
INSERT INTO `wp_term_relationships` VALUES ('49', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('50', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('51', '11', '0');
INSERT INTO `wp_term_relationships` VALUES ('52', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('53', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('56', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('57', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('58', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('59', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('60', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('61', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('62', '7', '0');
INSERT INTO `wp_term_relationships` VALUES ('63', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('64', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('65', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('66', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('67', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('68', '9', '0');
INSERT INTO `wp_term_relationships` VALUES ('69', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('70', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('71', '10', '0');
INSERT INTO `wp_term_relationships` VALUES ('72', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('73', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('74', '11', '0');
INSERT INTO `wp_term_relationships` VALUES ('75', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('136', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('138', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('140', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('142', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('144', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('146', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('148', '7', '0');
INSERT INTO `wp_term_relationships` VALUES ('150', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('152', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('154', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('156', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('158', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('160', '9', '0');
INSERT INTO `wp_term_relationships` VALUES ('162', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('164', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('166', '10', '0');
INSERT INTO `wp_term_relationships` VALUES ('168', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('170', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('172', '11', '0');
INSERT INTO `wp_term_relationships` VALUES ('174', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('176', '1', '0');
INSERT INTO `wp_term_relationships` VALUES ('177', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('178', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('179', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('180', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('181', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('182', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('183', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('184', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('185', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('186', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('187', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('188', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('189', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('190', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('191', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('192', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('193', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('194', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('195', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('196', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('197', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('198', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('199', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('200', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('201', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('202', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('203', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('204', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('205', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('206', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('207', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('208', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('209', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('210', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('211', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('212', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('213', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('214', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('215', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('216', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('217', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('218', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('281', '18', '0');
INSERT INTO `wp_term_relationships` VALUES ('282', '18', '0');
INSERT INTO `wp_term_relationships` VALUES ('283', '18', '0');
INSERT INTO `wp_term_relationships` VALUES ('284', '17', '0');
INSERT INTO `wp_term_relationships` VALUES ('285', '17', '0');
INSERT INTO `wp_term_relationships` VALUES ('286', '17', '0');
INSERT INTO `wp_term_relationships` VALUES ('287', '17', '0');
INSERT INTO `wp_term_relationships` VALUES ('288', '17', '0');
INSERT INTO `wp_term_relationships` VALUES ('289', '17', '0');
INSERT INTO `wp_term_relationships` VALUES ('336', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('337', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('338', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('342', '19', '0');
INSERT INTO `wp_term_relationships` VALUES ('452', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('457', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('458', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('459', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('480', '14', '0');

DROP TABLE IF EXISTS `wp_term_taxonomy`;
CREATE TABLE `wp_term_taxonomy` (
  `term_taxonomy_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `term_id` bigint(20) unsigned NOT NULL DEFAULT 0,
  `taxonomy` varchar(32) NOT NULL DEFAULT '',
  `description` longtext NOT NULL,
  `parent` bigint(20) unsigned NOT NULL DEFAULT 0,
  `count` bigint(20) NOT NULL DEFAULT 0,
  PRIMARY KEY (`term_taxonomy_id`),
  UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`),
  KEY `taxonomy` (`taxonomy`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

INSERT INTO `wp_term_taxonomy` VALUES ('1', '1', 'category', '', '0', '0');
INSERT INTO `wp_term_taxonomy` VALUES ('2', '2', 'wp_theme', '', '0', '1');
INSERT INTO `wp_term_taxonomy` VALUES ('3', '3', 'categoria-achadinho', '', '0', '8');
INSERT INTO `wp_term_taxonomy` VALUES ('4', '4', 'categoria-achadinho', '', '0', '28');
INSERT INTO `wp_term_taxonomy` VALUES ('5', '5', 'categoria-achadinho', '', '0', '8');
INSERT INTO `wp_term_taxonomy` VALUES ('6', '6', 'categoria-achadinho', '', '0', '8');
INSERT INTO `wp_term_taxonomy` VALUES ('7', '7', 'categoria-achadinho', '', '0', '4');
INSERT INTO `wp_term_taxonomy` VALUES ('8', '8', 'categoria-achadinho', '', '0', '12');
INSERT INTO `wp_term_taxonomy` VALUES ('9', '9', 'categoria-achadinho', '', '0', '4');
INSERT INTO `wp_term_taxonomy` VALUES ('10', '10', 'categoria-achadinho', '', '0', '4');
INSERT INTO `wp_term_taxonomy` VALUES ('11', '11', 'categoria-achadinho', '', '0', '4');
INSERT INTO `wp_term_taxonomy` VALUES ('12', '12', 'wp_theme', '', '0', '1');
INSERT INTO `wp_term_taxonomy` VALUES ('14', '14', 'category', '', '0', '12');
INSERT INTO `wp_term_taxonomy` VALUES ('15', '15', 'category', '', '0', '37');
INSERT INTO `wp_term_taxonomy` VALUES ('17', '17', 'nav_menu', '', '0', '6');
INSERT INTO `wp_term_taxonomy` VALUES ('18', '18', 'nav_menu', '', '0', '3');
INSERT INTO `wp_term_taxonomy` VALUES ('19', '19', 'wp_theme', '', '0', '1');

DROP TABLE IF EXISTS `wp_termmeta`;
CREATE TABLE `wp_termmeta` (
  `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `term_id` bigint(20) unsigned NOT NULL DEFAULT 0,
  `meta_key` varchar(255) DEFAULT NULL,
  `meta_value` longtext DEFAULT NULL,
  PRIMARY KEY (`meta_id`),
  KEY `term_id` (`term_id`),
  KEY `meta_key` (`meta_key`(191))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;


DROP TABLE IF EXISTS `wp_terms`;
CREATE TABLE `wp_terms` (
  `term_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL DEFAULT '',
  `slug` varchar(200) NOT NULL DEFAULT '',
  `term_group` bigint(10) NOT NULL DEFAULT 0,
  PRIMARY KEY (`term_id`),
  KEY `slug` (`slug`(191)),
  KEY `name` (`name`(191))
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

INSERT INTO `wp_terms` VALUES ('1', 'Sem categoria', 'sem-categoria', '0');
INSERT INTO `wp_terms` VALUES ('2', 'assets/..', 'assets', '0');
INSERT INTO `wp_terms` VALUES ('3', 'Utilitários', 'utilitarios', '0');
INSERT INTO `wp_terms` VALUES ('4', 'Acessórios', 'acessorios', '0');
INSERT INTO `wp_terms` VALUES ('5', 'Smart Home', 'smart-home', '0');
INSERT INTO `wp_terms` VALUES ('6', 'Setup', 'setup', '0');
INSERT INTO `wp_terms` VALUES ('7', 'Áudio', 'audio', '0');
INSERT INTO `wp_terms` VALUES ('8', 'Ferramentas', 'ferramentas', '0');
INSERT INTO `wp_terms` VALUES ('9', 'PC', 'pc', '0');
INSERT INTO `wp_terms` VALUES ('10', 'Entretenimento', 'entretenimento', '0');
INSERT INTO `wp_terms` VALUES ('11', 'Periféricos', 'perifericos', '0');
INSERT INTO `wp_terms` VALUES ('12', 'achadinhos-tech', 'achadinhos-tech', '0');
INSERT INTO `wp_terms` VALUES ('14', 'Introdução a Qualidade de Software', 'introducao-a-qualidade-de-software', '0');
INSERT INTO `wp_terms` VALUES ('15', 'Testes Automatizados', 'testes-automatizados', '0');
INSERT INTO `wp_terms` VALUES ('17', 'Primary Menu', 'primary-menu', '0');
INSERT INTO `wp_terms` VALUES ('18', 'Footer Menu', 'footer-menu', '0');
INSERT INTO `wp_terms` VALUES ('19', 'ideiasti-tech', 'ideiasti-tech', '0');

DROP TABLE IF EXISTS `wp_usermeta`;
CREATE TABLE `wp_usermeta` (
  `umeta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned NOT NULL DEFAULT 0,
  `meta_key` varchar(255) DEFAULT NULL,
  `meta_value` longtext DEFAULT NULL,
  PRIMARY KEY (`umeta_id`),
  KEY `user_id` (`user_id`),
  KEY `meta_key` (`meta_key`(191))
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

INSERT INTO `wp_usermeta` VALUES ('1', '1', 'nickname', 'pcyasuic');
INSERT INTO `wp_usermeta` VALUES ('2', '1', 'first_name', '');
INSERT INTO `wp_usermeta` VALUES ('3', '1', 'last_name', '');
INSERT INTO `wp_usermeta` VALUES ('4', '1', 'description', '');
INSERT INTO `wp_usermeta` VALUES ('5', '1', 'rich_editing', 'true');
INSERT INTO `wp_usermeta` VALUES ('6', '1', 'syntax_highlighting', 'true');
INSERT INTO `wp_usermeta` VALUES ('7', '1', 'comment_shortcuts', 'false');
INSERT INTO `wp_usermeta` VALUES ('8', '1', 'admin_color', 'modern');
INSERT INTO `wp_usermeta` VALUES ('9', '1', 'use_ssl', '0');
INSERT INTO `wp_usermeta` VALUES ('10', '1', 'show_admin_bar_front', 'true');
INSERT INTO `wp_usermeta` VALUES ('11', '1', 'locale', '');
INSERT INTO `wp_usermeta` VALUES ('12', '1', 'wp_capabilities', 'a:1:{s:13:\"administrator\";b:1;}');
INSERT INTO `wp_usermeta` VALUES ('13', '1', 'wp_user_level', '10');
INSERT INTO `wp_usermeta` VALUES ('14', '1', 'dismissed_wp_pointers', '');
INSERT INTO `wp_usermeta` VALUES ('15', '1', 'show_welcome_panel', '1');
INSERT INTO `wp_usermeta` VALUES ('16', '1', 'session_tokens', 'a:4:{s:64:\"be69e7c3cb429a657be8ecdd322c82c4789d228eb322a0ab0859c15b83d0aa5d\";a:4:{s:10:\"expiration\";i:1783454279;s:2:\"ip\";s:3:\"::1\";s:2:\"ua\";s:125:\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36 Edg/149.0.0.0\";s:5:\"login\";i:1783281479;}s:64:\"be0a3c631e2088f8f735e7755dbda92d7fb6180ec47503fc6524e0099aa6d89a\";a:4:{s:10:\"expiration\";i:1783555587;s:2:\"ip\";s:3:\"::1\";s:2:\"ua\";s:125:\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 OPR/132.0.0.0\";s:5:\"login\";i:1783382787;}s:64:\"b911f7da7633a2f719e42a87e884082c93e861bf81beced67e8b2e66a731999a\";a:4:{s:10:\"expiration\";i:1783555630;s:2:\"ip\";s:3:\"::1\";s:2:\"ua\";s:4:\"node\";s:5:\"login\";i:1783382830;}s:64:\"c899e199169bdb67b9be7bc137e90d7e4f88b69e784fcf4af2efac9633c266ab\";a:4:{s:10:\"expiration\";i:1783555741;s:2:\"ip\";s:3:\"::1\";s:2:\"ua\";s:4:\"node\";s:5:\"login\";i:1783382941;}}');
INSERT INTO `wp_usermeta` VALUES ('17', '1', 'wp_user-settings', 'mfold=o&libraryContent=browse');
INSERT INTO `wp_usermeta` VALUES ('18', '1', 'wp_user-settings-time', '1783307673');
INSERT INTO `wp_usermeta` VALUES ('19', '1', 'wp_dashboard_quick_press_last_post_id', '5');
INSERT INTO `wp_usermeta` VALUES ('20', '1', 'wp_persisted_preferences', 'a:3:{s:4:\"core\";a:1:{s:26:\"isComplementaryAreaVisible\";b:1;}s:14:\"core/edit-post\";a:1:{s:12:\"welcomeGuide\";b:0;}s:9:\"_modified\";s:24:\"2026-07-03T04:12:04.553Z\";}');
INSERT INTO `wp_usermeta` VALUES ('21', '1', 'nav_menu_recently_edited', '18');
INSERT INTO `wp_usermeta` VALUES ('22', '1', 'managenav-menuscolumnshidden', 'a:5:{i:0;s:11:\"link-target\";i:1;s:11:\"css-classes\";i:2;s:3:\"xfn\";i:3;s:11:\"description\";i:4;s:15:\"title-attribute\";}');
INSERT INTO `wp_usermeta` VALUES ('23', '1', 'metaboxhidden_nav-menus', 'a:1:{i:0;s:12:\"add-post_tag\";}');
INSERT INTO `wp_usermeta` VALUES ('25', '1', 'AkeebaSession_17c300153888c35a1fd764a83b090f53', 'a:7:{s:9:\"insideCMS\";b:1;s:22:\"platformNameForUpdates\";s:9:\"wordpress\";s:25:\"platformVersionForUpdates\";s:3:\"7.0\";s:13:\"newSecretWord\";N;s:7:\"profile\";i:1;s:16:\"solo_manage_task\";s:4:\"main\";s:7:\"__flash\";a:0:{}}');
INSERT INTO `wp_usermeta` VALUES ('26', '1', 'AkeebaSession_7d7d2718644b93cd6f10d19ed7d851b8', '');

DROP TABLE IF EXISTS `wp_users`;
CREATE TABLE `wp_users` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_login` varchar(60) NOT NULL DEFAULT '',
  `user_pass` varchar(255) NOT NULL DEFAULT '',
  `user_nicename` varchar(50) NOT NULL DEFAULT '',
  `user_email` varchar(100) NOT NULL DEFAULT '',
  `user_url` varchar(100) NOT NULL DEFAULT '',
  `user_registered` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
  `user_activation_key` varchar(255) NOT NULL DEFAULT '',
  `user_status` int(11) NOT NULL DEFAULT 0,
  `display_name` varchar(250) NOT NULL DEFAULT '',
  PRIMARY KEY (`ID`),
  KEY `user_login_key` (`user_login`),
  KEY `user_nicename` (`user_nicename`),
  KEY `user_email` (`user_email`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

INSERT INTO `wp_users` VALUES ('1', 'pcyasuic', '$wp$2y$10$lLXvRCjGdrkm7GULbNKpq.ZTLd4XEolXkO1Q926jIY41hNiOkZ0AC', 'pcyasuic', 'pcyasuic@outlook.com', 'http://localhost/achadinhos', '2026-07-03 04:08:54', '', '0', 'pcyasuic');

<strong>Desastres</strong></li>\n</ol>   - Perda de datacenter\n   - Corrupção de dados\n   - Ataques DDoS\n\n<h4>Métricas de Recuperação</h4>\n<ol><li><strong>RTO (Recovery Time Objective):</strong> Tempo máximo para recuperação</li>\n<li><strong>RPO (Recovery Point Objective):</strong> Perda máxima de dados aceitável</li>\n<li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li>\n<li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li>\n</ol>\n<hr>\n<h2>Testes de Regressão: Mantendo a Qualidade</h2>\n\n<p>Executados sempre que o código é modificado para garantir que alterações não introduzam novos defeitos. Este é um dos tipos de teste mais importantes e frequentemente executados.</p>\n\n<h3>Quando Executar Testes de Regressão</h3>\n\n<p>✅ Após cada release de software  <br>✅ Após correção de bugs  <br>✅ Após atualizações de dependências  <br>✅ Após refactoring de código  <br>✅ Antes do deploy de produção</p>\n\n<h3>Estratégias de Testes de Regressão</h3>\n\n<h4>1. Regressão Completa</h4>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura total</li><br><li>Alta confiança</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Tempo longo</li><br><li>Custo elevado</li><br></ol><br><h4>2. Regressão Seletiva</h4></p>\n\n<p>Seleciona testes relevantes baseados em mudanças.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Mais rápido</li><br><li>Mais econômico</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode perder cobertura</li><br></ol><br><h4>3. Regressão Prioritária</h4></p>\n\n<p>Executa testes por prioridade (críticos &gt; altos &gt; médios &gt; baixos).</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura do crítico rápido</li><br><li>Decisões baseadas em risco</li><br></ol><br><h3>Automação de Testes de Regressão</h3></p>\n\n<p>A automação é essencial para testes de regressão eficazes:</p>\n\n<p><strong>Benefícios:</strong><ol><li>Execução frequente</li><br><li>Resultados consistentes</li><br><li>Rapidez</li><br><li>Cobertura ampla</li><br></ol><br><strong>Ferramentas Recomendadas:</strong><ol><li>Selenium WebDriver</li><br><li>Playwright</li><br><li>Cypress</li><br><li>Appium (mobile)</li><br><li>RestAssured (API)</li><br></ol><br><hr><br><h2>Pirâmide de Testes: Arquitetura Ideal</h2></p>\n\n<p>A pirâmide de testes é um conceito fundamental que guia a distribuição dos tipos de teste:</p>\n\n<pre><code>                    /\n                   /  \n                  / E2E        ← Poucos testes E2E (lentos, caros)\n                 /      \n                /Integração   ← Alguns testes de integração\n               /            \n              /  Unitários     ← Muitos testes unitários (rápidos, baratos)\n             /________________\n</code></pre>\n\n<h3>Proporções Ideais</h3>\n<ol><li><strong>Unitários:</strong> 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>Integração:</strong> 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>E2E:</strong> 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Compreender os diferentes tipos de testes de software é fundamental para construir uma estratégia de QA eficaz. Cada tipo de teste tem seu propósito específico e deve ser aplicado no momento adequado do ciclo de desenvolvimento.</p>\n\n<p><strong>Resumo dos Tipos de Testes:</strong></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Categoria</th><th>Tipo</th><th>Quando Usar</th><th>Objetivo</th></tr>\n<tr><td><strong>Funcional</strong></td><td>Unitário</td><td>Desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Integração</td><td>Pós-unitário</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Sistema</td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Aceitação</td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Performance</td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Segurança</td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Usabilidade</td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n</table></figure>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem todo projeto precisa de todos os tipos</li><br><li><strong>Priorize</strong> - Comece com unitários e integração</li><br><li><strong>Automatize</strong> - Regressão deve ser automática</li><br><li><strong>Meça</strong> - Cobertura, tempo, defeitos encontrados</li><br><li><strong>Melhore</strong> - Itere constantemente</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre Tipos de Testes</h3></p>\n\n<p><strong>P: Quantos tipos de testes existem?</strong>  <br>R: Existem dozens de tipos de testes classificados de diferentes formas. Os principais são funcionais e não-funcionais, cada um com subtipos específicos.</p>\n\n<p><strong>P: Qual a diferença entre teste de sistema e teste de aceitação?</strong>  <br>R: Teste de sistema verifica se o sistema atende aos requisitos técnicos. Teste de aceitação verifica se o sistema atende às expectativas do usuário/cliente.</p>\n\n<p><strong>P: Testes manuais podem ser substituídos por automatizados?</strong>  <br>R: Não completamente. Testes manuais são essenciais para exploratory testing, UX e cenários complexos. A automação complementa, não substitui.</p>\n\n<p><strong>P: Quando devo começar a testar?</strong>  <br>R: O mais cedo possível! O conceito de Shift-Left recomenda testes desde as primeiras fases do desenvolvimento.</p>\n\n<p><strong>P: Qual a ordem ideal de execução dos testes?</strong>  <br>R: Unitários → Integração → Sistema → Aceitação. Cada nível depende do anterior.</p>\n\n<hr>\n<em>Fonte: Selenium.dev, Atlassian, Vericode, ISTQB, OWASP</em>', 'Tipos de Testes de Software: Guia Completo com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '179-revision-v1', '', '', '2026-07-06 22:52:08', '2026-07-07 01:52:08', '', '179', 'http://localhost:8082/ideiasti/?p=461', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('462', '0', '2026-07-06 22:52:11', '2026-07-07 01:52:11', '', 'giphy-7', '', 'inherit', 'open', 'closed', '', 'giphy-7', '', '', '2026-07-06 22:52:11', '2026-07-07 01:52:11', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-7.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('463', '0', '2026-07-06 22:52:12', '2026-07-07 01:52:12', '<p><strong>Meta Description:</strong> Descubra como a Inteligência Artificial está revolucionando a QA: automação inteligente, geração de testes, detecção de anomalias e manutenção preditiva. Guia completo para profissionais.</p>\n\n<hr>\n<h2>Estado Atual da IA em QA</h2>\n\n<p>O <strong>World Quality Report 2025</strong> revela dados impressionantes: quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão ativamente buscando GenAI</strong> em práticas de Quality Engineering (QE), mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} alcançaram implementação em escala empresarial.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-7.gif\" alt=\"AI Brain - Inteligência Artificial em QA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Esta lacuna entre interesse e implementação representa uma oportunidade significativa para profissionais e organizações que souberem aproveitar efetivamente essas tecnologias.</p>\n\n<hr>\n<h2>Por Que a Adoção de IA em QA Está Crescendo?</h2>\n\n<h3>Drivers de Adoção</h3>\n<ol><li><strong>Volume de testes crescente</strong> - Sistemas mais complexos exigem mais testes</li>\n<li><strong>Pressure de velocidade</strong> - CI/CD demanda execuções mais rápidas</li>\n<li><strong>Escassez de profissionais</strong> - Demanda supera oferta de testadores</li>\n<li><strong>Qualidade em produção</strong> - Necessidade de monitoramento contínuo</li>\n<li><strong>Custos crescentes</strong> - Automação inteligente reduz despesas</li>\n</ol>\n<h3>Benefícios Comprovados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Impacto da IA</th></tr>\n<tr><td>Redução de tempo de teste</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de custos de QA</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Melhoria em cobertura</td><td>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Detecção precoce de bugs</td><td>3-5x mais cedo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Desafios de Adoção de IA em QA</h2>\n\n<h3>1. Desalinhamento Estratégico</h3>\n\n<p>Existe um hiato crescente entre o interesse organizacional em GenAI e a prontidão real para adoção efetiva dentro de QE. O caminho da experimentação para implementação é mais complexo do que o antecipado.</p>\n\n<h4>Sinais de Desalinhamento</h4>\n\n<ul><li>GenAI vista como \"solução mágica\" sem estratégia clara</li><ol><li>Falta de alinhamento entre TI e negócios</li>\n<li>Expectativas irreais sobre capacidades</li>\n<li>Subestimação de esforço de integração</li>\n</ol>\n<h3>2. Complexidade de Implementação</h3>\n\n<p>A implementação de IA em QA requer alinhamento entre inovação operacional e oversight estratégico. Desafios incluem:</p>\n\n<h4>Desafios Técnicos</h4>\n<ol><li>Integração com sistemas legados</li>\n<li>Qualidade dos dados de treinamento</li>\n<li>Escolha de modelos adequados</li>\n<li>Manutenção de modelos em produção</li>\n</ol>\n<h4>Desafios Organizacionais</h4>\n<ol><li>Resistência cultural</li>\n<li>Falta de competências</li>\n<li>Processos não adaptados</li>\n<li>Governança de IA</li>\n</ol>\n<h3>3. Questões Éticas e de Governança</h3>\n<ol><li>Viés em modelos de IA</li>\n<li>Transparência nas decisões</li>\n<li>Responsabilidade por falhas</li>\n<li>Conformidade regulatória</li>\n</ol>\n<hr>\n<h2>Aplicações de IA em QA: Casos de Uso Detalhados</h2>\n\n<h3>1. Geração Automatizada de Testes</h3>\n\n<p>IA pode gerar casos de teste automaticamente baseados em requisitos e código. Esta é uma das aplicações mais promissoras.</p>\n\n<figure><img src=\"https://media.giphy.com/media/VbZ0cWw6cVPMM/giphy.gif\" alt=\"Automação de Testes com IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Requisitos → Análise de NLP → Cenários de Teste → Casos de Teste\n    ↓                                                        ↓\n Código → Análise Estática → Cobertura → Testes Sugeridos\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de unit tests</td><td>Diffblue</td></tr>\n<tr><td><strong>Testim</strong></td><td>Testes E2E com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>Automação sem código com IA</td><td>Avo Automation</td></tr>\n</table></figure>\n\n<h4>Exemplo: Geração de Testes com GenAI</h4>\n\n<pre><code># Exemplo conceitual de como IA pode gerar testes\nimport openai\n\n<p>def gerar_testes_para_requisito(requisito):<br>    prompt = f\"\"\"<br>    Gere casos de teste para o seguinte requisito:</p>\n\n<p>Requisito: {requisito}</p>\n\n<p>Formato de saída (JSON):<br>    {{<br>        \"casos_de_teste\": [<br>            {{<br>                \"id\": \"CT-001\",<br>                \"titulo\": \"...\",<br>                \"pre_condicoes\": [...],<br>                \"passos\": [...],<br>                \"dados_teste\": {{...}},<br>                \"resultado_esperado\": \"...\"<br>            }}<br>        ]<br>    }}<br>    \"\"\"</p>\n\n<p>response = openai.chat.completions.create(<br>        model=\"gpt-4\",<br>        messages=[{\"role\": \"user\", \"content\": prompt}]<br>    )</p>\n\n<p>return json.loads(response.choices[0].message.content)<br></code></pre></p>\n\n<h3>2. Detecção de Anomalias</h3>\n\n<p>Algoritmos de machine learning identificam padrões incomuns que indicam defeitos, revolucionando o monitoramento de qualidade.</p>\n\n<h4>Técnicas Utilizadas</h4>\n\n<p>##### Análise de Séries Temporais<br><ol><li>Identificação de anomalias em métricas de performance</li><br><li>Detecção de degradação gradual</li><br><li>Alertas proativos sobre problemas</li><br></ol><br>##### Clustering<br><ol><li>Agrupamento de testes similares</li><br><li>Identificação de testes atípicos</li><br><li>Detecção de padrões de falha</li><br></ol><br>##### Redes Neurais<br><ol><li>Detecção de padrões complexos</li><br><li>Aprendizado de comportamentos normais</li><br><li>Previsão de falhas</li><br></ol><br><h4>Ferramentas de Detecção de Anomalias</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Aplicação</th></tr>\n<tr><td><strong>Elastic APM</strong></td><td>APM</td><td>Detecção de anomalias em produção</td></tr>\n<tr><td><strong>Datadog</strong></td><td>Monitoring</td><td>ML para métricas</td></tr>\n<tr><td><strong>New Relic</strong></td><td>APM</td><td>Detecção inteligente</td></tr>\n<tr><td><strong>Grafana + Loki</strong></td><td>Logging</td><td>Análise de logs com ML</td></tr>\n</table></figure>\n\n<h3>3. Manutenção Inteligente de Testes</h3>\n\n<p>IA ajuda a identificar e remover testes obsoletos ou flaky, mantendo a suite de testes saudável.</p>\n\n<h4>Problemas que a IA Resolve</h4>\n\n<p><strong>Testes Flaky (Instáveis)</strong><br><ol><li>Identificação de padrões que causam instabilidade</li><br><li>Predição de quais testes podem falhar</li><br><li>Sugestões de correções</li><br><li>Quarentena automática</li><br></ol><br><strong>Testes Obsoletos</strong><br><ol><li>Detecção de funcionalidades removidas</li><br><li>Identificação de código não coberto</li><br><li>Sugestões de remoção segura</li><br></ol><br><h4>Exemplo de Detecção de Testes Flaky</h4></p>\n\n<pre><code># Sistema simplificado de detecção de testes flaky\nclass FlakyTestDetector:\n    def __init__(self):\n        self.test_history = {}\n        self.ml_model = load_trained_model()\n\n<p>def analyze_test(self, test_name, execution_history):<br>        features = self.extract_features(execution_history)<br>        flaky_probability = self.ml_model.predict_proba([features])[0]</p>\n\n<p>if flaky_probability &gt; 0.7:<br>            return {<br>                \"test\": test_name,<br>                \"flaky_probability\": flaky_probability,<br>                \"recommendation\": \"QUARANTINE\",<br>                \"reasons\": self.explain_prediction(features)<br>            }<br>        return {\"test\": test_name, \"flaky_probability\": flaky_probability}</p>\n\n<p>def extract_features(self, history):<br>        return [<br>            history.success_rate,<br>            history.avg_duration,<br>            history.recent_failures,<br>            history.environment_changes,<br>            history.dependency_changes<br>        ]<br></code></pre></p>\n\n<h3>4. Análise de Código Estático com IA</h3>\n\n<p>Identifica potenciais problemas de qualidade antes da execução, usando análise semântica avançada.</p>\n\n<h4>Capacidades Avançadas</h4>\n<ol><li><strong>Detecção de vulnerabilidades</strong> - OWASP Top 10</li>\n<li><strong>Análise de dependências</strong> - Bibliotecas desatualizadas</li>\n<li><strong>Code smells</strong> - Padrões problemáticos</li>\n<li><strong>Débito técnico</strong> - Métricas de qualidade</li>\n</ol>\n<h4>Ferramentas com IA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Capacidades IA</th><th>Integração</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Débito técnico, code smells</td><td>CI/CD</td></tr>\n<tr><td><strong>Snyk</strong></td><td>Vulnerabilidades, licenças</td><td>IDE, CI</td></tr>\n<tr><td><strong>CodeClimate</strong></td><td>Quality, maintainability</td><td>GitHub</td></tr>\n<tr><td><strong>DeepSource</strong></td><td>Análise estática com ML</td><td>Git</td></tr>\n</table></figure>\n\n<h3>5. Testes Visuais Automatizados</h3>\n\n<p>Comparação de interfaces visuais usando visão computacional para detectar regressões.</p>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Página Capturada → Modelo de Visão Computacional → Comparação com Baseline\n     ↓                          ↓                                    ↓\n  Screenshots           Detecção de Elementos           Diff Visual\n                                            ↓\n                                    Alertas de Regressão\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tecnologia</th><th>Diferencial</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Visual AI</td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de precisão</td></tr>\n<tr><td><strong> Percy</strong></td><td>Visual testing</td><td>Integração simples</td></tr>\n<tr><td><strong>Chromatic</strong></td><td>Visual regression</td><td>Para Storybook</td></tr>\n<tr><td><strong>Lost Pixel</strong></td><td>Open source</td><td>Self-hosted</td></tr>\n</table></figure>\n\n<h3>6. Oráculos de Teste Baseados em IA</h3>\n\n<p>Validação de resultados usando modelos treinados para determinar se o comportamento está correto.</p>\n\n<h4>Tipos de Oráculos</h4>\n<ol><li><strong>Oráculo de Imagem</strong> - Validação visual de UI</li>\n<li><strong>Oráculo de Texto</strong> - Análise de conteúdo</li>\n<li><strong>Oráculo de Comportamento</strong> - Detecção de anomalias</li>\n<li><strong>Oráculo de Dados</strong> - Validação de datasets</li>\n</ol>\n<hr>\n<h2>Ferramentas de IA para QA: Comparativo</h2>\n\n<h3>Plataformas Completas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Testim</strong></td><td>Automação inteligente E2E</td><td>$600+/mês</td><td>Equipes enterprise</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Automação com ML</td><td>Sob consulta</td><td>Escala enterprise</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>$500+/mês</td><td>CI/CD integrado</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>No-code com IA</td><td>Sob consulta</td><td>Enterprise</td></tr>\n<tr><td><strong>Perfecto</strong></td><td>Testes mobile/web com IA</td><td>Sob consulta</td><td>Mobile testing</td></tr>\n</table></figure>\n\n<h3>Ferramentas Especializadas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais</td><td>$100+/mês</td><td>UI testing</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Unit tests</td><td>$299/assinante</td><td>Dev teams</td></tr>\n<tr><td><strong>Snyk</strong></td><td>SCA</td><td>Grátis + Pro</td><td>Developers</td></tr>\n<tr><td><strong>SonarCloud</strong></td><td>SAST</td><td>Grátis + Pro</td><td>CI/CD</td></tr>\n</table></figure>\n\n<h3>Ferramentas Emerging (2025-2026)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Status</th></tr>\n<tr><td><strong>CodiumAI</strong></td><td>Testes gerados automaticamente</td><td>Beta</td></tr>\n<tr><td><strong>Mutable AI</strong></td><td>Code review + tests</td><td>Beta</td></tr>\n<tr><td><strong>Dagger</strong></td><td>CI/CD programável</td><td>GA</td></tr>\n<tr><td><strong>Trunk</strong></td><td>Linting inteligente</td><td>GA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando IA em QA: Roadmap Prático</h2>\n\n<h3>Fase 1: Avaliação e Planejamento (1-2 meses)</h3>\n\n<h4>Checklist de Avaliação</h4>\n<ol><li>[ ] Mapeamento de processos atuais de QA</li>\n<li>[ ] Identificação de pontos de dor</li>\n<li>[ ] Análise de ROI potencial</li>\n<li>[ ] Avaliação de maturidade tecnológica</li>\n<li>[ ] Levantamento de stakeholders</li>\n</ol>\n<h4>Métricas de Baseline</h4>\n\n<p>Antes de implementar, estabeleça métricas de referência:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Ferramenta</th></tr>\n<tr><td>Tempo de teste</td><td>Duração de suite</td><td>CI/CD logs</td></tr>\n<tr><td>Cobertura de teste</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>Coverage tools</td></tr>\n<tr><td>Taxa de defeitos</td><td>Bugs em produção</td><td>Bug tracker</td></tr>\n<tr><td>Testes flaky</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas instáveis</td><td>CI/CD</td></tr>\n<tr><td>Custo de QA</td><td>$/teste executado</td><td>Financeiro</td></tr>\n</table></figure>\n\n<h3>Fase 2: Pilot (2-3 meses)</h3>\n\n<h4>Escolha do Piloto</h4>\n\n<p>Selecione um projeto ou área com:<br><ol><li>✅ Escopo controlado</li><br><li>✅ Equipe aberta a inovação</li><br><li>✅ Processos definidos</li><br><li>✅ Métricas disponíveis</li><br></ol><br><h4>Pilotos Recomendados</h4><br><ol><li><strong>Geração de unit tests</strong> - Diffblue, CodiumAI</li><br><li><strong>Testes visuais</strong> - Applitools</li><br><li><strong>Detecção de flaky tests</strong> - Ferramentas de CI</li><br><li><strong>Análise estática</strong> - SonarQube, Snyk</li><br></ol><br><h3>Fase 3: Expansão (3-6 meses)</h3></p>\n\n<h4>Escalar Sucesso</h4>\n<ol><li>Documente aprendizados</li>\n<li>Treine outras equipes</li>\n<li>Padronize processos</li>\n<li>Melhore integrações</li>\n</ol>\n<h4>KPIs de Sucesso</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Meta (6 meses)</th></tr>\n<tr><td>Redução de tempo de teste</td><td>30-40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Aumento de cobertura</td><td>20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de defeitos em prod</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>ROI positivo</td><td>Sim</td></tr>\n</table></figure>\n\n<h3>Fase 4: Maturidade (6-12 meses)</h3>\n\n<h4>Implementação Enterprise</h4>\n<ol><li>Integração completa com CI/CD</li>\n<li>IA em produção (monitoramento)</li>\n<li>Maintenance automatizado</li>\n<li>Reporting avançado</li>\n</ol>\n<hr>\n<h2>Futuro da IA em QA: Tendências 2026-2028</h2>\n\n<h3>1. Testes Autônomos</h3>\n\n<p>Sistemas que automaticamente:<br><ol><li>Geram testes baseados em requisitos</li><br><li>Executam testes continuamente</li><br><li>Detectam e reportam falhas</li><br><li>Propõem correções</li><br></ol><br><h3>2. Manutenção Preditiva</h3></p>\n\n<p>IA que prevê:<br><ol><li>Quando testes vão falhar</li><br><li>Quando código precisa de mais testes</li><br><li>Quando componentes estão em risco</li><br><li>Quando fazer refactoring</li><br></ol><br><h3>3. GenAI Nativa em QA</h3></p>\n\n<p>Modelos treinados especificamente para:<br><ol><li>Entender código e testes</li><br><li>Gerar código de teste</li><br><li>Analisar requisitos</li><br><li>Documentar testes</li><br></ol><br><h3>4. Testes em Produção com IA</h3></p>\n\n<p>Monitoramento inteligente:<br><ol><li>Detecção de anomalias em produção</li><br><li>Geração automática de testes de regressão</li><br><li>Validação de deployments</li><br><li>Root cause analysis</li><br></ol><br><hr><br><h2>Considerações Éticas e Best Practices</h2></p>\n\n<h3>Governança de IA em QA</h3>\n\n<h4>Princípios</h4>\n<ol><li><strong>Transparência</strong> - Documente como a IA toma decisões</li>\n<li><strong>Responsabilidade</strong> - Humanos mantêm responsabilidade final</li>\n<li><strong>Fairness</strong> - Evite viés em modelos</li>\n<li><strong>Privacidade</strong> - Proteja dados sensíveis</li>\n<li><strong>Segurança</strong> - Proteja modelos contra ataques</li>\n</ol>\n<h4>Checklist de Governança</h4>\n<ol><li>[ ] Política de uso de IA em QA documentada</li>\n<li>[ ] Processos de revisão de decisões de IA</li>\n<li>[ ] Documentação de modelos utilizados</li>\n<li>[ ] Plano de contingência para falhas de IA</li>\n<li>[ ] Treinamento de equipe em uso responsável</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A IA está transformando fundamentalmente a QA, oferecendo oportunidades sem precedentes para aumentar eficiência, cobertura e qualidade. Embora a adoção em escala ainda seja um desafio, organizações que investem estrategicamente em IA para QA estão obtendo vantagens competitivas significativas.</p>\n\n<p><strong>Resumo dos Principais Aprendizados:</strong></p>\n\n<p>✅ IA pode reduzir tempo de teste em 40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}  <br>✅ GenAI está sendo buscada por 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações, mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram em escala  <br>✅ Ferramentas como Playwright, Applitools e Testim estão liderando a adoção  <br>✅ Implementação requer estratégia, não apenas ferramentas  <br>✅ Futuro aponta para testes autônomos e manutenção preditiva</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem toda organização precisa de todas as capacidades</li><br><li><strong>Comece pequeno</strong> - Pilotos controlados são mais eficazes</li><br><li><strong>Meça resultados</strong> - Métricas são essenciais</li><br><li><strong>Treine sua equipe</strong> - Competências em IA são necessárias</li><br><li><strong>Governarize</strong> - Adote práticas éticas desde o início</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre IA em QA</h3></p>\n\n<p><strong>P: A IA vai substituir testadores humanos?</strong>  <br>R: Não. A IA complementa o trabalho humano, permitindo que testadores foquem em atividades estratégicas, exploratory testing e design de testes.</p>\n\n<p><strong>P: Qual é o ROI da implementação de IA em QA?</strong>  <br>R: O ROI típico é de 200-500{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em 12-18 meses, considerando redução de tempo de teste, aumento de cobertura e redução de defeitos em produção.</p>\n\n<p><strong>P: Preciso de especialistas em dados para implementar IA em QA?</strong>  <br>R: Não necessariamente. Muitas ferramentas são \"plug-and-play\" e não requerem conhecimento de ML. No entanto, para implementações avançadas, especialistas são úteis.</p>\n\n<p><strong>P: Quais são os principais riscos do uso de IA em QA?</strong>  <br>R: Os principais riscos incluem: dependência excessiva, viés em modelos, falta de transparência e custos inesperados de manutenção.</p>\n\n<p><strong>P: Quando devo começar a usar IA em QA?</strong>  <br>R: Se você tem mais de 100 testes automatizados ou gastando mais de 20 horas/semana em QA, é um bom momento para avaliar ferramentas de IA.</p>\n\n<hr>\n<em>Fonte: World Quality Report 2025, Software Testing Magazine, Gartner Research, IEEE Software</em>', 'Inteligência Artificial em Quality Assurance: Guia Completo para 2025-2026', '', 'inherit', 'closed', 'closed', '', '181-revision-v1', '', '', '2026-07-06 22:52:12', '2026-07-07 01:52:12', '', '181', 'http://localhost:8082/ideiasti/?p=463', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('464', '0', '2026-07-06 22:52:43', '2026-07-07 01:52:43', '', 'giphy-8', '', 'inherit', 'open', 'closed', '', 'giphy-8', '', '', '2026-07-06 22:52:43', '2026-07-07 01:52:43', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-8.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('465', '0', '2026-07-06 22:52:44', '2026-07-07 01:52:44', '<p><strong>Meta Description:</strong> Conheça todos os tipos de testes de software: funcionais, não-funcionais, unitários, integração, sistema e mais. Guia completo com definições, objetivos e melhores práticas.</p>\n\n<hr>\n<h2>Introdução aos Tipos de Testes de Software</h2>\n\n<p>Os testes de software são uma atividade crítica no ciclo de desenvolvimento de sistemas. Compreender os diferentes tipos de testes e quando aplicá-los é fundamental para garantir a qualidade e confiabilidade das aplicações.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-8.gif\" alt=\"Pirâmide de Testes - Hierarquia de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este guia completo apresenta uma categorização detalhada dos principais tipos de testes de software, suas finalidades, características e quando cada um deve ser utilizado no seu projeto.</p>\n\n<hr>\n<h2>Categorização Geral dos Testes</h2>\n\n<p>Os testes de software podem ser divididos em duas categorias principais:</p>\n\n<h3>1. Testes Funcionais</h3>\n\n<p>Verificam se o software funciona conforme especificado, testando funcionalidades específicas e requisitos do negócio.</p>\n\n<h3>2. Testes Não-Funcionais</h3>\n\n<p>Avaliam características como performance, segurança, usabilidade e confiabilidade, que não estão relacionadas a funcionalidades específicas.</p>\n\n<hr>\n<h2>Testes Funcionais: Garantindo o Comportamento Correto</h2>\n\n<h3>Teste Unitário: A Base de Tudo</h3>\n\n<p>O teste unitário é o tipo mais básico de teste, onde cada unidade de código (geralmente uma função ou método) é testada isoladamente. Esta atividade é realizada durante as etapas de desenvolvimento pelos próprios desenvolvedores.</p>\n\n<h4>Objetivos dos Testes Unitários</h4>\n\n<ul><li><strong>Identificar falhas em componentes individuais</strong> - Detectar problemas cedo</li><ol><li><strong>Garantir que cada função trabalha corretamente</strong> - Validação granular</li>\n<li><strong>Facilitar a detecção precoce de defeitos</strong> - Redução de custos</li>\n<li><strong>Documentar o código</strong> - Testes como especificação executável</li>\n<li><strong>Permitir refactoring seguro</strong> - Confiança ao modificar código</li>\n</ol>\n<h4>Exemplo Prático em Python (pytest)</h4>\n\n<pre><code>def calcular_desconto(valor_original, percentual):\n    \"\"\"Calcula o valor do desconto.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual deve estar entre 0 e 100\")\n    desconto = valor_original * (percentual / 100)\n    return valor_original - desconto\n\n<p>def test_calcular_desconto_10_porcento():<br>    assert calcular_desconto(100, 10) == 90</p>\n\n<p>def test_calcular_desconto_50_porcento():<br>    assert calcular_desconto(200, 50) == 100</p>\n\n<p>def test_calcular_desconto_invalido():<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 150)<br></code></pre></p>\n\n<h4>Frameworks Populares para Testes Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Framework</th><th>Características</th></tr>\n<tr><td>Java</td><td>JUnit 5, TestNG</td><td>Mais popular, extensível</td></tr>\n<tr><td>JavaScript</td><td>Jest, Mocha</td><td>Rápido, Mocking fácil</td></tr>\n<tr><td>Python</td><td>pytest, unittest</td><td>Sintaxe simples, fixtures</td></tr>\n<tr><td>C#</td><td>xUnit, NUnit</td><td>.NET ecosystem</td></tr>\n<tr><td>Go</td><td>testing (stdlib)</td><td>Simples, integrado</td></tr>\n</table></figure>\n\n<h4>Melhores Práticas para Testes Unitários</h4>\n\n<p>✅ <strong>Teste apenas uma coisa de cada vez</strong> - Um assert por teste é ideal  <br>✅ <strong>Nomes descritivos</strong> - <code>test_deve_retornar_erro_quando_usuario_invalido</code>  <br>✅ <strong>Independência</strong> - Testes não devem depender uns dos outros  <br>✅ <strong>Rapidez</strong> - Unit tests devem executar em milissegundos  <br>✅ <strong>Isolamento</strong> - Use mocks para dependências externas</p>\n\n<hr>\n<h3>Teste de Integração: Verificando Conexões</h3>\n\n<p>O teste de integração verifica a comunicação entre diferentes módulos ou componentes do sistema. Este tipo de teste é crucial para garantir que as partes do sistema funcionam corretamente quando combinadas.</p>\n\n<h4>Características Principais</h4>\n<ol><li><strong>Valida interfaces e interações entre componentes</strong> - Fluxo de dados correto</li>\n<li><strong>Identifica problemas de comunicação</strong> - API mismatches, protocolos</li>\n<li><strong>Pode ser realizado de forma incremental ou big-bang</strong> - Duas abordagens</li>\n<li><strong>Testa camadas de persistência</strong> - Bancos de dados, APIs externas</li>\n</ol>\n<h4>Estratégias de Integração</h4>\n\n<p>##### 1. Big-Bang Integration</p>\n\n<p>Todos os componentes são integrados simultaneamente e testados juntos.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Simples de implementar</li><br><li>Bom para sistemas pequenos</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Difícil localização de erros</li><br><li>Todos os módulos devem estar prontos</li><br></ol><br>##### 2. Incremental Integration (Bottom-Up)</p>\n\n<p>Começa pelos módulos mais baixos e集成 progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Defeitos fáceis de isolar</li><br><li>Feedback contínuo</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode ter módulos de alto nível sem testes até o final</li><br></ol><br>##### 3. Incremental Integration (Top-Down)</p>\n\n<p>Começa pelos módulos de mais alto nível e desce progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Interface do usuário testada primeiro</li><br><li>Protótipo funcional rápido</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Módulos de baixo nível simulados (stubs)</li><br></ol><br><h4>Exemplo de Teste de Integração (REST API)</h4></p>\n\n<pre><code>import requests\nimport pytest\n\n<p>class TestUserAPI:<br>    BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>def test_criar_usuario(self):<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"senha123\"<br>        }<br>        response = requests.post(f\"{self.BASE_URL}/usuarios\", json=payload)</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data</p>\n\n<p>def test_listar_usuarios(self):<br>        response = requests.get(f\"{self.BASE_URL}/usuarios\")</p>\n\n<p>assert response.status_code == 200<br>        assert isinstance(response.json(), list)<br></code></pre></p>\n\n<hr>\n<h3>Teste de Sistema: Visão Holística</h3>\n\n<p>O teste de sistema avalia o software como um todo, verificando se todos os componentes funcionam juntos para atender aos requisitos definidos.</p>\n\n<h4>O Que é Testado no Nível de Sistema?</h4>\n<ol><li><strong>Integração entre todos os módulos</strong></li>\n<li><strong>Fluxos de negócio completos</strong></li>\n<li><strong>Conformidade com requisitos funcionais</strong></li>\n<li><strong>Interface com sistemas externos</strong></li>\n<li><strong>Performance do sistema integrado</strong></li>\n<li><strong>Segurança end-to-end</strong></li>\n</ol>\n<h4>Exemplo: Fluxo de E-commerce</h4>\n\n<pre><code>Usuário → Login → Navegação → Carrinho → Checkout → Pagamento → Confirmação\n    ↓         ↓          ↓           ↓           ↓            ↓            ↓\n Cadastro   Session   Produtos    Estoque     Frete        Stripe     E-mail\n   ↕          ↕         ↕          ↕          ↕            ↕          ↕\n  DB        Redis     DB/API     DB         Correios      API       SMTP\n</code></pre>\n\n<p>Cada seta representa um ponto de integração que deve ser testado no nível de sistema.</p>\n\n<hr>\n<h3>Teste de Aceitação: Validando com o Cliente</h3>\n\n<p>O teste de aceitação determina se um produto ou sistema atende às expectativas e requisitos do cliente. Este é frequentemente o último nível de teste antes da entrega正式.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto certo?\"</strong></p>\n\n<h4>Tipos de Teste de Aceitação</h4>\n\n<p>##### 1. Teste de Aceitação do Usuário (UAT)</p>\n\n<p>Usuários finais testam o sistema em um ambiente semelhante ao de produção.</p>\n\n<p>##### 2. Teste de Aceitação Operacional (OAT)</p>\n\n<p>Equipe de operações validabackup, recuperação, relatórios.</p>\n\n<p>##### 3. Teste de Aceitação Contratual</p>\n\n<p>Verifica se o sistema atende aos critérios contratuais.</p>\n\n<h4>Características do UAT</h4>\n<ol><li>Geralmente envolve cooperação ou feedback do cliente</li>\n<li>Atividade de validação com dados reais</li>\n<li>Foco na usabilidade e fluxo de negócio</li>\n<li>Pode revelar requisitos mal entendidos</li>\n<li>Último checkpoint antes do go-live</li>\n</ol>\n<hr>\n<h3>Teste Funcional: Verificando Funcionalidades</h3>\n\n<p>O teste funcional determina se um recurso ou sistema funciona corretamente sem problemas. Verifica o sistema em diferentes níveis para garantir que todos os cenários são cobertos.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto da forma certa?\"</strong></p>\n\n<h4>Técnicas de Teste Funcional</h4>\n\n<p>##### 1. Teste Baseado em Requisitos<br><ol><li>Cada requisito tem casos de teste correspondentes</li><br><li>Rastreabilidade entre requisitos e testes</li><br><li>Cobertura completa</li><br></ol><br>##### 2. Teste Baseado em Casos de Uso<br><ol><li>Cenários de usuário documentados</li><br><li>Fluxos principais e alternativos</li><br><li>Pré-condições e pós-condições</li><br></ol><br>##### 3. Teste de Tabela de Decisão<br><ol><li>Combinações de condições e ações</li><br><li>Útil para regras de negócio complexas</li><br></ol><br>##### 4. Teste de Transição de Estado<br><ol><li>Mudanças de estado do sistema</li><br><li>Diagramas de estado</li><br></ol><br><hr><br><h2>Testes Não-Funcionais: Avaliando Qualidade Oculta</h2></p>\n\n<h3>Teste de Desempenho: Rapidez e Estabilidade</h3>\n\n<figure><img src=\"https://media.giphy.com/media/l0Iy69RBwNTRF0MXi/giphy.gif\" alt=\"Performance Testing - Testes de Desempenho\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de desempenho avalia a velocidade, responsividade e estabilidade do sistema sob carga de trabalho. É crítico para garantir que a aplicação atende aos SLAs (Service Level Agreements).</p>\n\n<h4>Subtipo 1: Teste de Carga (Load Testing)</h4>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas.</p>\n\n<p><strong>Métricas Coletadas:</strong><ol><li>Tempo de resposta (média, p95, p99)</li><br><li>Throughput (requisições por segundo)</li><br><li>Utilização de recursos (CPU, memória, disco)</li><br><li>Taxa de erros</li><br></ol><br><strong>Ferramentas Populares:</strong><ol><li>JMeter</li><br><li>Gatling</li><br><li>k6</li><br><li>Locust</li><br></ol><br><h4>Subtipo 2: Teste de Estresse (Stress Testing)</h4></p>\n\n<p>Avalia os limites do sistema além da capacidade normal para identificar o ponto de quebra.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar capacidade máxima</li><br><li>Verificar comportamento sob overload</li><br><li>Medir tempo de recuperação</li><br><li>Validar failovers</li><br></ol><br><h4>Subtipo 3: Teste de Resistência (Soak Testing)</h4></p>\n\n<p>Executa o sistema sob carga por períodos prolongados para identificar degradação gradual.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Conexões não fechadas</li><br><li>Acúmulo de logs</li><br><li>Degradação de performance</li><br></ol><br><h4>Subtipo 4: Teste de Pico (Spike Testing)</h4></p>\n\n<p>Avalia reações do sistema a picos súbitos de carga.</p>\n\n<p><strong>Cenário Exemplo:</strong><br><pre><code>Carga normal: 1000 usuários<br>Pico: 5000 usuários em 10 segundos<br>Recovery: Voltar para 1000 usuários<br></code></pre></p>\n\n<h4>Ferramentas de Teste de Desempenho</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>JMeter</strong></td><td>Open Source</td><td>Java</td><td>Enterprise, complexo</td></tr>\n<tr><td><strong>Gatling</strong></td><td>Open Source</td><td>Scala</td><td>DevOps, CI/CD</td></tr>\n<tr><td><strong>k6</strong></td><td>Open Source</td><td>JavaScript</td><td>Moderno, extensível</td></tr>\n<tr><td><strong>Locust</strong></td><td>Open Source</td><td>Python</td><td>Python teams</td></tr>\n<tr><td><strong>LoadRunner</strong></td><td>Comercial</td><td>Various</td><td>Enterprise</td></tr>\n</table></figure>\n\n<h4>Exemplo de Teste de Carga com k6</h4>\n\n<pre><code>// script.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },  // Ramp-up<br>    { duration: \'5m\', target: 100 },  // Steady state<br>    { duration: \'2m\', target: 200 },  // Spike<br>    { duration: \'5m\', target: 200 },  // Steady state<br>    { duration: \'2m\', target: 0 },    // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // Menos de 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/produtos\');<br>  check(res, {<br>    \'status é 200\': (r) =&gt; r.status === 200,<br>    \'tempo  r.timings.duration &lt; 500,<br>  });<br>  sleep(1);<br>}<br></code></pre></p>\n\n<hr>\n<h3>Teste de Segurança: Protegendo Dados e Sistemas</h3>\n\n<figure><img src=\"https://media.giphy.com/media/1qfDU4MJv3jWu34hEx/giphy.gif\" alt=\"Security Testing - Escudo de Segurança\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de segurança identifica vulnerabilidades e garante proteção de dados. Em um mundo cada vez mais digital, a segurança é prioridade.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n\n<p>##### 1. Teste de Penetração (Pen Test)</p>\n\n<p>Simula ataques para identificar vulnerabilidades antes que hackers maliciosos o façam.</p>\n\n<p><strong>Metodologias:</strong><ol><li>OWASP Testing Guide</li><br><li>PTES (Penetration Testing Execution Standard)</li><br><li>NIST SP 800-115</li><br></ol><br><strong>Tipos de Pentest:</strong><ol><li><strong>Black Box:</strong> Sem conhecimento prévio</li><br><li><strong>White Box:</strong> Código e documentação</li><br><li><strong>Gray Box:</strong> Conhecimento parcial</li><br></ol><br>##### 2. Varredura de Vulnerabilidade</p>\n\n<p>Identifica pontos fracos conhecidos através de scanning automatizado.</p>\n\n<p><strong>Ferramentas:</strong><ol><li>Nessus</li><br><li>OpenVAS</li><br><li>Qualys</li><br><li>Nexpose</li><br></ol><br>##### 3. Teste de Firewall e WAF</p>\n\n<p>Verifica configurações de segurança de firewalls e Web Application Firewalls.</p>\n\n<p><strong>O que testar:</strong><ol><li>Regras de firewall</li><br><li>Block de IPs maliciosos</li><br><li>Detecção de SQL Injection</li><br><li>Proteção XSS</li><br></ol><br>##### 4. Análise de Código Estático (SAST)</p>\n\n<p>Detecta vulnerabilidades no código-fonte sem executá-lo.</p>\n\n<p><strong>Ferramentas SAST:</strong><ol><li>SonarQube</li><br><li>Checkmarx</li><br><li>Fortify</li><br><li>Snyk Code</li><br></ol><br>##### 5. Análise de Componentes (SCA)</p>\n\n<p>Identifica vulnerabilidades em bibliotecas e dependências.</p>\n\n<p><strong>Ferramentas SCA:</strong><ol><li>Snyk</li><br><li>OWASP Dependency-Check</li><br><li>WhiteSource</li><br><li>Dependabot</li><br></ol><br><h4>OWASP Top 10: Vulnerabilidades Mais Comuns</h4><br><ol><li><strong>A01 - Broken Access Control</strong></li><br><li><strong>A02 - Cryptographic Failures</strong></li><br><li><strong>A03 - Injection</strong></li><br><li><strong>A04 - Insecure Design</strong></li><br><li><strong>A05 - Security Misconfiguration</strong></li><br><li><strong>A06 - Vulnerable Components</strong></li><br><li><strong>A07 - Authentication Failures</strong></li><br><li><strong>A08 - Software and Data Integrity Failures</strong></li><br><li><strong>A09 - Security Logging Failures</strong></li><br><li><strong>A10 - SSRF (Server-Side Request Forgery)</strong></li><br></ol><br><hr><br><h3>Teste de Usabilidade: Experiência do Usuário</h3></p>\n\n<p>Avalia a facilidade de uso e a experiência do usuário com o sistema. O teste de usabilidade é essencial para garantir que os usuários consigam realizar suas tarefas de forma eficiente.</p>\n\n<h4>Critérios de Usabilidade</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Critério</th><th>Definição</th><th>Métrica</th></tr>\n<tr><td><strong>Eficácia</strong></td><td>Usuário consegue completar tarefa?</td><td>Taxa de sucesso</td></tr>\n<tr><td><strong>Eficiência</strong></td><td>Quanto tempo leva?</td><td>Tempo de tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Usuário gostou?</td><td>Questionários SUS</td></tr>\n<tr><td><strong>Aprendizagem</strong></td><td>Quanto tempo para aprender?</td><td>Tempo até proficiência</td></tr>\n<tr><td><strong>Memorização</strong></td><td>Lembra como usar?</td><td>Retenção após pausa</td></tr>\n</table></figure>\n\n<h4>Métodos de Teste de Usabilidade</h4>\n<ol><li><strong>Testes com Usuários</strong> - Sessões gravadas com participantes</li>\n<li><strong>Análise Heurística</strong> - Avaliação por especialistas</li>\n<li><strong>Questionários</strong> - SUS, SEQ, NPS</li>\n<li><strong>Eye Tracking</strong> - Rastreamento ocular</li>\n<li><strong>Análise de Tarefas</strong> - Tempos e erros</li>\n</ol>\n<h4>Frameworks de Avaliação</h4>\n<ol><li><strong>Nielsen\'s Heurísticas</strong> (10 princípios)</li>\n<li><strong>ISO 9241-11</strong> (Usabilidade)</li>\n<li><strong>WCAG 2.1</strong> (Acessibilidade)</li>\n</ol>\n<hr>\n<h3>Teste de Compatibilidade: Funciona em Todo Lugar?</h3>\n\n<p>Verifica se o software funciona em diferentes ambientes, navegadores e dispositivos.</p>\n\n<h4>Tipos de Teste de Compatibilidade</h4>\n\n<p>##### 1. Teste de Navegador (Cross-Browser)<br><ol><li>Chrome, Firefox, Safari, Edge</li><br><li>Diferentes versões</li><br><li>Modos de compatibilidade</li><br></ol><br>##### 2. Teste Mobile<br><ol><li>iOS (iPhone, iPad)</li><br><li>Android (diferentes fabricantes)</li><br><li>Diferentes tamanhos de tela</li><br><li>Diferentes versões de OS</li><br></ol><br>##### 3. Teste de Sistema Operacional<br><ol><li>Windows 10, 11</li><br><li>macOS (versões diferentes)</li><br><li>Linux (distribuições populares)</li><br></ol><br>##### 4. Teste de Hardware<br><ol><li>Diferentes processadores</li><br><li>Diferentes quantidades de RAM</li><br><li>Diferentes resoluções de tela</li><br></ol><br><h4>Ferramentas de Teste Cross-Browser</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Cobertura</th><th>Preço</th></tr>\n<tr><td>BrowserStack</td><td>3000+ dispositivos</td><td>$29+/mês</td></tr>\n<tr><td>Sauce Labs</td><td>1000+ dispositivos</td><td>$39+/mês</td></tr>\n<tr><td>LambdaTest</td><td>3000+ dispositivos</td><td>$15+/mês</td></tr>\n<tr><td>CrossBrowserTesting</td><td>1500+ dispositivos</td><td>$29+/mês</td></tr>\n</table></figure>\n\n<hr>\n<h3>Teste de Recuperação: Resistência a Falhas</h3>\n\n<p>Avalia a capacidade do sistema de se recuperar de falhas e disasters. É crucial para sistemas críticos que não podem ficar fora do ar.</p>\n\n<h4>Cenários de Teste</h4>\n<ol><li><strong>Falha de Hardware</strong></li>\n</ol>   - Perda de disco\n   - Falha de memória\n   - Queda de servidor\n<ol><li><strong>Falha de Software</strong></li>\n</ol>   - Crash de aplicação\n   - Deadlock\n   - Exceções não tratadas\n<ol><li><strong>Falha de Rede</strong></li>\n</ol>   - Perda de conectividade\n   - Alta latência\n   - Timeout\n<ol><li><strong>Desastres</strong></li>\n</ol>   - Perda de datacenter\n   - Corrupção de dados\n   - Ataques DDoS\n\n<h4>Métricas de Recuperação</h4>\n<ol><li><strong>RTO (Recovery Time Objective):</strong> Tempo máximo para recuperação</li>\n<li><strong>RPO (Recovery Point Objective):</strong> Perda máxima de dados aceitável</li>\n<li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li>\n<li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li>\n</ol>\n<hr>\n<h2>Testes de Regressão: Mantendo a Qualidade</h2>\n\n<p>Executados sempre que o código é modificado para garantir que alterações não introduzam novos defeitos. Este é um dos tipos de teste mais importantes e frequentemente executados.</p>\n\n<h3>Quando Executar Testes de Regressão</h3>\n\n<p>✅ Após cada release de software  <br>✅ Após correção de bugs  <br>✅ Após atualizações de dependências  <br>✅ Após refactoring de código  <br>✅ Antes do deploy de produção</p>\n\n<h3>Estratégias de Testes de Regressão</h3>\n\n<h4>1. Regressão Completa</h4>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura total</li><br><li>Alta confiança</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Tempo longo</li><br><li>Custo elevado</li><br></ol><br><h4>2. Regressão Seletiva</h4></p>\n\n<p>Seleciona testes relevantes baseados em mudanças.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Mais rápido</li><br><li>Mais econômico</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode perder cobertura</li><br></ol><br><h4>3. Regressão Prioritária</h4></p>\n\n<p>Executa testes por prioridade (críticos &gt; altos &gt; médios &gt; baixos).</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura do crítico rápido</li><br><li>Decisões baseadas em risco</li><br></ol><br><h3>Automação de Testes de Regressão</h3></p>\n\n<p>A automação é essencial para testes de regressão eficazes:</p>\n\n<p><strong>Benefícios:</strong><ol><li>Execução frequente</li><br><li>Resultados consistentes</li><br><li>Rapidez</li><br><li>Cobertura ampla</li><br></ol><br><strong>Ferramentas Recomendadas:</strong><ol><li>Selenium WebDriver</li><br><li>Playwright</li><br><li>Cypress</li><br><li>Appium (mobile)</li><br><li>RestAssured (API)</li><br></ol><br><hr><br><h2>Pirâmide de Testes: Arquitetura Ideal</h2></p>\n\n<p>A pirâmide de testes é um conceito fundamental que guia a distribuição dos tipos de teste:</p>\n\n<pre><code>                    /\n                   /  \n                  / E2E        ← Poucos testes E2E (lentos, caros)\n                 /      \n                /Integração   ← Alguns testes de integração\n               /            \n              /  Unitários     ← Muitos testes unitários (rápidos, baratos)\n             /________________\n</code></pre>\n\n<h3>Proporções Ideais</h3>\n<ol><li><strong>Unitários:</strong> 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>Integração:</strong> 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>E2E:</strong> 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Compreender os diferentes tipos de testes de software é fundamental para construir uma estratégia de QA eficaz. Cada tipo de teste tem seu propósito específico e deve ser aplicado no momento adequado do ciclo de desenvolvimento.</p>\n\n<p><strong>Resumo dos Tipos de Testes:</strong></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Categoria</th><th>Tipo</th><th>Quando Usar</th><th>Objetivo</th></tr>\n<tr><td><strong>Funcional</strong></td><td>Unitário</td><td>Desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Integração</td><td>Pós-unitário</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Sistema</td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Aceitação</td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Performance</td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Segurança</td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Usabilidade</td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n</table></figure>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem todo projeto precisa de todos os tipos</li><br><li><strong>Priorize</strong> - Comece com unitários e integração</li><br><li><strong>Automatize</strong> - Regressão deve ser automática</li><br><li><strong>Meça</strong> - Cobertura, tempo, defeitos encontrados</li><br><li><strong>Melhore</strong> - Itere constantemente</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre Tipos de Testes</h3></p>\n\n<p><strong>P: Quantos tipos de testes existem?</strong>  <br>R: Existem dozens de tipos de testes classificados de diferentes formas. Os principais são funcionais e não-funcionais, cada um com subtipos específicos.</p>\n\n<p><strong>P: Qual a diferença entre teste de sistema e teste de aceitação?</strong>  <br>R: Teste de sistema verifica se o sistema atende aos requisitos técnicos. Teste de aceitação verifica se o sistema atende às expectativas do usuário/cliente.</p>\n\n<p><strong>P: Testes manuais podem ser substituídos por automatizados?</strong>  <br>R: Não completamente. Testes manuais são essenciais para exploratory testing, UX e cenários complexos. A automação complementa, não substitui.</p>\n\n<p><strong>P: Quando devo começar a testar?</strong>  <br>R: O mais cedo possível! O conceito de Shift-Left recomenda testes desde as primeiras fases do desenvolvimento.</p>\n\n<p><strong>P: Qual a ordem ideal de execução dos testes?</strong>  <br>R: Unitários → Integração → Sistema → Aceitação. Cada nível depende do anterior.</p>\n\n<hr>\n<em>Fonte: Selenium.dev, Atlassian, Vericode, ISTQB, OWASP</em>', 'Tipos de Testes de Software: Guia Completo com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '179-revision-v1', '', '', '2026-07-06 22:52:44', '2026-07-07 01:52:44', '', '179', 'http://localhost:8082/ideiasti/?p=465', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('466', '0', '2026-07-06 22:52:48', '2026-07-07 01:52:48', '', 'giphy-9', '', 'inherit', 'open', 'closed', '', 'giphy-9', '', '', '2026-07-06 22:52:48', '2026-07-07 01:52:48', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-9.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('467', '0', '2026-07-06 22:52:48', '2026-07-07 01:52:48', '<p><strong>Meta Description:</strong> Descubra como a Inteligência Artificial está revolucionando a QA: automação inteligente, geração de testes, detecção de anomalias e manutenção preditiva. Guia completo para profissionais.</p>\n\n<hr>\n<h2>Estado Atual da IA em QA</h2>\n\n<p>O <strong>World Quality Report 2025</strong> revela dados impressionantes: quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão ativamente buscando GenAI</strong> em práticas de Quality Engineering (QE), mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} alcançaram implementação em escala empresarial.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-9.gif\" alt=\"AI Brain - Inteligência Artificial em QA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Esta lacuna entre interesse e implementação representa uma oportunidade significativa para profissionais e organizações que souberem aproveitar efetivamente essas tecnologias.</p>\n\n<hr>\n<h2>Por Que a Adoção de IA em QA Está Crescendo?</h2>\n\n<h3>Drivers de Adoção</h3>\n<ol><li><strong>Volume de testes crescente</strong> - Sistemas mais complexos exigem mais testes</li>\n<li><strong>Pressure de velocidade</strong> - CI/CD demanda execuções mais rápidas</li>\n<li><strong>Escassez de profissionais</strong> - Demanda supera oferta de testadores</li>\n<li><strong>Qualidade em produção</strong> - Necessidade de monitoramento contínuo</li>\n<li><strong>Custos crescentes</strong> - Automação inteligente reduz despesas</li>\n</ol>\n<h3>Benefícios Comprovados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Impacto da IA</th></tr>\n<tr><td>Redução de tempo de teste</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de custos de QA</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Melhoria em cobertura</td><td>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Detecção precoce de bugs</td><td>3-5x mais cedo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Desafios de Adoção de IA em QA</h2>\n\n<h3>1. Desalinhamento Estratégico</h3>\n\n<p>Existe um hiato crescente entre o interesse organizacional em GenAI e a prontidão real para adoção efetiva dentro de QE. O caminho da experimentação para implementação é mais complexo do que o antecipado.</p>\n\n<h4>Sinais de Desalinhamento</h4>\n\n<ul><li>GenAI vista como \"solução mágica\" sem estratégia clara</li><ol><li>Falta de alinhamento entre TI e negócios</li>\n<li>Expectativas irreais sobre capacidades</li>\n<li>Subestimação de esforço de integração</li>\n</ol>\n<h3>2. Complexidade de Implementação</h3>\n\n<p>A implementação de IA em QA requer alinhamento entre inovação operacional e oversight estratégico. Desafios incluem:</p>\n\n<h4>Desafios Técnicos</h4>\n<ol><li>Integração com sistemas legados</li>\n<li>Qualidade dos dados de treinamento</li>\n<li>Escolha de modelos adequados</li>\n<li>Manutenção de modelos em produção</li>\n</ol>\n<h4>Desafios Organizacionais</h4>\n<ol><li>Resistência cultural</li>\n<li>Falta de competências</li>\n<li>Processos não adaptados</li>\n<li>Governança de IA</li>\n</ol>\n<h3>3. Questões Éticas e de Governança</h3>\n<ol><li>Viés em modelos de IA</li>\n<li>Transparência nas decisões</li>\n<li>Responsabilidade por falhas</li>\n<li>Conformidade regulatória</li>\n</ol>\n<hr>\n<h2>Aplicações de IA em QA: Casos de Uso Detalhados</h2>\n\n<h3>1. Geração Automatizada de Testes</h3>\n\n<p>IA pode gerar casos de teste automaticamente baseados em requisitos e código. Esta é uma das aplicações mais promissoras.</p>\n\n<figure><img src=\"https://media.giphy.com/media/VbZ0cWw6cVPMM/giphy.gif\" alt=\"Automação de Testes com IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Requisitos → Análise de NLP → Cenários de Teste → Casos de Teste\n    ↓                                                        ↓\n Código → Análise Estática → Cobertura → Testes Sugeridos\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de unit tests</td><td>Diffblue</td></tr>\n<tr><td><strong>Testim</strong></td><td>Testes E2E com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>Automação sem código com IA</td><td>Avo Automation</td></tr>\n</table></figure>\n\n<h4>Exemplo: Geração de Testes com GenAI</h4>\n\n<pre><code># Exemplo conceitual de como IA pode gerar testes\nimport openai\n\n<p>def gerar_testes_para_requisito(requisito):<br>    prompt = f\"\"\"<br>    Gere casos de teste para o seguinte requisito:</p>\n\n<p>Requisito: {requisito}</p>\n\n<p>Formato de saída (JSON):<br>    {{<br>        \"casos_de_teste\": [<br>            {{<br>                \"id\": \"CT-001\",<br>                \"titulo\": \"...\",<br>                \"pre_condicoes\": [...],<br>                \"passos\": [...],<br>                \"dados_teste\": {{...}},<br>                \"resultado_esperado\": \"...\"<br>            }}<br>        ]<br>    }}<br>    \"\"\"</p>\n\n<p>response = openai.chat.completions.create(<br>        model=\"gpt-4\",<br>        messages=[{\"role\": \"user\", \"content\": prompt}]<br>    )</p>\n\n<p>return json.loads(response.choices[0].message.content)<br></code></pre></p>\n\n<h3>2. Detecção de Anomalias</h3>\n\n<p>Algoritmos de machine learning identificam padrões incomuns que indicam defeitos, revolucionando o monitoramento de qualidade.</p>\n\n<h4>Técnicas Utilizadas</h4>\n\n<p>##### Análise de Séries Temporais<br><ol><li>Identificação de anomalias em métricas de performance</li><br><li>Detecção de degradação gradual</li><br><li>Alertas proativos sobre problemas</li><br></ol><br>##### Clustering<br><ol><li>Agrupamento de testes similares</li><br><li>Identificação de testes atípicos</li><br><li>Detecção de padrões de falha</li><br></ol><br>##### Redes Neurais<br><ol><li>Detecção de padrões complexos</li><br><li>Aprendizado de comportamentos normais</li><br><li>Previsão de falhas</li><br></ol><br><h4>Ferramentas de Detecção de Anomalias</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Aplicação</th></tr>\n<tr><td><strong>Elastic APM</strong></td><td>APM</td><td>Detecção de anomalias em produção</td></tr>\n<tr><td><strong>Datadog</strong></td><td>Monitoring</td><td>ML para métricas</td></tr>\n<tr><td><strong>New Relic</strong></td><td>APM</td><td>Detecção inteligente</td></tr>\n<tr><td><strong>Grafana + Loki</strong></td><td>Logging</td><td>Análise de logs com ML</td></tr>\n</table></figure>\n\n<h3>3. Manutenção Inteligente de Testes</h3>\n\n<p>IA ajuda a identificar e remover testes obsoletos ou flaky, mantendo a suite de testes saudável.</p>\n\n<h4>Problemas que a IA Resolve</h4>\n\n<p><strong>Testes Flaky (Instáveis)</strong><br><ol><li>Identificação de padrões que causam instabilidade</li><br><li>Predição de quais testes podem falhar</li><br><li>Sugestões de correções</li><br><li>Quarentena automática</li><br></ol><br><strong>Testes Obsoletos</strong><br><ol><li>Detecção de funcionalidades removidas</li><br><li>Identificação de código não coberto</li><br><li>Sugestões de remoção segura</li><br></ol><br><h4>Exemplo de Detecção de Testes Flaky</h4></p>\n\n<pre><code># Sistema simplificado de detecção de testes flaky\nclass FlakyTestDetector:\n    def __init__(self):\n        self.test_history = {}\n        self.ml_model = load_trained_model()\n\n<p>def analyze_test(self, test_name, execution_history):<br>        features = self.extract_features(execution_history)<br>        flaky_probability = self.ml_model.predict_proba([features])[0]</p>\n\n<p>if flaky_probability &gt; 0.7:<br>            return {<br>                \"test\": test_name,<br>                \"flaky_probability\": flaky_probability,<br>                \"recommendation\": \"QUARANTINE\",<br>                \"reasons\": self.explain_prediction(features)<br>            }<br>        return {\"test\": test_name, \"flaky_probability\": flaky_probability}</p>\n\n<p>def extract_features(self, history):<br>        return [<br>            history.success_rate,<br>            history.avg_duration,<br>            history.recent_failures,<br>            history.environment_changes,<br>            history.dependency_changes<br>        ]<br></code></pre></p>\n\n<h3>4. Análise de Código Estático com IA</h3>\n\n<p>Identifica potenciais problemas de qualidade antes da execução, usando análise semântica avançada.</p>\n\n<h4>Capacidades Avançadas</h4>\n<ol><li><strong>Detecção de vulnerabilidades</strong> - OWASP Top 10</li>\n<li><strong>Análise de dependências</strong> - Bibliotecas desatualizadas</li>\n<li><strong>Code smells</strong> - Padrões problemáticos</li>\n<li><strong>Débito técnico</strong> - Métricas de qualidade</li>\n</ol>\n<h4>Ferramentas com IA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Capacidades IA</th><th>Integração</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Débito técnico, code smells</td><td>CI/CD</td></tr>\n<tr><td><strong>Snyk</strong></td><td>Vulnerabilidades, licenças</td><td>IDE, CI</td></tr>\n<tr><td><strong>CodeClimate</strong></td><td>Quality, maintainability</td><td>GitHub</td></tr>\n<tr><td><strong>DeepSource</strong></td><td>Análise estática com ML</td><td>Git</td></tr>\n</table></figure>\n\n<h3>5. Testes Visuais Automatizados</h3>\n\n<p>Comparação de interfaces visuais usando visão computacional para detectar regressões.</p>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Página Capturada → Modelo de Visão Computacional → Comparação com Baseline\n     ↓                          ↓                                    ↓\n  Screenshots           Detecção de Elementos           Diff Visual\n                                            ↓\n                                    Alertas de Regressão\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tecnologia</th><th>Diferencial</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Visual AI</td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de precisão</td></tr>\n<tr><td><strong> Percy</strong></td><td>Visual testing</td><td>Integração simples</td></tr>\n<tr><td><strong>Chromatic</strong></td><td>Visual regression</td><td>Para Storybook</td></tr>\n<tr><td><strong>Lost Pixel</strong></td><td>Open source</td><td>Self-hosted</td></tr>\n</table></figure>\n\n<h3>6. Oráculos de Teste Baseados em IA</h3>\n\n<p>Validação de resultados usando modelos treinados para determinar se o comportamento está correto.</p>\n\n<h4>Tipos de Oráculos</h4>\n<ol><li><strong>Oráculo de Imagem</strong> - Validação visual de UI</li>\n<li><strong>Oráculo de Texto</strong> - Análise de conteúdo</li>\n<li><strong>Oráculo de Comportamento</strong> - Detecção de anomalias</li>\n<li><strong>Oráculo de Dados</strong> - Validação de datasets</li>\n</ol>\n<hr>\n<h2>Ferramentas de IA para QA: Comparativo</h2>\n\n<h3>Plataformas Completas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Testim</strong></td><td>Automação inteligente E2E</td><td>$600+/mês</td><td>Equipes enterprise</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Automação com ML</td><td>Sob consulta</td><td>Escala enterprise</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>$500+/mês</td><td>CI/CD integrado</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>No-code com IA</td><td>Sob consulta</td><td>Enterprise</td></tr>\n<tr><td><strong>Perfecto</strong></td><td>Testes mobile/web com IA</td><td>Sob consulta</td><td>Mobile testing</td></tr>\n</table></figure>\n\n<h3>Ferramentas Especializadas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais</td><td>$100+/mês</td><td>UI testing</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Unit tests</td><td>$299/assinante</td><td>Dev teams</td></tr>\n<tr><td><strong>Snyk</strong></td><td>SCA</td><td>Grátis + Pro</td><td>Developers</td></tr>\n<tr><td><strong>SonarCloud</strong></td><td>SAST</td><td>Grátis + Pro</td><td>CI/CD</td></tr>\n</table></figure>\n\n<h3>Ferramentas Emerging (2025-2026)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Status</th></tr>\n<tr><td><strong>CodiumAI</strong></td><td>Testes gerados automaticamente</td><td>Beta</td></tr>\n<tr><td><strong>Mutable AI</strong></td><td>Code review + tests</td><td>Beta</td></tr>\n<tr><td><strong>Dagger</strong></td><td>CI/CD programável</td><td>GA</td></tr>\n<tr><td><strong>Trunk</strong></td><td>Linting inteligente</td><td>GA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando IA em QA: Roadmap Prático</h2>\n\n<h3>Fase 1: Avaliação e Planejamento (1-2 meses)</h3>\n\n<h4>Checklist de Avaliação</h4>\n<ol><li>[ ] Mapeamento de processos atuais de QA</li>\n<li>[ ] Identificação de pontos de dor</li>\n<li>[ ] Análise de ROI potencial</li>\n<li>[ ] Avaliação de maturidade tecnológica</li>\n<li>[ ] Levantamento de stakeholders</li>\n</ol>\n<h4>Métricas de Baseline</h4>\n\n<p>Antes de implementar, estabeleça métricas de referência:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Ferramenta</th></tr>\n<tr><td>Tempo de teste</td><td>Duração de suite</td><td>CI/CD logs</td></tr>\n<tr><td>Cobertura de teste</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>Coverage tools</td></tr>\n<tr><td>Taxa de defeitos</td><td>Bugs em produção</td><td>Bug tracker</td></tr>\n<tr><td>Testes flaky</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas instáveis</td><td>CI/CD</td></tr>\n<tr><td>Custo de QA</td><td>$/teste executado</td><td>Financeiro</td></tr>\n</table></figure>\n\n<h3>Fase 2: Pilot (2-3 meses)</h3>\n\n<h4>Escolha do Piloto</h4>\n\n<p>Selecione um projeto ou área com:<br><ol><li>✅ Escopo controlado</li><br><li>✅ Equipe aberta a inovação</li><br><li>✅ Processos definidos</li><br><li>✅ Métricas disponíveis</li><br></ol><br><h4>Pilotos Recomendados</h4><br><ol><li><strong>Geração de unit tests</strong> - Diffblue, CodiumAI</li><br><li><strong>Testes visuais</strong> - Applitools</li><br><li><strong>Detecção de flaky tests</strong> - Ferramentas de CI</li><br><li><strong>Análise estática</strong> - SonarQube, Snyk</li><br></ol><br><h3>Fase 3: Expansão (3-6 meses)</h3></p>\n\n<h4>Escalar Sucesso</h4>\n<ol><li>Documente aprendizados</li>\n<li>Treine outras equipes</li>\n<li>Padronize processos</li>\n<li>Melhore integrações</li>\n</ol>\n<h4>KPIs de Sucesso</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Meta (6 meses)</th></tr>\n<tr><td>Redução de tempo de teste</td><td>30-40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Aumento de cobertura</td><td>20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de defeitos em prod</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>ROI positivo</td><td>Sim</td></tr>\n</table></figure>\n\n<h3>Fase 4: Maturidade (6-12 meses)</h3>\n\n<h4>Implementação Enterprise</h4>\n<ol><li>Integração completa com CI/CD</li>\n<li>IA em produção (monitoramento)</li>\n<li>Maintenance automatizado</li>\n<li>Reporting avançado</li>\n</ol>\n<hr>\n<h2>Futuro da IA em QA: Tendências 2026-2028</h2>\n\n<h3>1. Testes Autônomos</h3>\n\n<p>Sistemas que automaticamente:<br><ol><li>Geram testes baseados em requisitos</li><br><li>Executam testes continuamente</li><br><li>Detectam e reportam falhas</li><br><li>Propõem correções</li><br></ol><br><h3>2. Manutenção Preditiva</h3></p>\n\n<p>IA que prevê:<br><ol><li>Quando testes vão falhar</li><br><li>Quando código precisa de mais testes</li><br><li>Quando componentes estão em risco</li><br><li>Quando fazer refactoring</li><br></ol><br><h3>3. GenAI Nativa em QA</h3></p>\n\n<p>Modelos treinados especificamente para:<br><ol><li>Entender código e testes</li><br><li>Gerar código de teste</li><br><li>Analisar requisitos</li><br><li>Documentar testes</li><br></ol><br><h3>4. Testes em Produção com IA</h3></p>\n\n<p>Monitoramento inteligente:<br><ol><li>Detecção de anomalias em produção</li><br><li>Geração automática de testes de regressão</li><br><li>Validação de deployments</li><br><li>Root cause analysis</li><br></ol><br><hr><br><h2>Considerações Éticas e Best Practices</h2></p>\n\n<h3>Governança de IA em QA</h3>\n\n<h4>Princípios</h4>\n<ol><li><strong>Transparência</strong> - Documente como a IA toma decisões</li>\n<li><strong>Responsabilidade</strong> - Humanos mantêm responsabilidade final</li>\n<li><strong>Fairness</strong> - Evite viés em modelos</li>\n<li><strong>Privacidade</strong> - Proteja dados sensíveis</li>\n<li><strong>Segurança</strong> - Proteja modelos contra ataques</li>\n</ol>\n<h4>Checklist de Governança</h4>\n<ol><li>[ ] Política de uso de IA em QA documentada</li>\n<li>[ ] Processos de revisão de decisões de IA</li>\n<li>[ ] Documentação de modelos utilizados</li>\n<li>[ ] Plano de contingência para falhas de IA</li>\n<li>[ ] Treinamento de equipe em uso responsável</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A IA está transformando fundamentalmente a QA, oferecendo oportunidades sem precedentes para aumentar eficiência, cobertura e qualidade. Embora a adoção em escala ainda seja um desafio, organizações que investem estrategicamente em IA para QA estão obtendo vantagens competitivas significativas.</p>\n\n<p><strong>Resumo dos Principais Aprendizados:</strong></p>\n\n<p>✅ IA pode reduzir tempo de teste em 40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}  <br>✅ GenAI está sendo buscada por 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações, mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram em escala  <br>✅ Ferramentas como Playwright, Applitools e Testim estão liderando a adoção  <br>✅ Implementação requer estratégia, não apenas ferramentas  <br>✅ Futuro aponta para testes autônomos e manutenção preditiva</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem toda organização precisa de todas as capacidades</li><br><li><strong>Comece pequeno</strong> - Pilotos controlados são mais eficazes</li><br><li><strong>Meça resultados</strong> - Métricas são essenciais</li><br><li><strong>Treine sua equipe</strong> - Competências em IA são necessárias</li><br><li><strong>Governarize</strong> - Adote práticas éticas desde o início</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre IA em QA</h3></p>\n\n<p><strong>P: A IA vai substituir testadores humanos?</strong>  <br>R: Não. A IA complementa o trabalho humano, permitindo que testadores foquem em atividades estratégicas, exploratory testing e design de testes.</p>\n\n<p><strong>P: Qual é o ROI da implementação de IA em QA?</strong>  <br>R: O ROI típico é de 200-500{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em 12-18 meses, considerando redução de tempo de teste, aumento de cobertura e redução de defeitos em produção.</p>\n\n<p><strong>P: Preciso de especialistas em dados para implementar IA em QA?</strong>  <br>R: Não necessariamente. Muitas ferramentas são \"plug-and-play\" e não requerem conhecimento de ML. No entanto, para implementações avançadas, especialistas são úteis.</p>\n\n<p><strong>P: Quais são os principais riscos do uso de IA em QA?</strong>  <br>R: Os principais riscos incluem: dependência excessiva, viés em modelos, falta de transparência e custos inesperados de manutenção.</p>\n\n<p><strong>P: Quando devo começar a usar IA em QA?</strong>  <br>R: Se você tem mais de 100 testes automatizados ou gastando mais de 20 horas/semana em QA, é um bom momento para avaliar ferramentas de IA.</p>\n\n<hr>\n<em>Fonte: World Quality Report 2025, Software Testing Magazine, Gartner Research, IEEE Software</em>', 'Inteligência Artificial em Quality Assurance: Guia Completo para 2025-2026', '', 'inherit', 'closed', 'closed', '', '181-revision-v1', '', '', '2026-07-06 22:52:48', '2026-07-07 01:52:48', '', '181', 'http://localhost:8082/ideiasti/?p=467', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('468', '0', '2026-07-06 22:55:46', '2026-07-07 01:55:46', '<h2>Introdução</h2>\n\n<p>O <strong>Blog QA Brasil</strong> valoriza sua privacidade. Esta Política de Privacidade descreve como coletamos, usamos, armazenamos e protegemos seus dados pessoais quando você utiliza nosso site, em conformidade com a <strong>Lei Geral de Proteção de Dados (LGPD - Lei nº 13.709/2018)</strong>.</p>\n\n<p>Última atualização: Julho de 2026</p>\n\n<hr>\n<h2>1. Dados que Coletamos</h2>\n\n<h3>1.1 Dados Fornecidos por Você</h3>\n\n<ul><li><strong>Comentários</strong> — Nome, e-mail e conteúdo do comentário</li><ol><li><strong>Newsletter</strong> — Nome e e-mail</li>\n<li><strong>Contato</strong> — Informações enviadas via formulários</li>\n<li><strong>Inscrições</strong> — Dados fornecidos ao se cadastrar em recursos</li>\n</ol>\n<h3>1.2 Dados Coletados Automaticamente</h3>\n<ol><li><strong>Cookies</strong> — Preferências de navegação e consentimento</li>\n<li><strong>Analytics</strong> — Páginas visitadas, tempo de navegação, origem do tráfego</li>\n<li><strong>Endereço IP</strong> — Coletado anonimamente para segurança e analytics</li>\n<li><strong>Navegador e dispositivo</strong> — Informações técnicas sobre sua visita</li>\n</ol>\n<hr>\n<h2>2. Como Usamos Seus Dados</h2>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Finalidade</th><th>Base Legal (LGPD)</th></tr>\n<tr><td>Publicar comentários</td><td>Consentimento</td></tr>\n<tr><td>Enviar newsletter</td><td>Consentimento</td></tr>\n<tr><td>Melhorar o conteúdo</td><td>Interesse legítimo</td></tr>\n<tr><td>Segurança do site</td><td>Interesse legítimo</td></tr>\n<tr><td>Cumprir obrigações legais</td><td>Obrigação legal</td></tr>\n</table></figure>\n\n<hr>\n<h2>3. Cookies</h2>\n\n<h3>3.1 O Que São Cookies</h3>\n\n<p>Cookies são pequenos arquivos armazenados no seu navegador que nos ajudam a melhorar sua experiência de navegação.</p>\n\n<h3>3.2 Tipos de Cookies</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo</th><th>Finalidade</th><th>Armazenamento</th></tr>\n<tr><td><strong>Essenciais</strong></td><td>Funcionamento básico do site</td><td>Sessão</td></tr>\n<tr><td><strong>Funcionais</strong></td><td>Preferências do usuário</td><td>1 ano</td></tr>\n<tr><td><strong>Analíticos</strong></td><td>Métricas de uso</td><td>2 anos</td></tr>\n<tr><td><strong>Marketing</strong></td><td>Conteúdo relevante</td><td>2 anos</td></tr>\n</table></figure>\n\n<h3>3.3 Gerenciamento</h3>\n\n<p>Você pode controlar os cookies através das configurações do seu navegador ou através do nosso painel de preferências disponível no site.</p>\n\n<hr>\n<h2>4. Compartilhamento de Dados</h2>\n\n<h3>4.1 Com Quem Compartilhamos</h3>\n<ol><li><strong>Google Analytics</strong> — Métricas de audiência (anonimizadas)</li>\n<li><strong>Provedor de E-mail</strong> — Newsletter (apenas e-mail)</li>\n<li><strong>Autoridades legais</strong> — Quando exigido por lei</li>\n</ol>\n<h3>4.2 Compromisso</h3>\n\n<p><strong>Não vendemos</strong> seus dados pessoais para terceiros. <strong>Não compartilhamos</strong> dados além do necessário para os serviços descritos.</p>\n\n<hr>\n<h2>5. Seus Direitos (LGPD)</h2>\n\n<p>De acordo com a LGPD, você tem direito a:<br><ol><li><strong>Confirmação</strong> da existência de tratamento de dados</li><br><li><strong>Acesso</strong> aos seus dados pessoais</li><br><li><strong>Correção</strong> de dados incompletos ou incorretos</li><br><li><strong>Exclusão</strong> de dados tratados com consentimento</li><br><li><strong>Portabilidade</strong> dos dados</li><br><li><strong>Revogação</strong> do consentimento a qualquer momento</li><br></ol><br>Para exercer seus direitos, entre em contato pelo e-mail abaixo.</p>\n\n<hr>\n<h2>6. Armazenamento e Segurança</h2>\n\n<h3>6.1 Medidas de Segurança</h3>\n<ol><li>Criptografia SSL/TLS nas comunicações</li>\n<li>Acesso restrito a dados pessoais</li>\n<li>Revisões periódicas de segurança</li></ol></ul>\n\n<h3>6.2 Período de Armazenamento</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Tipo de Dado</th><th>Período</th></tr>\n<tr><td>Comentários</td><td>Indeterminado (até solicitação de exclusão)</td></tr>\n<tr><td>Newsletter</td><td>Até descadastro</td></tr>\n<tr><td>Analytics</td><td>Anonimizado após 24 meses</td></tr>\n<tr><td>Logs de servidor</td><td>6 meses</td></tr>\n</table></figure>\n\n<hr>\n<h2>7. Direitos de Imagem</h2>\n\n<h3>7.1 Imagens do Site</h3>\n\n<p>Utilizamos imagens de fontes como <strong>Unsplash, Giphy e Pexels</strong> sob licenças permissivas. Quando aplicável, creditamos os autores.</p>\n\n<h3>7.2 Conteúdo do Usuário</h3>\n\n<p>Ao enviar comentários com imagens ou links, você é responsável pelo conteúdo enviado.</p>\n\n<hr>\n<h2>8. Alterações nesta Política</h2>\n\n<p>Reservamo-nos o direito de atualizar esta política a qualquer momento:<br><ol><li>Publicaremos a versão atualizada nesta página</li><br><li>Atualizaremos a data de \"Última atualização\"</li><br><li>Mudanças significativas serão notificadas via newsletter (quando aplicável)</li><br></ol><br><hr><br><h2>9. Contato</h2></p>\n\n<p>Para questões sobre privacidade e proteção de dados:</p>\n\n<p><strong>Blog Ideiasti</strong><br>E-mail: pcyasuic@outlook.com</p>\n\n<hr>\n<em>Esta Política de Privacidade foi elaborada em conformidade com a Lei Geral de Proteção de Dados (LGPD - Lei nº 13.709/2018).</em>', 'Política de Privacidade', '', 'inherit', 'closed', 'closed', '', '452-revision-v1', '', '', '2026-07-06 22:55:46', '2026-07-07 01:55:46', '', '452', 'http://localhost:8082/ideiasti/?p=468', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('469', '0', '2026-07-06 22:55:52', '2026-07-07 01:55:52', '', 'giphy-10', '', 'inherit', 'open', 'closed', '', 'giphy-10', '', '', '2026-07-06 22:55:52', '2026-07-07 01:55:52', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-10.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('470', '0', '2026-07-06 22:55:54', '2026-07-07 01:55:54', '<p><strong>Meta Description:</strong> Conheça todos os tipos de testes de software: funcionais, não-funcionais, unitários, integração, sistema e mais. Guia completo com definições, objetivos e melhores práticas.</p>\n\n<hr>\n<h2>Introdução aos Tipos de Testes de Software</h2>\n\n<p>Os testes de software são uma atividade crítica no ciclo de desenvolvimento de sistemas. Compreender os diferentes tipos de testes e quando aplicá-los é fundamental para garantir a qualidade e confiabilidade das aplicações.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-10.gif\" alt=\"Pirâmide de Testes - Hierarquia de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este guia completo apresenta uma categorização detalhada dos principais tipos de testes de software, suas finalidades, características e quando cada um deve ser utilizado no seu projeto.</p>\n\n<hr>\n<h2>Categorização Geral dos Testes</h2>\n\n<p>Os testes de software podem ser divididos em duas categorias principais:</p>\n\n<h3>1. Testes Funcionais</h3>\n\n<p>Verificam se o software funciona conforme especificado, testando funcionalidades específicas e requisitos do negócio.</p>\n\n<h3>2. Testes Não-Funcionais</h3>\n\n<p>Avaliam características como performance, segurança, usabilidade e confiabilidade, que não estão relacionadas a funcionalidades específicas.</p>\n\n<hr>\n<h2>Testes Funcionais: Garantindo o Comportamento Correto</h2>\n\n<h3>Teste Unitário: A Base de Tudo</h3>\n\n<p>O teste unitário é o tipo mais básico de teste, onde cada unidade de código (geralmente uma função ou método) é testada isoladamente. Esta atividade é realizada durante as etapas de desenvolvimento pelos próprios desenvolvedores.</p>\n\n<h4>Objetivos dos Testes Unitários</h4>\n\n<ul><li><strong>Identificar falhas em componentes individuais</strong> - Detectar problemas cedo</li><ol><li><strong>Garantir que cada função trabalha corretamente</strong> - Validação granular</li>\n<li><strong>Facilitar a detecção precoce de defeitos</strong> - Redução de custos</li>\n<li><strong>Documentar o código</strong> - Testes como especificação executável</li>\n<li><strong>Permitir refactoring seguro</strong> - Confiança ao modificar código</li>\n</ol>\n<h4>Exemplo Prático em Python (pytest)</h4>\n\n<pre><code>def calcular_desconto(valor_original, percentual):\n    \"\"\"Calcula o valor do desconto.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual deve estar entre 0 e 100\")\n    desconto = valor_original * (percentual / 100)\n    return valor_original - desconto\n\n<p>def test_calcular_desconto_10_porcento():<br>    assert calcular_desconto(100, 10) == 90</p>\n\n<p>def test_calcular_desconto_50_porcento():<br>    assert calcular_desconto(200, 50) == 100</p>\n\n<p>def test_calcular_desconto_invalido():<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 150)<br></code></pre></p>\n\n<h4>Frameworks Populares para Testes Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Framework</th><th>Características</th></tr>\n<tr><td>Java</td><td>JUnit 5, TestNG</td><td>Mais popular, extensível</td></tr>\n<tr><td>JavaScript</td><td>Jest, Mocha</td><td>Rápido, Mocking fácil</td></tr>\n<tr><td>Python</td><td>pytest, unittest</td><td>Sintaxe simples, fixtures</td></tr>\n<tr><td>C#</td><td>xUnit, NUnit</td><td>.NET ecosystem</td></tr>\n<tr><td>Go</td><td>testing (stdlib)</td><td>Simples, integrado</td></tr>\n</table></figure>\n\n<h4>Melhores Práticas para Testes Unitários</h4>\n\n<p>✅ <strong>Teste apenas uma coisa de cada vez</strong> - Um assert por teste é ideal  <br>✅ <strong>Nomes descritivos</strong> - <code>test_deve_retornar_erro_quando_usuario_invalido</code>  <br>✅ <strong>Independência</strong> - Testes não devem depender uns dos outros  <br>✅ <strong>Rapidez</strong> - Unit tests devem executar em milissegundos  <br>✅ <strong>Isolamento</strong> - Use mocks para dependências externas</p>\n\n<hr>\n<h3>Teste de Integração: Verificando Conexões</h3>\n\n<p>O teste de integração verifica a comunicação entre diferentes módulos ou componentes do sistema. Este tipo de teste é crucial para garantir que as partes do sistema funcionam corretamente quando combinadas.</p>\n\n<h4>Características Principais</h4>\n<ol><li><strong>Valida interfaces e interações entre componentes</strong> - Fluxo de dados correto</li>\n<li><strong>Identifica problemas de comunicação</strong> - API mismatches, protocolos</li>\n<li><strong>Pode ser realizado de forma incremental ou big-bang</strong> - Duas abordagens</li>\n<li><strong>Testa camadas de persistência</strong> - Bancos de dados, APIs externas</li>\n</ol>\n<h4>Estratégias de Integração</h4>\n\n<p>##### 1. Big-Bang Integration</p>\n\n<p>Todos os componentes são integrados simultaneamente e testados juntos.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Simples de implementar</li><br><li>Bom para sistemas pequenos</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Difícil localização de erros</li><br><li>Todos os módulos devem estar prontos</li><br></ol><br>##### 2. Incremental Integration (Bottom-Up)</p>\n\n<p>Começa pelos módulos mais baixos e集成 progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Defeitos fáceis de isolar</li><br><li>Feedback contínuo</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode ter módulos de alto nível sem testes até o final</li><br></ol><br>##### 3. Incremental Integration (Top-Down)</p>\n\n<p>Começa pelos módulos de mais alto nível e desce progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Interface do usuário testada primeiro</li><br><li>Protótipo funcional rápido</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Módulos de baixo nível simulados (stubs)</li><br></ol><br><h4>Exemplo de Teste de Integração (REST API)</h4></p>\n\n<pre><code>import requests\nimport pytest\n\n<p>class TestUserAPI:<br>    BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>def test_criar_usuario(self):<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"senha123\"<br>        }<br>        response = requests.post(f\"{self.BASE_URL}/usuarios\", json=payload)</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data</p>\n\n<p>def test_listar_usuarios(self):<br>        response = requests.get(f\"{self.BASE_URL}/usuarios\")</p>\n\n<p>assert response.status_code == 200<br>        assert isinstance(response.json(), list)<br></code></pre></p>\n\n<hr>\n<h3>Teste de Sistema: Visão Holística</h3>\n\n<p>O teste de sistema avalia o software como um todo, verificando se todos os componentes funcionam juntos para atender aos requisitos definidos.</p>\n\n<h4>O Que é Testado no Nível de Sistema?</h4>\n<ol><li><strong>Integração entre todos os módulos</strong></li>\n<li><strong>Fluxos de negócio completos</strong></li>\n<li><strong>Conformidade com requisitos funcionais</strong></li>\n<li><strong>Interface com sistemas externos</strong></li>\n<li><strong>Performance do sistema integrado</strong></li>\n<li><strong>Segurança end-to-end</strong></li>\n</ol>\n<h4>Exemplo: Fluxo de E-commerce</h4>\n\n<pre><code>Usuário → Login → Navegação → Carrinho → Checkout → Pagamento → Confirmação\n    ↓         ↓          ↓           ↓           ↓            ↓            ↓\n Cadastro   Session   Produtos    Estoque     Frete        Stripe     E-mail\n   ↕          ↕         ↕          ↕          ↕            ↕          ↕\n  DB        Redis     DB/API     DB         Correios      API       SMTP\n</code></pre>\n\n<p>Cada seta representa um ponto de integração que deve ser testado no nível de sistema.</p>\n\n<hr>\n<h3>Teste de Aceitação: Validando com o Cliente</h3>\n\n<p>O teste de aceitação determina se um produto ou sistema atende às expectativas e requisitos do cliente. Este é frequentemente o último nível de teste antes da entrega正式.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto certo?\"</strong></p>\n\n<h4>Tipos de Teste de Aceitação</h4>\n\n<p>##### 1. Teste de Aceitação do Usuário (UAT)</p>\n\n<p>Usuários finais testam o sistema em um ambiente semelhante ao de produção.</p>\n\n<p>##### 2. Teste de Aceitação Operacional (OAT)</p>\n\n<p>Equipe de operações validabackup, recuperação, relatórios.</p>\n\n<p>##### 3. Teste de Aceitação Contratual</p>\n\n<p>Verifica se o sistema atende aos critérios contratuais.</p>\n\n<h4>Características do UAT</h4>\n<ol><li>Geralmente envolve cooperação ou feedback do cliente</li>\n<li>Atividade de validação com dados reais</li>\n<li>Foco na usabilidade e fluxo de negócio</li>\n<li>Pode revelar requisitos mal entendidos</li>\n<li>Último checkpoint antes do go-live</li>\n</ol>\n<hr>\n<h3>Teste Funcional: Verificando Funcionalidades</h3>\n\n<p>O teste funcional determina se um recurso ou sistema funciona corretamente sem problemas. Verifica o sistema em diferentes níveis para garantir que todos os cenários são cobertos.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto da forma certa?\"</strong></p>\n\n<h4>Técnicas de Teste Funcional</h4>\n\n<p>##### 1. Teste Baseado em Requisitos<br><ol><li>Cada requisito tem casos de teste correspondentes</li><br><li>Rastreabilidade entre requisitos e testes</li><br><li>Cobertura completa</li><br></ol><br>##### 2. Teste Baseado em Casos de Uso<br><ol><li>Cenários de usuário documentados</li><br><li>Fluxos principais e alternativos</li><br><li>Pré-condições e pós-condições</li><br></ol><br>##### 3. Teste de Tabela de Decisão<br><ol><li>Combinações de condições e ações</li><br><li>Útil para regras de negócio complexas</li><br></ol><br>##### 4. Teste de Transição de Estado<br><ol><li>Mudanças de estado do sistema</li><br><li>Diagramas de estado</li><br></ol><br><hr><br><h2>Testes Não-Funcionais: Avaliando Qualidade Oculta</h2></p>\n\n<h3>Teste de Desempenho: Rapidez e Estabilidade</h3>\n\n<figure><img src=\"https://media.giphy.com/media/l0Iy69RBwNTRF0MXi/giphy.gif\" alt=\"Performance Testing - Testes de Desempenho\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de desempenho avalia a velocidade, responsividade e estabilidade do sistema sob carga de trabalho. É crítico para garantir que a aplicação atende aos SLAs (Service Level Agreements).</p>\n\n<h4>Subtipo 1: Teste de Carga (Load Testing)</h4>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas.</p>\n\n<p><strong>Métricas Coletadas:</strong><ol><li>Tempo de resposta (média, p95, p99)</li><br><li>Throughput (requisições por segundo)</li><br><li>Utilização de recursos (CPU, memória, disco)</li><br><li>Taxa de erros</li><br></ol><br><strong>Ferramentas Populares:</strong><ol><li>JMeter</li><br><li>Gatling</li><br><li>k6</li><br><li>Locust</li><br></ol><br><h4>Subtipo 2: Teste de Estresse (Stress Testing)</h4></p>\n\n<p>Avalia os limites do sistema além da capacidade normal para identificar o ponto de quebra.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar capacidade máxima</li><br><li>Verificar comportamento sob overload</li><br><li>Medir tempo de recuperação</li><br><li>Validar failovers</li><br></ol><br><h4>Subtipo 3: Teste de Resistência (Soak Testing)</h4></p>\n\n<p>Executa o sistema sob carga por períodos prolongados para identificar degradação gradual.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Conexões não fechadas</li><br><li>Acúmulo de logs</li><br><li>Degradação de performance</li><br></ol><br><h4>Subtipo 4: Teste de Pico (Spike Testing)</h4></p>\n\n<p>Avalia reações do sistema a picos súbitos de carga.</p>\n\n<p><strong>Cenário Exemplo:</strong><br><pre><code>Carga normal: 1000 usuários<br>Pico: 5000 usuários em 10 segundos<br>Recovery: Voltar para 1000 usuários<br></code></pre></p>\n\n<h4>Ferramentas de Teste de Desempenho</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>JMeter</strong></td><td>Open Source</td><td>Java</td><td>Enterprise, complexo</td></tr>\n<tr><td><strong>Gatling</strong></td><td>Open Source</td><td>Scala</td><td>DevOps, CI/CD</td></tr>\n<tr><td><strong>k6</strong></td><td>Open Source</td><td>JavaScript</td><td>Moderno, extensível</td></tr>\n<tr><td><strong>Locust</strong></td><td>Open Source</td><td>Python</td><td>Python teams</td></tr>\n<tr><td><strong>LoadRunner</strong></td><td>Comercial</td><td>Various</td><td>Enterprise</td></tr>\n</table></figure>\n\n<h4>Exemplo de Teste de Carga com k6</h4>\n\n<pre><code>// script.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },  // Ramp-up<br>    { duration: \'5m\', target: 100 },  // Steady state<br>    { duration: \'2m\', target: 200 },  // Spike<br>    { duration: \'5m\', target: 200 },  // Steady state<br>    { duration: \'2m\', target: 0 },    // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // Menos de 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/produtos\');<br>  check(res, {<br>    \'status é 200\': (r) =&gt; r.status === 200,<br>    \'tempo  r.timings.duration &lt; 500,<br>  });<br>  sleep(1);<br>}<br></code></pre></p>\n\n<hr>\n<h3>Teste de Segurança: Protegendo Dados e Sistemas</h3>\n\n<figure><img src=\"https://media.giphy.com/media/1qfDU4MJv3jWu34hEx/giphy.gif\" alt=\"Security Testing - Escudo de Segurança\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de segurança identifica vulnerabilidades e garante proteção de dados. Em um mundo cada vez mais digital, a segurança é prioridade.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n\n<p>##### 1. Teste de Penetração (Pen Test)</p>\n\n<p>Simula ataques para identificar vulnerabilidades antes que hackers maliciosos o façam.</p>\n\n<p><strong>Metodologias:</strong><ol><li>OWASP Testing Guide</li><br><li>PTES (Penetration Testing Execution Standard)</li><br><li>NIST SP 800-115</li><br></ol><br><strong>Tipos de Pentest:</strong><ol><li><strong>Black Box:</strong> Sem conhecimento prévio</li><br><li><strong>White Box:</strong> Código e documentação</li><br><li><strong>Gray Box:</strong> Conhecimento parcial</li><br></ol><br>##### 2. Varredura de Vulnerabilidade</p>\n\n<p>Identifica pontos fracos conhecidos através de scanning automatizado.</p>\n\n<p><strong>Ferramentas:</strong><ol><li>Nessus</li><br><li>OpenVAS</li><br><li>Qualys</li><br><li>Nexpose</li><br></ol><br>##### 3. Teste de Firewall e WAF</p>\n\n<p>Verifica configurações de segurança de firewalls e Web Application Firewalls.</p>\n\n<p><strong>O que testar:</strong><ol><li>Regras de firewall</li><br><li>Block de IPs maliciosos</li><br><li>Detecção de SQL Injection</li><br><li>Proteção XSS</li><br></ol><br>##### 4. Análise de Código Estático (SAST)</p>\n\n<p>Detecta vulnerabilidades no código-fonte sem executá-lo.</p>\n\n<p><strong>Ferramentas SAST:</strong><ol><li>SonarQube</li><br><li>Checkmarx</li><br><li>Fortify</li><br><li>Snyk Code</li><br></ol><br>##### 5. Análise de Componentes (SCA)</p>\n\n<p>Identifica vulnerabilidades em bibliotecas e dependências.</p>\n\n<p><strong>Ferramentas SCA:</strong><ol><li>Snyk</li><br><li>OWASP Dependency-Check</li><br><li>WhiteSource</li><br><li>Dependabot</li><br></ol><br><h4>OWASP Top 10: Vulnerabilidades Mais Comuns</h4><br><ol><li><strong>A01 - Broken Access Control</strong></li><br><li><strong>A02 - Cryptographic Failures</strong></li><br><li><strong>A03 - Injection</strong></li><br><li><strong>A04 - Insecure Design</strong></li><br><li><strong>A05 - Security Misconfiguration</strong></li><br><li><strong>A06 - Vulnerable Components</strong></li><br><li><strong>A07 - Authentication Failures</strong></li><br><li><strong>A08 - Software and Data Integrity Failures</strong></li><br><li><strong>A09 - Security Logging Failures</strong></li><br><li><strong>A10 - SSRF (Server-Side Request Forgery)</strong></li><br></ol><br><hr><br><h3>Teste de Usabilidade: Experiência do Usuário</h3></p>\n\n<p>Avalia a facilidade de uso e a experiência do usuário com o sistema. O teste de usabilidade é essencial para garantir que os usuários consigam realizar suas tarefas de forma eficiente.</p>\n\n<h4>Critérios de Usabilidade</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Critério</th><th>Definição</th><th>Métrica</th></tr>\n<tr><td><strong>Eficácia</strong></td><td>Usuário consegue completar tarefa?</td><td>Taxa de sucesso</td></tr>\n<tr><td><strong>Eficiência</strong></td><td>Quanto tempo leva?</td><td>Tempo de tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Usuário gostou?</td><td>Questionários SUS</td></tr>\n<tr><td><strong>Aprendizagem</strong></td><td>Quanto tempo para aprender?</td><td>Tempo até proficiência</td></tr>\n<tr><td><strong>Memorização</strong></td><td>Lembra como usar?</td><td>Retenção após pausa</td></tr>\n</table></figure>\n\n<h4>Métodos de Teste de Usabilidade</h4>\n<ol><li><strong>Testes com Usuários</strong> - Sessões gravadas com participantes</li>\n<li><strong>Análise Heurística</strong> - Avaliação por especialistas</li>\n<li><strong>Questionários</strong> - SUS, SEQ, NPS</li>\n<li><strong>Eye Tracking</strong> - Rastreamento ocular</li>\n<li><strong>Análise de Tarefas</strong> - Tempos e erros</li>\n</ol>\n<h4>Frameworks de Avaliação</h4>\n<ol><li><strong>Nielsen\'s Heurísticas</strong> (10 princípios)</li>\n<li><strong>ISO 9241-11</strong> (Usabilidade)</li>\n<li><strong>WCAG 2.1</strong> (Acessibilidade)</li>\n</ol>\n<hr>\n<h3>Teste de Compatibilidade: Funciona em Todo Lugar?</h3>\n\n<p>Verifica se o software funciona em diferentes ambientes, navegadores e dispositivos.</p>\n\n<h4>Tipos de Teste de Compatibilidade</h4>\n\n<p>##### 1. Teste de Navegador (Cross-Browser)<br><ol><li>Chrome, Firefox, Safari, Edge</li><br><li>Diferentes versões</li><br><li>Modos de compatibilidade</li><br></ol><br>##### 2. Teste Mobile<br><ol><li>iOS (iPhone, iPad)</li><br><li>Android (diferentes fabricantes)</li><br><li>Diferentes tamanhos de tela</li><br><li>Diferentes versões de OS</li><br></ol><br>##### 3. Teste de Sistema Operacional<br><ol><li>Windows 10, 11</li><br><li>macOS (versões diferentes)</li><br><li>Linux (distribuições populares)</li><br></ol><br>##### 4. Teste de Hardware<br><ol><li>Diferentes processadores</li><br><li>Diferentes quantidades de RAM</li><br><li>Diferentes resoluções de tela</li><br></ol><br><h4>Ferramentas de Teste Cross-Browser</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Cobertura</th><th>Preço</th></tr>\n<tr><td>BrowserStack</td><td>3000+ dispositivos</td><td>$29+/mês</td></tr>\n<tr><td>Sauce Labs</td><td>1000+ dispositivos</td><td>$39+/mês</td></tr>\n<tr><td>LambdaTest</td><td>3000+ dispositivos</td><td>$15+/mês</td></tr>\n<tr><td>CrossBrowserTesting</td><td>1500+ dispositivos</td><td>$29+/mês</td></tr>\n</table></figure>\n\n<hr>\n<h3>Teste de Recuperação: Resistência a Falhas</h3>\n\n<p>Avalia a capacidade do sistema de se recuperar de falhas e disasters. É crucial para sistemas críticos que não podem ficar fora do ar.</p>\n\n<h4>Cenários de Teste</h4>\n<ol><li><strong>Falha de Hardware</strong></li>\n</ol>   - Perda de disco\n   - Falha de memória\n   - Queda de servidor\n<ol><li><strong>Falha de Software</strong></li>\n</ol>   - Crash de aplicação\n   - Deadlock\n   - Exceções não tratadas\n<ol><li><strong>Falha de Rede</strong></li>\n</ol>   - Perda de conectividade\n   - Alta latência\n   - Timeout\n<ol><li><strong>Desastres</strong></li>\n</ol>   - Perda de datacenter\n   - Corrupção de dados\n   - Ataques DDoS\n\n<h4>Métricas de Recuperação</h4>\n<ol><li><strong>RTO (Recovery Time Objective):</strong> Tempo máximo para recuperação</li>\n<li><strong>RPO (Recovery Point Objective):</strong> Perda máxima de dados aceitável</li>\n<li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li>\n<li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li>\n</ol>\n<hr>\n<h2>Testes de Regressão: Mantendo a Qualidade</h2>\n\n<p>Executados sempre que o código é modificado para garantir que alterações não introduzam novos defeitos. Este é um dos tipos de teste mais importantes e frequentemente executados.</p>\n\n<h3>Quando Executar Testes de Regressão</h3>\n\n<p>✅ Após cada release de software  <br>✅ Após correção de bugs  <br>✅ Após atualizações de dependências  <br>✅ Após refactoring de código  <br>✅ Antes do deploy de produção</p>\n\n<h3>Estratégias de Testes de Regressão</h3>\n\n<h4>1. Regressão Completa</h4>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura total</li><br><li>Alta confiança</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Tempo longo</li><br><li>Custo elevado</li><br></ol><br><h4>2. Regressão Seletiva</h4></p>\n\n<p>Seleciona testes relevantes baseados em mudanças.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Mais rápido</li><br><li>Mais econômico</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode perder cobertura</li><br></ol><br><h4>3. Regressão Prioritária</h4></p>\n\n<p>Executa testes por prioridade (críticos &gt; altos &gt; médios &gt; baixos).</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura do crítico rápido</li><br><li>Decisões baseadas em risco</li><br></ol><br><h3>Automação de Testes de Regressão</h3></p>\n\n<p>A automação é essencial para testes de regressão eficazes:</p>\n\n<p><strong>Benefícios:</strong><ol><li>Execução frequente</li><br><li>Resultados consistentes</li><br><li>Rapidez</li><br><li>Cobertura ampla</li><br></ol><br><strong>Ferramentas Recomendadas:</strong><ol><li>Selenium WebDriver</li><br><li>Playwright</li><br><li>Cypress</li><br><li>Appium (mobile)</li><br><li>RestAssured (API)</li><br></ol><br><hr><br><h2>Pirâmide de Testes: Arquitetura Ideal</h2></p>\n\n<p>A pirâmide de testes é um conceito fundamental que guia a distribuição dos tipos de teste:</p>\n\n<pre><code>                    /\n                   /  \n                  / E2E        ← Poucos testes E2E (lentos, caros)\n                 /      \n                /Integração   ← Alguns testes de integração\n               /            \n              /  Unitários     ← Muitos testes unitários (rápidos, baratos)\n             /________________\n</code></pre>\n\n<h3>Proporções Ideais</h3>\n<ol><li><strong>Unitários:</strong> 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>Integração:</strong> 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>E2E:</strong> 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Compreender os diferentes tipos de testes de software é fundamental para construir uma estratégia de QA eficaz. Cada tipo de teste tem seu propósito específico e deve ser aplicado no momento adequado do ciclo de desenvolvimento.</p>\n\n<p><strong>Resumo dos Tipos de Testes:</strong></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Categoria</th><th>Tipo</th><th>Quando Usar</th><th>Objetivo</th></tr>\n<tr><td><strong>Funcional</strong></td><td>Unitário</td><td>Desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Integração</td><td>Pós-unitário</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Sistema</td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Aceitação</td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Performance</td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Segurança</td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Usabilidade</td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n</table></figure>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem todo projeto precisa de todos os tipos</li><br><li><strong>Priorize</strong> - Comece com unitários e integração</li><br><li><strong>Automatize</strong> - Regressão deve ser automática</li><br><li><strong>Meça</strong> - Cobertura, tempo, defeitos encontrados</li><br><li><strong>Melhore</strong> - Itere constantemente</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre Tipos de Testes</h3></p>\n\n<p><strong>P: Quantos tipos de testes existem?</strong>  <br>R: Existem dozens de tipos de testes classificados de diferentes formas. Os principais são funcionais e não-funcionais, cada um com subtipos específicos.</p>\n\n<p><strong>P: Qual a diferença entre teste de sistema e teste de aceitação?</strong>  <br>R: Teste de sistema verifica se o sistema atende aos requisitos técnicos. Teste de aceitação verifica se o sistema atende às expectativas do usuário/cliente.</p>\n\n<p><strong>P: Testes manuais podem ser substituídos por automatizados?</strong>  <br>R: Não completamente. Testes manuais são essenciais para exploratory testing, UX e cenários complexos. A automação complementa, não substitui.</p>\n\n<p><strong>P: Quando devo começar a testar?</strong>  <br>R: O mais cedo possível! O conceito de Shift-Left recomenda testes desde as primeiras fases do desenvolvimento.</p>\n\n<p><strong>P: Qual a ordem ideal de execução dos testes?</strong>  <br>R: Unitários → Integração → Sistema → Aceitação. Cada nível depende do anterior.</p>\n\n<hr>\n<em>Fonte: Selenium.dev, Atlassian, Vericode, ISTQB, OWASP</em>', 'Tipos de Testes de Software: Guia Completo com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '179-revision-v1', '', '', '2026-07-06 22:55:54', '2026-07-07 01:55:54', '', '179', 'http://localhost:8082/ideiasti/?p=470', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('471', '0', '2026-07-06 22:55:57', '2026-07-07 01:55:57', '', 'giphy-11', '', 'inherit', 'open', 'closed', '', 'giphy-11', '', '', '2026-07-06 22:55:57', '2026-07-07 01:55:57', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-11.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('472', '0', '2026-07-06 22:55:58', '2026-07-07 01:55:58', '<p><strong>Meta Description:</strong> Descubra como a Inteligência Artificial está revolucionando a QA: automação inteligente, geração de testes, detecção de anomalias e manutenção preditiva. Guia completo para profissionais.</p>\n\n<hr>\n<h2>Estado Atual da IA em QA</h2>\n\n<p>O <strong>World Quality Report 2025</strong> revela dados impressionantes: quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão ativamente buscando GenAI</strong> em práticas de Quality Engineering (QE), mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} alcançaram implementação em escala empresarial.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-11.gif\" alt=\"AI Brain - Inteligência Artificial em QA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Esta lacuna entre interesse e implementação representa uma oportunidade significativa para profissionais e organizações que souberem aproveitar efetivamente essas tecnologias.</p>\n\n<hr>\n<h2>Por Que a Adoção de IA em QA Está Crescendo?</h2>\n\n<h3>Drivers de Adoção</h3>\n<ol><li><strong>Volume de testes crescente</strong> - Sistemas mais complexos exigem mais testes</li>\n<li><strong>Pressure de velocidade</strong> - CI/CD demanda execuções mais rápidas</li>\n<li><strong>Escassez de profissionais</strong> - Demanda supera oferta de testadores</li>\n<li><strong>Qualidade em produção</strong> - Necessidade de monitoramento contínuo</li>\n<li><strong>Custos crescentes</strong> - Automação inteligente reduz despesas</li>\n</ol>\n<h3>Benefícios Comprovados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Impacto da IA</th></tr>\n<tr><td>Redução de tempo de teste</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de custos de QA</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Melhoria em cobertura</td><td>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Detecção precoce de bugs</td><td>3-5x mais cedo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Desafios de Adoção de IA em QA</h2>\n\n<h3>1. Desalinhamento Estratégico</h3>\n\n<p>Existe um hiato crescente entre o interesse organizacional em GenAI e a prontidão real para adoção efetiva dentro de QE. O caminho da experimentação para implementação é mais complexo do que o antecipado.</p>\n\n<h4>Sinais de Desalinhamento</h4>\n\n<ul><li>GenAI vista como \"solução mágica\" sem estratégia clara</li><ol><li>Falta de alinhamento entre TI e negócios</li>\n<li>Expectativas irreais sobre capacidades</li>\n<li>Subestimação de esforço de integração</li>\n</ol>\n<h3>2. Complexidade de Implementação</h3>\n\n<p>A implementação de IA em QA requer alinhamento entre inovação operacional e oversight estratégico. Desafios incluem:</p>\n\n<h4>Desafios Técnicos</h4>\n<ol><li>Integração com sistemas legados</li>\n<li>Qualidade dos dados de treinamento</li>\n<li>Escolha de modelos adequados</li>\n<li>Manutenção de modelos em produção</li>\n</ol>\n<h4>Desafios Organizacionais</h4>\n<ol><li>Resistência cultural</li>\n<li>Falta de competências</li>\n<li>Processos não adaptados</li>\n<li>Governança de IA</li>\n</ol>\n<h3>3. Questões Éticas e de Governança</h3>\n<ol><li>Viés em modelos de IA</li>\n<li>Transparência nas decisões</li>\n<li>Responsabilidade por falhas</li>\n<li>Conformidade regulatória</li>\n</ol>\n<hr>\n<h2>Aplicações de IA em QA: Casos de Uso Detalhados</h2>\n\n<h3>1. Geração Automatizada de Testes</h3>\n\n<p>IA pode gerar casos de teste automaticamente baseados em requisitos e código. Esta é uma das aplicações mais promissoras.</p>\n\n<figure><img src=\"https://media.giphy.com/media/VbZ0cWw6cVPMM/giphy.gif\" alt=\"Automação de Testes com IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Requisitos → Análise de NLP → Cenários de Teste → Casos de Teste\n    ↓                                                        ↓\n Código → Análise Estática → Cobertura → Testes Sugeridos\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de unit tests</td><td>Diffblue</td></tr>\n<tr><td><strong>Testim</strong></td><td>Testes E2E com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>Automação sem código com IA</td><td>Avo Automation</td></tr>\n</table></figure>\n\n<h4>Exemplo: Geração de Testes com GenAI</h4>\n\n<pre><code># Exemplo conceitual de como IA pode gerar testes\nimport openai\n\n<p>def gerar_testes_para_requisito(requisito):<br>    prompt = f\"\"\"<br>    Gere casos de teste para o seguinte requisito:</p>\n\n<p>Requisito: {requisito}</p>\n\n<p>Formato de saída (JSON):<br>    {{<br>        \"casos_de_teste\": [<br>            {{<br>                \"id\": \"CT-001\",<br>                \"titulo\": \"...\",<br>                \"pre_condicoes\": [...],<br>                \"passos\": [...],<br>                \"dados_teste\": {{...}},<br>                \"resultado_esperado\": \"...\"<br>            }}<br>        ]<br>    }}<br>    \"\"\"</p>\n\n<p>response = openai.chat.completions.create(<br>        model=\"gpt-4\",<br>        messages=[{\"role\": \"user\", \"content\": prompt}]<br>    )</p>\n\n<p>return json.loads(response.choices[0].message.content)<br></code></pre></p>\n\n<h3>2. Detecção de Anomalias</h3>\n\n<p>Algoritmos de machine learning identificam padrões incomuns que indicam defeitos, revolucionando o monitoramento de qualidade.</p>\n\n<h4>Técnicas Utilizadas</h4>\n\n<p>##### Análise de Séries Temporais<br><ol><li>Identificação de anomalias em métricas de performance</li><br><li>Detecção de degradação gradual</li><br><li>Alertas proativos sobre problemas</li><br></ol><br>##### Clustering<br><ol><li>Agrupamento de testes similares</li><br><li>Identificação de testes atípicos</li><br><li>Detecção de padrões de falha</li><br></ol><br>##### Redes Neurais<br><ol><li>Detecção de padrões complexos</li><br><li>Aprendizado de comportamentos normais</li><br><li>Previsão de falhas</li><br></ol><br><h4>Ferramentas de Detecção de Anomalias</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Aplicação</th></tr>\n<tr><td><strong>Elastic APM</strong></td><td>APM</td><td>Detecção de anomalias em produção</td></tr>\n<tr><td><strong>Datadog</strong></td><td>Monitoring</td><td>ML para métricas</td></tr>\n<tr><td><strong>New Relic</strong></td><td>APM</td><td>Detecção inteligente</td></tr>\n<tr><td><strong>Grafana + Loki</strong></td><td>Logging</td><td>Análise de logs com ML</td></tr>\n</table></figure>\n\n<h3>3. Manutenção Inteligente de Testes</h3>\n\n<p>IA ajuda a identificar e remover testes obsoletos ou flaky, mantendo a suite de testes saudável.</p>\n\n<h4>Problemas que a IA Resolve</h4>\n\n<p><strong>Testes Flaky (Instáveis)</strong><br><ol><li>Identificação de padrões que causam instabilidade</li><br><li>Predição de quais testes podem falhar</li><br><li>Sugestões de correções</li><br><li>Quarentena automática</li><br></ol><br><strong>Testes Obsoletos</strong><br><ol><li>Detecção de funcionalidades removidas</li><br><li>Identificação de código não coberto</li><br><li>Sugestões de remoção segura</li><br></ol><br><h4>Exemplo de Detecção de Testes Flaky</h4></p>\n\n<pre><code># Sistema simplificado de detecção de testes flaky\nclass FlakyTestDetector:\n    def __init__(self):\n        self.test_history = {}\n        self.ml_model = load_trained_model()\n\n<p>def analyze_test(self, test_name, execution_history):<br>        features = self.extract_features(execution_history)<br>        flaky_probability = self.ml_model.predict_proba([features])[0]</p>\n\n<p>if flaky_probability &gt; 0.7:<br>            return {<br>                \"test\": test_name,<br>                \"flaky_probability\": flaky_probability,<br>                \"recommendation\": \"QUARANTINE\",<br>                \"reasons\": self.explain_prediction(features)<br>            }<br>        return {\"test\": test_name, \"flaky_probability\": flaky_probability}</p>\n\n<p>def extract_features(self, history):<br>        return [<br>            history.success_rate,<br>            history.avg_duration,<br>            history.recent_failures,<br>            history.environment_changes,<br>            history.dependency_changes<br>        ]<br></code></pre></p>\n\n<h3>4. Análise de Código Estático com IA</h3>\n\n<p>Identifica potenciais problemas de qualidade antes da execução, usando análise semântica avançada.</p>\n\n<h4>Capacidades Avançadas</h4>\n<ol><li><strong>Detecção de vulnerabilidades</strong> - OWASP Top 10</li>\n<li><strong>Análise de dependências</strong> - Bibliotecas desatualizadas</li>\n<li><strong>Code smells</strong> - Padrões problemáticos</li>\n<li><strong>Débito técnico</strong> - Métricas de qualidade</li>\n</ol>\n<h4>Ferramentas com IA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Capacidades IA</th><th>Integração</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Débito técnico, code smells</td><td>CI/CD</td></tr>\n<tr><td><strong>Snyk</strong></td><td>Vulnerabilidades, licenças</td><td>IDE, CI</td></tr>\n<tr><td><strong>CodeClimate</strong></td><td>Quality, maintainability</td><td>GitHub</td></tr>\n<tr><td><strong>DeepSource</strong></td><td>Análise estática com ML</td><td>Git</td></tr>\n</table></figure>\n\n<h3>5. Testes Visuais Automatizados</h3>\n\n<p>Comparação de interfaces visuais usando visão computacional para detectar regressões.</p>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Página Capturada → Modelo de Visão Computacional → Comparação com Baseline\n     ↓                          ↓                                    ↓\n  Screenshots           Detecção de Elementos           Diff Visual\n                                            ↓\n                                    Alertas de Regressão\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tecnologia</th><th>Diferencial</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Visual AI</td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de precisão</td></tr>\n<tr><td><strong> Percy</strong></td><td>Visual testing</td><td>Integração simples</td></tr>\n<tr><td><strong>Chromatic</strong></td><td>Visual regression</td><td>Para Storybook</td></tr>\n<tr><td><strong>Lost Pixel</strong></td><td>Open source</td><td>Self-hosted</td></tr>\n</table></figure>\n\n<h3>6. Oráculos de Teste Baseados em IA</h3>\n\n<p>Validação de resultados usando modelos treinados para determinar se o comportamento está correto.</p>\n\n<h4>Tipos de Oráculos</h4>\n<ol><li><strong>Oráculo de Imagem</strong> - Validação visual de UI</li>\n<li><strong>Oráculo de Texto</strong> - Análise de conteúdo</li>\n<li><strong>Oráculo de Comportamento</strong> - Detecção de anomalias</li>\n<li><strong>Oráculo de Dados</strong> - Validação de datasets</li>\n</ol>\n<hr>\n<h2>Ferramentas de IA para QA: Comparativo</h2>\n\n<h3>Plataformas Completas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Testim</strong></td><td>Automação inteligente E2E</td><td>$600+/mês</td><td>Equipes enterprise</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Automação com ML</td><td>Sob consulta</td><td>Escala enterprise</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>$500+/mês</td><td>CI/CD integrado</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>No-code com IA</td><td>Sob consulta</td><td>Enterprise</td></tr>\n<tr><td><strong>Perfecto</strong></td><td>Testes mobile/web com IA</td><td>Sob consulta</td><td>Mobile testing</td></tr>\n</table></figure>\n\n<h3>Ferramentas Especializadas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais</td><td>$100+/mês</td><td>UI testing</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Unit tests</td><td>$299/assinante</td><td>Dev teams</td></tr>\n<tr><td><strong>Snyk</strong></td><td>SCA</td><td>Grátis + Pro</td><td>Developers</td></tr>\n<tr><td><strong>SonarCloud</strong></td><td>SAST</td><td>Grátis + Pro</td><td>CI/CD</td></tr>\n</table></figure>\n\n<h3>Ferramentas Emerging (2025-2026)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Status</th></tr>\n<tr><td><strong>CodiumAI</strong></td><td>Testes gerados automaticamente</td><td>Beta</td></tr>\n<tr><td><strong>Mutable AI</strong></td><td>Code review + tests</td><td>Beta</td></tr>\n<tr><td><strong>Dagger</strong></td><td>CI/CD programável</td><td>GA</td></tr>\n<tr><td><strong>Trunk</strong></td><td>Linting inteligente</td><td>GA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando IA em QA: Roadmap Prático</h2>\n\n<h3>Fase 1: Avaliação e Planejamento (1-2 meses)</h3>\n\n<h4>Checklist de Avaliação</h4>\n<ol><li>[ ] Mapeamento de processos atuais de QA</li>\n<li>[ ] Identificação de pontos de dor</li>\n<li>[ ] Análise de ROI potencial</li>\n<li>[ ] Avaliação de maturidade tecnológica</li>\n<li>[ ] Levantamento de stakeholders</li>\n</ol>\n<h4>Métricas de Baseline</h4>\n\n<p>Antes de implementar, estabeleça métricas de referência:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Ferramenta</th></tr>\n<tr><td>Tempo de teste</td><td>Duração de suite</td><td>CI/CD logs</td></tr>\n<tr><td>Cobertura de teste</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>Coverage tools</td></tr>\n<tr><td>Taxa de defeitos</td><td>Bugs em produção</td><td>Bug tracker</td></tr>\n<tr><td>Testes flaky</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas instáveis</td><td>CI/CD</td></tr>\n<tr><td>Custo de QA</td><td>$/teste executado</td><td>Financeiro</td></tr>\n</table></figure>\n\n<h3>Fase 2: Pilot (2-3 meses)</h3>\n\n<h4>Escolha do Piloto</h4>\n\n<p>Selecione um projeto ou área com:<br><ol><li>✅ Escopo controlado</li><br><li>✅ Equipe aberta a inovação</li><br><li>✅ Processos definidos</li><br><li>✅ Métricas disponíveis</li><br></ol><br><h4>Pilotos Recomendados</h4><br><ol><li><strong>Geração de unit tests</strong> - Diffblue, CodiumAI</li><br><li><strong>Testes visuais</strong> - Applitools</li><br><li><strong>Detecção de flaky tests</strong> - Ferramentas de CI</li><br><li><strong>Análise estática</strong> - SonarQube, Snyk</li><br></ol><br><h3>Fase 3: Expansão (3-6 meses)</h3></p>\n\n<h4>Escalar Sucesso</h4>\n<ol><li>Documente aprendizados</li>\n<li>Treine outras equipes</li>\n<li>Padronize processos</li>\n<li>Melhore integrações</li>\n</ol>\n<h4>KPIs de Sucesso</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Meta (6 meses)</th></tr>\n<tr><td>Redução de tempo de teste</td><td>30-40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Aumento de cobertura</td><td>20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de defeitos em prod</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>ROI positivo</td><td>Sim</td></tr>\n</table></figure>\n\n<h3>Fase 4: Maturidade (6-12 meses)</h3>\n\n<h4>Implementação Enterprise</h4>\n<ol><li>Integração completa com CI/CD</li>\n<li>IA em produção (monitoramento)</li>\n<li>Maintenance automatizado</li>\n<li>Reporting avançado</li>\n</ol>\n<hr>\n<h2>Futuro da IA em QA: Tendências 2026-2028</h2>\n\n<h3>1. Testes Autônomos</h3>\n\n<p>Sistemas que automaticamente:<br><ol><li>Geram testes baseados em requisitos</li><br><li>Executam testes continuamente</li><br><li>Detectam e reportam falhas</li><br><li>Propõem correções</li><br></ol><br><h3>2. Manutenção Preditiva</h3></p>\n\n<p>IA que prevê:<br><ol><li>Quando testes vão falhar</li><br><li>Quando código precisa de mais testes</li><br><li>Quando componentes estão em risco</li><br><li>Quando fazer refactoring</li><br></ol><br><h3>3. GenAI Nativa em QA</h3></p>\n\n<p>Modelos treinados especificamente para:<br><ol><li>Entender código e testes</li><br><li>Gerar código de teste</li><br><li>Analisar requisitos</li><br><li>Documentar testes</li><br></ol><br><h3>4. Testes em Produção com IA</h3></p>\n\n<p>Monitoramento inteligente:<br><ol><li>Detecção de anomalias em produção</li><br><li>Geração automática de testes de regressão</li><br><li>Validação de deployments</li><br><li>Root cause analysis</li><br></ol><br><hr><br><h2>Considerações Éticas e Best Practices</h2></p>\n\n<h3>Governança de IA em QA</h3>\n\n<h4>Princípios</h4>\n<ol><li><strong>Transparência</strong> - Documente como a IA toma decisões</li>\n<li><strong>Responsabilidade</strong> - Humanos mantêm responsabilidade final</li>\n<li><strong>Fairness</strong> - Evite viés em modelos</li>\n<li><strong>Privacidade</strong> - Proteja dados sensíveis</li>\n<li><strong>Segurança</strong> - Proteja modelos contra ataques</li>\n</ol>\n<h4>Checklist de Governança</h4>\n<ol><li>[ ] Política de uso de IA em QA documentada</li>\n<li>[ ] Processos de revisão de decisões de IA</li>\n<li>[ ] Documentação de modelos utilizados</li>\n<li>[ ] Plano de contingência para falhas de IA</li>\n<li>[ ] Treinamento de equipe em uso responsável</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A IA está transformando fundamentalmente a QA, oferecendo oportunidades sem precedentes para aumentar eficiência, cobertura e qualidade. Embora a adoção em escala ainda seja um desafio, organizações que investem estrategicamente em IA para QA estão obtendo vantagens competitivas significativas.</p>\n\n<p><strong>Resumo dos Principais Aprendizados:</strong></p>\n\n<p>✅ IA pode reduzir tempo de teste em 40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}  <br>✅ GenAI está sendo buscada por 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações, mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram em escala  <br>✅ Ferramentas como Playwright, Applitools e Testim estão liderando a adoção  <br>✅ Implementação requer estratégia, não apenas ferramentas  <br>✅ Futuro aponta para testes autônomos e manutenção preditiva</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem toda organização precisa de todas as capacidades</li><br><li><strong>Comece pequeno</strong> - Pilotos controlados são mais eficazes</li><br><li><strong>Meça resultados</strong> - Métricas são essenciais</li><br><li><strong>Treine sua equipe</strong> - Competências em IA são necessárias</li><br><li><strong>Governarize</strong> - Adote práticas éticas desde o início</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre IA em QA</h3></p>\n\n<p><strong>P: A IA vai substituir testadores humanos?</strong>  <br>R: Não. A IA complementa o trabalho humano, permitindo que testadores foquem em atividades estratégicas, exploratory testing e design de testes.</p>\n\n<p><strong>P: Qual é o ROI da implementação de IA em QA?</strong>  <br>R: O ROI típico é de 200-500{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em 12-18 meses, considerando redução de tempo de teste, aumento de cobertura e redução de defeitos em produção.</p>\n\n<p><strong>P: Preciso de especialistas em dados para implementar IA em QA?</strong>  <br>R: Não necessariamente. Muitas ferramentas são \"plug-and-play\" e não requerem conhecimento de ML. No entanto, para implementações avançadas, especialistas são úteis.</p>\n\n<p><strong>P: Quais são os principais riscos do uso de IA em QA?</strong>  <br>R: Os principais riscos incluem: dependência excessiva, viés em modelos, falta de transparência e custos inesperados de manutenção.</p>\n\n<p><strong>P: Quando devo começar a usar IA em QA?</strong>  <br>R: Se você tem mais de 100 testes automatizados ou gastando mais de 20 horas/semana em QA, é um bom momento para avaliar ferramentas de IA.</p>\n\n<hr>\n<em>Fonte: World Quality Report 2025, Software Testing Magazine, Gartner Research, IEEE Software</em>', 'Inteligência Artificial em Quality Assurance: Guia Completo para 2025-2026', '', 'inherit', 'closed', 'closed', '', '181-revision-v1', '', '', '2026-07-06 22:55:58', '2026-07-07 01:55:58', '', '181', 'http://localhost:8082/ideiasti/?p=472', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('474', '0', '2026-07-06 23:05:51', '2026-07-07 02:05:51', '', 'giphy-12', '', 'inherit', 'open', 'closed', '', 'giphy-12', '', '', '2026-07-06 23:05:51', '2026-07-07 02:05:51', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-12.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('475', '0', '2026-07-06 23:05:52', '2026-07-07 02:05:52', '<p><strong>Meta Description:</strong> Conheça todos os tipos de testes de software: funcionais, não-funcionais, unitários, integração, sistema e mais. Guia completo com definições, objetivos e melhores práticas.</p>\n\n<hr>\n<h2>Introdução aos Tipos de Testes de Software</h2>\n\n<p>Os testes de software são uma atividade crítica no ciclo de desenvolvimento de sistemas. Compreender os diferentes tipos de testes e quando aplicá-los é fundamental para garantir a qualidade e confiabilidade das aplicações.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-12.gif\" alt=\"Pirâmide de Testes - Hierarquia de Testes\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Este guia completo apresenta uma categorização detalhada dos principais tipos de testes de software, suas finalidades, características e quando cada um deve ser utilizado no seu projeto.</p>\n\n<hr>\n<h2>Categorização Geral dos Testes</h2>\n\n<p>Os testes de software podem ser divididos em duas categorias principais:</p>\n\n<h3>1. Testes Funcionais</h3>\n\n<p>Verificam se o software funciona conforme especificado, testando funcionalidades específicas e requisitos do negócio.</p>\n\n<h3>2. Testes Não-Funcionais</h3>\n\n<p>Avaliam características como performance, segurança, usabilidade e confiabilidade, que não estão relacionadas a funcionalidades específicas.</p>\n\n<hr>\n<h2>Testes Funcionais: Garantindo o Comportamento Correto</h2>\n\n<h3>Teste Unitário: A Base de Tudo</h3>\n\n<p>O teste unitário é o tipo mais básico de teste, onde cada unidade de código (geralmente uma função ou método) é testada isoladamente. Esta atividade é realizada durante as etapas de desenvolvimento pelos próprios desenvolvedores.</p>\n\n<h4>Objetivos dos Testes Unitários</h4>\n\n<ul><li><strong>Identificar falhas em componentes individuais</strong> - Detectar problemas cedo</li><ol><li><strong>Garantir que cada função trabalha corretamente</strong> - Validação granular</li>\n<li><strong>Facilitar a detecção precoce de defeitos</strong> - Redução de custos</li>\n<li><strong>Documentar o código</strong> - Testes como especificação executável</li>\n<li><strong>Permitir refactoring seguro</strong> - Confiança ao modificar código</li>\n</ol>\n<h4>Exemplo Prático em Python (pytest)</h4>\n\n<pre><code>def calcular_desconto(valor_original, percentual):\n    \"\"\"Calcula o valor do desconto.\"\"\"\n    if percentual  100:\n        raise ValueError(\"Percentual deve estar entre 0 e 100\")\n    desconto = valor_original * (percentual / 100)\n    return valor_original - desconto\n\n<p>def test_calcular_desconto_10_porcento():<br>    assert calcular_desconto(100, 10) == 90</p>\n\n<p>def test_calcular_desconto_50_porcento():<br>    assert calcular_desconto(200, 50) == 100</p>\n\n<p>def test_calcular_desconto_invalido():<br>    with pytest.raises(ValueError):<br>        calcular_desconto(100, 150)<br></code></pre></p>\n\n<h4>Frameworks Populares para Testes Unitários</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Linguagem</th><th>Framework</th><th>Características</th></tr>\n<tr><td>Java</td><td>JUnit 5, TestNG</td><td>Mais popular, extensível</td></tr>\n<tr><td>JavaScript</td><td>Jest, Mocha</td><td>Rápido, Mocking fácil</td></tr>\n<tr><td>Python</td><td>pytest, unittest</td><td>Sintaxe simples, fixtures</td></tr>\n<tr><td>C#</td><td>xUnit, NUnit</td><td>.NET ecosystem</td></tr>\n<tr><td>Go</td><td>testing (stdlib)</td><td>Simples, integrado</td></tr>\n</table></figure>\n\n<h4>Melhores Práticas para Testes Unitários</h4>\n\n<p>✅ <strong>Teste apenas uma coisa de cada vez</strong> - Um assert por teste é ideal  <br>✅ <strong>Nomes descritivos</strong> - <code>test_deve_retornar_erro_quando_usuario_invalido</code>  <br>✅ <strong>Independência</strong> - Testes não devem depender uns dos outros  <br>✅ <strong>Rapidez</strong> - Unit tests devem executar em milissegundos  <br>✅ <strong>Isolamento</strong> - Use mocks para dependências externas</p>\n\n<hr>\n<h3>Teste de Integração: Verificando Conexões</h3>\n\n<p>O teste de integração verifica a comunicação entre diferentes módulos ou componentes do sistema. Este tipo de teste é crucial para garantir que as partes do sistema funcionam corretamente quando combinadas.</p>\n\n<h4>Características Principais</h4>\n<ol><li><strong>Valida interfaces e interações entre componentes</strong> - Fluxo de dados correto</li>\n<li><strong>Identifica problemas de comunicação</strong> - API mismatches, protocolos</li>\n<li><strong>Pode ser realizado de forma incremental ou big-bang</strong> - Duas abordagens</li>\n<li><strong>Testa camadas de persistência</strong> - Bancos de dados, APIs externas</li>\n</ol>\n<h4>Estratégias de Integração</h4>\n\n<p>##### 1. Big-Bang Integration</p>\n\n<p>Todos os componentes são integrados simultaneamente e testados juntos.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Simples de implementar</li><br><li>Bom para sistemas pequenos</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Difícil localização de erros</li><br><li>Todos os módulos devem estar prontos</li><br></ol><br>##### 2. Incremental Integration (Bottom-Up)</p>\n\n<p>Começa pelos módulos mais baixos e集成 progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Defeitos fáceis de isolar</li><br><li>Feedback contínuo</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode ter módulos de alto nível sem testes até o final</li><br></ol><br>##### 3. Incremental Integration (Top-Down)</p>\n\n<p>Começa pelos módulos de mais alto nível e desce progressivamente.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Interface do usuário testada primeiro</li><br><li>Protótipo funcional rápido</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Módulos de baixo nível simulados (stubs)</li><br></ol><br><h4>Exemplo de Teste de Integração (REST API)</h4></p>\n\n<pre><code>import requests\nimport pytest\n\n<p>class TestUserAPI:<br>    BASE_URL = \"https://api.exemplo.com/v1\"</p>\n\n<p>def test_criar_usuario(self):<br>        payload = {<br>            \"nome\": \"João Silva\",<br>            \"email\": \"joao@exemplo.com\",<br>            \"senha\": \"senha123\"<br>        }<br>        response = requests.post(f\"{self.BASE_URL}/usuarios\", json=payload)</p>\n\n<p>assert response.status_code == 201<br>        data = response.json()<br>        assert data[\"nome\"] == payload[\"nome\"]<br>        assert data[\"email\"] == payload[\"email\"]<br>        assert \"id\" in data</p>\n\n<p>def test_listar_usuarios(self):<br>        response = requests.get(f\"{self.BASE_URL}/usuarios\")</p>\n\n<p>assert response.status_code == 200<br>        assert isinstance(response.json(), list)<br></code></pre></p>\n\n<hr>\n<h3>Teste de Sistema: Visão Holística</h3>\n\n<p>O teste de sistema avalia o software como um todo, verificando se todos os componentes funcionam juntos para atender aos requisitos definidos.</p>\n\n<h4>O Que é Testado no Nível de Sistema?</h4>\n<ol><li><strong>Integração entre todos os módulos</strong></li>\n<li><strong>Fluxos de negócio completos</strong></li>\n<li><strong>Conformidade com requisitos funcionais</strong></li>\n<li><strong>Interface com sistemas externos</strong></li>\n<li><strong>Performance do sistema integrado</strong></li>\n<li><strong>Segurança end-to-end</strong></li>\n</ol>\n<h4>Exemplo: Fluxo de E-commerce</h4>\n\n<pre><code>Usuário → Login → Navegação → Carrinho → Checkout → Pagamento → Confirmação\n    ↓         ↓          ↓           ↓           ↓            ↓            ↓\n Cadastro   Session   Produtos    Estoque     Frete        Stripe     E-mail\n   ↕          ↕         ↕          ↕          ↕            ↕          ↕\n  DB        Redis     DB/API     DB         Correios      API       SMTP\n</code></pre>\n\n<p>Cada seta representa um ponto de integração que deve ser testado no nível de sistema.</p>\n\n<hr>\n<h3>Teste de Aceitação: Validando com o Cliente</h3>\n\n<p>O teste de aceitação determina se um produto ou sistema atende às expectativas e requisitos do cliente. Este é frequentemente o último nível de teste antes da entrega正式.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto certo?\"</strong></p>\n\n<h4>Tipos de Teste de Aceitação</h4>\n\n<p>##### 1. Teste de Aceitação do Usuário (UAT)</p>\n\n<p>Usuários finais testam o sistema em um ambiente semelhante ao de produção.</p>\n\n<p>##### 2. Teste de Aceitação Operacional (OAT)</p>\n\n<p>Equipe de operações validabackup, recuperação, relatórios.</p>\n\n<p>##### 3. Teste de Aceitação Contratual</p>\n\n<p>Verifica se o sistema atende aos critérios contratuais.</p>\n\n<h4>Características do UAT</h4>\n<ol><li>Geralmente envolve cooperação ou feedback do cliente</li>\n<li>Atividade de validação com dados reais</li>\n<li>Foco na usabilidade e fluxo de negócio</li>\n<li>Pode revelar requisitos mal entendidos</li>\n<li>Último checkpoint antes do go-live</li>\n</ol>\n<hr>\n<h3>Teste Funcional: Verificando Funcionalidades</h3>\n\n<p>O teste funcional determina se um recurso ou sistema funciona corretamente sem problemas. Verifica o sistema em diferentes níveis para garantir que todos os cenários são cobertos.</p>\n\n<h4>Pergunta Fundamental</h4>\n\n<p>&gt; <strong>\"Estamos construindo o produto da forma certa?\"</strong></p>\n\n<h4>Técnicas de Teste Funcional</h4>\n\n<p>##### 1. Teste Baseado em Requisitos<br><ol><li>Cada requisito tem casos de teste correspondentes</li><br><li>Rastreabilidade entre requisitos e testes</li><br><li>Cobertura completa</li><br></ol><br>##### 2. Teste Baseado em Casos de Uso<br><ol><li>Cenários de usuário documentados</li><br><li>Fluxos principais e alternativos</li><br><li>Pré-condições e pós-condições</li><br></ol><br>##### 3. Teste de Tabela de Decisão<br><ol><li>Combinações de condições e ações</li><br><li>Útil para regras de negócio complexas</li><br></ol><br>##### 4. Teste de Transição de Estado<br><ol><li>Mudanças de estado do sistema</li><br><li>Diagramas de estado</li><br></ol><br><hr><br><h2>Testes Não-Funcionais: Avaliando Qualidade Oculta</h2></p>\n\n<h3>Teste de Desempenho: Rapidez e Estabilidade</h3>\n\n<figure><img src=\"https://media.giphy.com/media/l0Iy69RBwNTRF0MXi/giphy.gif\" alt=\"Performance Testing - Testes de Desempenho\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de desempenho avalia a velocidade, responsividade e estabilidade do sistema sob carga de trabalho. É crítico para garantir que a aplicação atende aos SLAs (Service Level Agreements).</p>\n\n<h4>Subtipo 1: Teste de Carga (Load Testing)</h4>\n\n<p>Verifica o comportamento do sistema sob condições de carga esperadas.</p>\n\n<p><strong>Métricas Coletadas:</strong><ol><li>Tempo de resposta (média, p95, p99)</li><br><li>Throughput (requisições por segundo)</li><br><li>Utilização de recursos (CPU, memória, disco)</li><br><li>Taxa de erros</li><br></ol><br><strong>Ferramentas Populares:</strong><ol><li>JMeter</li><br><li>Gatling</li><br><li>k6</li><br><li>Locust</li><br></ol><br><h4>Subtipo 2: Teste de Estresse (Stress Testing)</h4></p>\n\n<p>Avalia os limites do sistema além da capacidade normal para identificar o ponto de quebra.</p>\n\n<p><strong>Objetivos:</strong><ol><li>Identificar capacidade máxima</li><br><li>Verificar comportamento sob overload</li><br><li>Medir tempo de recuperação</li><br><li>Validar failovers</li><br></ol><br><h4>Subtipo 3: Teste de Resistência (Soak Testing)</h4></p>\n\n<p>Executa o sistema sob carga por períodos prolongados para identificar degradação gradual.</p>\n\n<p><strong>Problemas Detectados:</strong><ol><li>Memory leaks</li><br><li>Conexões não fechadas</li><br><li>Acúmulo de logs</li><br><li>Degradação de performance</li><br></ol><br><h4>Subtipo 4: Teste de Pico (Spike Testing)</h4></p>\n\n<p>Avalia reações do sistema a picos súbitos de carga.</p>\n\n<p><strong>Cenário Exemplo:</strong><br><pre><code>Carga normal: 1000 usuários<br>Pico: 5000 usuários em 10 segundos<br>Recovery: Voltar para 1000 usuários<br></code></pre></p>\n\n<h4>Ferramentas de Teste de Desempenho</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Linguagem</th><th>Melhor Para</th></tr>\n<tr><td><strong>JMeter</strong></td><td>Open Source</td><td>Java</td><td>Enterprise, complexo</td></tr>\n<tr><td><strong>Gatling</strong></td><td>Open Source</td><td>Scala</td><td>DevOps, CI/CD</td></tr>\n<tr><td><strong>k6</strong></td><td>Open Source</td><td>JavaScript</td><td>Moderno, extensível</td></tr>\n<tr><td><strong>Locust</strong></td><td>Open Source</td><td>Python</td><td>Python teams</td></tr>\n<tr><td><strong>LoadRunner</strong></td><td>Comercial</td><td>Various</td><td>Enterprise</td></tr>\n</table></figure>\n\n<h4>Exemplo de Teste de Carga com k6</h4>\n\n<pre><code>// script.js\nimport http from \'k6/http\';\nimport { check, sleep } from \'k6\';\n\n<p>export const options = {<br>  stages: [<br>    { duration: \'2m\', target: 100 },  // Ramp-up<br>    { duration: \'5m\', target: 100 },  // Steady state<br>    { duration: \'2m\', target: 200 },  // Spike<br>    { duration: \'5m\', target: 200 },  // Steady state<br>    { duration: \'2m\', target: 0 },    // Ramp-down<br>  ],<br>  thresholds: {<br>    http_req_duration: [\'p(95)&lt;500&#039;],  // 95{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das requisições &lt; 500ms<br>    http_req_failed: [\'rate&lt;0.01&#039;],     // Menos de 1{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas<br>  },<br>};</p>\n\n<p>export default function () {<br>  const res = http.get(\'https://api.exemplo.com/produtos\');<br>  check(res, {<br>    \'status é 200\': (r) =&gt; r.status === 200,<br>    \'tempo  r.timings.duration &lt; 500,<br>  });<br>  sleep(1);<br>}<br></code></pre></p>\n\n<hr>\n<h3>Teste de Segurança: Protegendo Dados e Sistemas</h3>\n\n<figure><img src=\"https://media.giphy.com/media/1qfDU4MJv3jWu34hEx/giphy.gif\" alt=\"Security Testing - Escudo de Segurança\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>O teste de segurança identifica vulnerabilidades e garante proteção de dados. Em um mundo cada vez mais digital, a segurança é prioridade.</p>\n\n<h4>Tipos de Testes de Segurança</h4>\n\n<p>##### 1. Teste de Penetração (Pen Test)</p>\n\n<p>Simula ataques para identificar vulnerabilidades antes que hackers maliciosos o façam.</p>\n\n<p><strong>Metodologias:</strong><ol><li>OWASP Testing Guide</li><br><li>PTES (Penetration Testing Execution Standard)</li><br><li>NIST SP 800-115</li><br></ol><br><strong>Tipos de Pentest:</strong><ol><li><strong>Black Box:</strong> Sem conhecimento prévio</li><br><li><strong>White Box:</strong> Código e documentação</li><br><li><strong>Gray Box:</strong> Conhecimento parcial</li><br></ol><br>##### 2. Varredura de Vulnerabilidade</p>\n\n<p>Identifica pontos fracos conhecidos através de scanning automatizado.</p>\n\n<p><strong>Ferramentas:</strong><ol><li>Nessus</li><br><li>OpenVAS</li><br><li>Qualys</li><br><li>Nexpose</li><br></ol><br>##### 3. Teste de Firewall e WAF</p>\n\n<p>Verifica configurações de segurança de firewalls e Web Application Firewalls.</p>\n\n<p><strong>O que testar:</strong><ol><li>Regras de firewall</li><br><li>Block de IPs maliciosos</li><br><li>Detecção de SQL Injection</li><br><li>Proteção XSS</li><br></ol><br>##### 4. Análise de Código Estático (SAST)</p>\n\n<p>Detecta vulnerabilidades no código-fonte sem executá-lo.</p>\n\n<p><strong>Ferramentas SAST:</strong><ol><li>SonarQube</li><br><li>Checkmarx</li><br><li>Fortify</li><br><li>Snyk Code</li><br></ol><br>##### 5. Análise de Componentes (SCA)</p>\n\n<p>Identifica vulnerabilidades em bibliotecas e dependências.</p>\n\n<p><strong>Ferramentas SCA:</strong><ol><li>Snyk</li><br><li>OWASP Dependency-Check</li><br><li>WhiteSource</li><br><li>Dependabot</li><br></ol><br><h4>OWASP Top 10: Vulnerabilidades Mais Comuns</h4><br><ol><li><strong>A01 - Broken Access Control</strong></li><br><li><strong>A02 - Cryptographic Failures</strong></li><br><li><strong>A03 - Injection</strong></li><br><li><strong>A04 - Insecure Design</strong></li><br><li><strong>A05 - Security Misconfiguration</strong></li><br><li><strong>A06 - Vulnerable Components</strong></li><br><li><strong>A07 - Authentication Failures</strong></li><br><li><strong>A08 - Software and Data Integrity Failures</strong></li><br><li><strong>A09 - Security Logging Failures</strong></li><br><li><strong>A10 - SSRF (Server-Side Request Forgery)</strong></li><br></ol><br><hr><br><h3>Teste de Usabilidade: Experiência do Usuário</h3></p>\n\n<p>Avalia a facilidade de uso e a experiência do usuário com o sistema. O teste de usabilidade é essencial para garantir que os usuários consigam realizar suas tarefas de forma eficiente.</p>\n\n<h4>Critérios de Usabilidade</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Critério</th><th>Definição</th><th>Métrica</th></tr>\n<tr><td><strong>Eficácia</strong></td><td>Usuário consegue completar tarefa?</td><td>Taxa de sucesso</td></tr>\n<tr><td><strong>Eficiência</strong></td><td>Quanto tempo leva?</td><td>Tempo de tarefa</td></tr>\n<tr><td><strong>Satisfação</strong></td><td>Usuário gostou?</td><td>Questionários SUS</td></tr>\n<tr><td><strong>Aprendizagem</strong></td><td>Quanto tempo para aprender?</td><td>Tempo até proficiência</td></tr>\n<tr><td><strong>Memorização</strong></td><td>Lembra como usar?</td><td>Retenção após pausa</td></tr>\n</table></figure>\n\n<h4>Métodos de Teste de Usabilidade</h4>\n<ol><li><strong>Testes com Usuários</strong> - Sessões gravadas com participantes</li>\n<li><strong>Análise Heurística</strong> - Avaliação por especialistas</li>\n<li><strong>Questionários</strong> - SUS, SEQ, NPS</li>\n<li><strong>Eye Tracking</strong> - Rastreamento ocular</li>\n<li><strong>Análise de Tarefas</strong> - Tempos e erros</li>\n</ol>\n<h4>Frameworks de Avaliação</h4>\n<ol><li><strong>Nielsen\'s Heurísticas</strong> (10 princípios)</li>\n<li><strong>ISO 9241-11</strong> (Usabilidade)</li>\n<li><strong>WCAG 2.1</strong> (Acessibilidade)</li>\n</ol>\n<hr>\n<h3>Teste de Compatibilidade: Funciona em Todo Lugar?</h3>\n\n<p>Verifica se o software funciona em diferentes ambientes, navegadores e dispositivos.</p>\n\n<h4>Tipos de Teste de Compatibilidade</h4>\n\n<p>##### 1. Teste de Navegador (Cross-Browser)<br><ol><li>Chrome, Firefox, Safari, Edge</li><br><li>Diferentes versões</li><br><li>Modos de compatibilidade</li><br></ol><br>##### 2. Teste Mobile<br><ol><li>iOS (iPhone, iPad)</li><br><li>Android (diferentes fabricantes)</li><br><li>Diferentes tamanhos de tela</li><br><li>Diferentes versões de OS</li><br></ol><br>##### 3. Teste de Sistema Operacional<br><ol><li>Windows 10, 11</li><br><li>macOS (versões diferentes)</li><br><li>Linux (distribuições populares)</li><br></ol><br>##### 4. Teste de Hardware<br><ol><li>Diferentes processadores</li><br><li>Diferentes quantidades de RAM</li><br><li>Diferentes resoluções de tela</li><br></ol><br><h4>Ferramentas de Teste Cross-Browser</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Cobertura</th><th>Preço</th></tr>\n<tr><td>BrowserStack</td><td>3000+ dispositivos</td><td>$29+/mês</td></tr>\n<tr><td>Sauce Labs</td><td>1000+ dispositivos</td><td>$39+/mês</td></tr>\n<tr><td>LambdaTest</td><td>3000+ dispositivos</td><td>$15+/mês</td></tr>\n<tr><td>CrossBrowserTesting</td><td>1500+ dispositivos</td><td>$29+/mês</td></tr>\n</table></figure>\n\n<hr>\n<h3>Teste de Recuperação: Resistência a Falhas</h3>\n\n<p>Avalia a capacidade do sistema de se recuperar de falhas e disasters. É crucial para sistemas críticos que não podem ficar fora do ar.</p>\n\n<h4>Cenários de Teste</h4>\n<ol><li><strong>Falha de Hardware</strong></li>\n</ol>   - Perda de disco\n   - Falha de memória\n   - Queda de servidor\n<ol><li><strong>Falha de Software</strong></li>\n</ol>   - Crash de aplicação\n   - Deadlock\n   - Exceções não tratadas\n<ol><li><strong>Falha de Rede</strong></li>\n</ol>   - Perda de conectividade\n   - Alta latência\n   - Timeout\n<ol><li><strong>Desastres</strong></li>\n</ol>   - Perda de datacenter\n   - Corrupção de dados\n   - Ataques DDoS\n\n<h4>Métricas de Recuperação</h4>\n<ol><li><strong>RTO (Recovery Time Objective):</strong> Tempo máximo para recuperação</li>\n<li><strong>RPO (Recovery Point Objective):</strong> Perda máxima de dados aceitável</li>\n<li><strong>MTBF (Mean Time Between Failures):</strong> Tempo médio entre falhas</li>\n<li><strong>MTTR (Mean Time To Repair):</strong> Tempo médio para reparo</li>\n</ol>\n<hr>\n<h2>Testes de Regressão: Mantendo a Qualidade</h2>\n\n<p>Executados sempre que o código é modificado para garantir que alterações não introduzam novos defeitos. Este é um dos tipos de teste mais importantes e frequentemente executados.</p>\n\n<h3>Quando Executar Testes de Regressão</h3>\n\n<p>✅ Após cada release de software  <br>✅ Após correção de bugs  <br>✅ Após atualizações de dependências  <br>✅ Após refactoring de código  <br>✅ Antes do deploy de produção</p>\n\n<h3>Estratégias de Testes de Regressão</h3>\n\n<h4>1. Regressão Completa</h4>\n\n<p>Executa toda a suite de testes.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura total</li><br><li>Alta confiança</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Tempo longo</li><br><li>Custo elevado</li><br></ol><br><h4>2. Regressão Seletiva</h4></p>\n\n<p>Seleciona testes relevantes baseados em mudanças.</p>\n\n<p><strong>Vantagens:</strong><ol><li>Mais rápido</li><br><li>Mais econômico</li><br></ol><br><strong>Desvantagens:</strong><ol><li>Pode perder cobertura</li><br></ol><br><h4>3. Regressão Prioritária</h4></p>\n\n<p>Executa testes por prioridade (críticos &gt; altos &gt; médios &gt; baixos).</p>\n\n<p><strong>Vantagens:</strong><ol><li>Cobertura do crítico rápido</li><br><li>Decisões baseadas em risco</li><br></ol><br><h3>Automação de Testes de Regressão</h3></p>\n\n<p>A automação é essencial para testes de regressão eficazes:</p>\n\n<p><strong>Benefícios:</strong><ol><li>Execução frequente</li><br><li>Resultados consistentes</li><br><li>Rapidez</li><br><li>Cobertura ampla</li><br></ol><br><strong>Ferramentas Recomendadas:</strong><ol><li>Selenium WebDriver</li><br><li>Playwright</li><br><li>Cypress</li><br><li>Appium (mobile)</li><br><li>RestAssured (API)</li><br></ol><br><hr><br><h2>Pirâmide de Testes: Arquitetura Ideal</h2></p>\n\n<p>A pirâmide de testes é um conceito fundamental que guia a distribuição dos tipos de teste:</p>\n\n<pre><code>                    /\n                   /  \n                  / E2E        ← Poucos testes E2E (lentos, caros)\n                 /      \n                /Integração   ← Alguns testes de integração\n               /            \n              /  Unitários     ← Muitos testes unitários (rápidos, baratos)\n             /________________\n</code></pre>\n\n<h3>Proporções Ideais</h3>\n<ol><li><strong>Unitários:</strong> 70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>Integração:</strong> 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li>\n<li><strong>E2E:</strong> 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} dos testes</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Compreender os diferentes tipos de testes de software é fundamental para construir uma estratégia de QA eficaz. Cada tipo de teste tem seu propósito específico e deve ser aplicado no momento adequado do ciclo de desenvolvimento.</p>\n\n<p><strong>Resumo dos Tipos de Testes:</strong></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Categoria</th><th>Tipo</th><th>Quando Usar</th><th>Objetivo</th></tr>\n<tr><td><strong>Funcional</strong></td><td>Unitário</td><td>Desenvolvimento</td><td>Isolar componentes</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Integração</td><td>Pós-unitário</td><td>Verificar conexões</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Sistema</td><td>Pré-produção</td><td>Validar requisitos</td></tr>\n<tr><td><strong>Funcional</strong></td><td>Aceitação</td><td>UAT</td><td>Validar com cliente</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Performance</td><td>Carga esperada</td><td>Velocidade e stability</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Segurança</td><td>Pré-produção</td><td>Proteger dados</td></tr>\n<tr><td><strong>Não-Funcional</strong></td><td>Usabilidade</td><td>Design/UX</td><td>Experiência do usuário</td></tr>\n</table></figure>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem todo projeto precisa de todos os tipos</li><br><li><strong>Priorize</strong> - Comece com unitários e integração</li><br><li><strong>Automatize</strong> - Regressão deve ser automática</li><br><li><strong>Meça</strong> - Cobertura, tempo, defeitos encontrados</li><br><li><strong>Melhore</strong> - Itere constantemente</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre Tipos de Testes</h3></p>\n\n<p><strong>P: Quantos tipos de testes existem?</strong>  <br>R: Existem dozens de tipos de testes classificados de diferentes formas. Os principais são funcionais e não-funcionais, cada um com subtipos específicos.</p>\n\n<p><strong>P: Qual a diferença entre teste de sistema e teste de aceitação?</strong>  <br>R: Teste de sistema verifica se o sistema atende aos requisitos técnicos. Teste de aceitação verifica se o sistema atende às expectativas do usuário/cliente.</p>\n\n<p><strong>P: Testes manuais podem ser substituídos por automatizados?</strong>  <br>R: Não completamente. Testes manuais são essenciais para exploratory testing, UX e cenários complexos. A automação complementa, não substitui.</p>\n\n<p><strong>P: Quando devo começar a testar?</strong>  <br>R: O mais cedo possível! O conceito de Shift-Left recomenda testes desde as primeiras fases do desenvolvimento.</p>\n\n<p><strong>P: Qual a ordem ideal de execução dos testes?</strong>  <br>R: Unitários → Integração → Sistema → Aceitação. Cada nível depende do anterior.</p>\n\n<hr>\n<em>Fonte: Selenium.dev, Atlassian, Vericode, ISTQB, OWASP</em>', 'Tipos de Testes de Software: Guia Completo com Exemplos Práticos', '', 'inherit', 'closed', 'closed', '', '179-revision-v1', '', '', '2026-07-06 23:05:52', '2026-07-07 02:05:52', '', '179', 'http://localhost:8082/ideiasti/?p=475', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('476', '0', '2026-07-06 23:05:55', '2026-07-07 02:05:55', '', 'giphy-13', '', 'inherit', 'open', 'closed', '', 'giphy-13', '', '', '2026-07-06 23:05:55', '2026-07-07 02:05:55', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-13.gif', '0', 'attachment', 'image/gif', '0');
INSERT INTO `wp_posts` VALUES ('477', '0', '2026-07-06 23:05:56', '2026-07-07 02:05:56', '<p><strong>Meta Description:</strong> Descubra como a Inteligência Artificial está revolucionando a QA: automação inteligente, geração de testes, detecção de anomalias e manutenção preditiva. Guia completo para profissionais.</p>\n\n<hr>\n<h2>Estado Atual da IA em QA</h2>\n\n<p>O <strong>World Quality Report 2025</strong> revela dados impressionantes: quase <strong>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações estão ativamente buscando GenAI</strong> em práticas de Quality Engineering (QE), mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} alcançaram implementação em escala empresarial.</p>\n\n<figure><img src=\"http://localhost:8082/ideiasti/wp-content/uploads/2026/07/giphy-13.gif\" alt=\"AI Brain - Inteligência Artificial em QA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<p>Esta lacuna entre interesse e implementação representa uma oportunidade significativa para profissionais e organizações que souberem aproveitar efetivamente essas tecnologias.</p>\n\n<hr>\n<h2>Por Que a Adoção de IA em QA Está Crescendo?</h2>\n\n<h3>Drivers de Adoção</h3>\n<ol><li><strong>Volume de testes crescente</strong> - Sistemas mais complexos exigem mais testes</li>\n<li><strong>Pressure de velocidade</strong> - CI/CD demanda execuções mais rápidas</li>\n<li><strong>Escassez de profissionais</strong> - Demanda supera oferta de testadores</li>\n<li><strong>Qualidade em produção</strong> - Necessidade de monitoramento contínuo</li>\n<li><strong>Custos crescentes</strong> - Automação inteligente reduz despesas</li>\n</ol>\n<h3>Benefícios Comprovados</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Impacto da IA</th></tr>\n<tr><td>Redução de tempo de teste</td><td>40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de custos de QA</td><td>30-50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Melhoria em cobertura</td><td>70{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Detecção precoce de bugs</td><td>3-5x mais cedo</td></tr>\n</table></figure>\n\n<hr>\n<h2>Desafios de Adoção de IA em QA</h2>\n\n<h3>1. Desalinhamento Estratégico</h3>\n\n<p>Existe um hiato crescente entre o interesse organizacional em GenAI e a prontidão real para adoção efetiva dentro de QE. O caminho da experimentação para implementação é mais complexo do que o antecipado.</p>\n\n<h4>Sinais de Desalinhamento</h4>\n\n<ul><li>GenAI vista como \"solução mágica\" sem estratégia clara</li><ol><li>Falta de alinhamento entre TI e negócios</li>\n<li>Expectativas irreais sobre capacidades</li>\n<li>Subestimação de esforço de integração</li>\n</ol>\n<h3>2. Complexidade de Implementação</h3>\n\n<p>A implementação de IA em QA requer alinhamento entre inovação operacional e oversight estratégico. Desafios incluem:</p>\n\n<h4>Desafios Técnicos</h4>\n<ol><li>Integração com sistemas legados</li>\n<li>Qualidade dos dados de treinamento</li>\n<li>Escolha de modelos adequados</li>\n<li>Manutenção de modelos em produção</li>\n</ol>\n<h4>Desafios Organizacionais</h4>\n<ol><li>Resistência cultural</li>\n<li>Falta de competências</li>\n<li>Processos não adaptados</li>\n<li>Governança de IA</li>\n</ol>\n<h3>3. Questões Éticas e de Governança</h3>\n<ol><li>Viés em modelos de IA</li>\n<li>Transparência nas decisões</li>\n<li>Responsabilidade por falhas</li>\n<li>Conformidade regulatória</li>\n</ol>\n<hr>\n<h2>Aplicações de IA em QA: Casos de Uso Detalhados</h2>\n\n<h3>1. Geração Automatizada de Testes</h3>\n\n<p>IA pode gerar casos de teste automaticamente baseados em requisitos e código. Esta é uma das aplicações mais promissoras.</p>\n\n<figure><img src=\"https://media.giphy.com/media/VbZ0cWw6cVPMM/giphy.gif\" alt=\"Automação de Testes com IA\" style=\"max-width:100{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442};height:auto\" /></figure>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Requisitos → Análise de NLP → Cenários de Teste → Casos de Teste\n    ↓                                                        ↓\n Código → Análise Estática → Cobertura → Testes Sugeridos\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Funcionalidade</th><th>Fabricante</th></tr>\n<tr><td><strong>Diffblue</strong></td><td>Geração automática de unit tests</td><td>Diffblue</td></tr>\n<tr><td><strong>Testim</strong></td><td>Testes E2E com IA</td><td>Testim.io</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Plataforma inteligente</td><td>Functionize</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>Automação sem código com IA</td><td>Avo Automation</td></tr>\n</table></figure>\n\n<h4>Exemplo: Geração de Testes com GenAI</h4>\n\n<pre><code># Exemplo conceitual de como IA pode gerar testes\nimport openai\n\n<p>def gerar_testes_para_requisito(requisito):<br>    prompt = f\"\"\"<br>    Gere casos de teste para o seguinte requisito:</p>\n\n<p>Requisito: {requisito}</p>\n\n<p>Formato de saída (JSON):<br>    {{<br>        \"casos_de_teste\": [<br>            {{<br>                \"id\": \"CT-001\",<br>                \"titulo\": \"...\",<br>                \"pre_condicoes\": [...],<br>                \"passos\": [...],<br>                \"dados_teste\": {{...}},<br>                \"resultado_esperado\": \"...\"<br>            }}<br>        ]<br>    }}<br>    \"\"\"</p>\n\n<p>response = openai.chat.completions.create(<br>        model=\"gpt-4\",<br>        messages=[{\"role\": \"user\", \"content\": prompt}]<br>    )</p>\n\n<p>return json.loads(response.choices[0].message.content)<br></code></pre></p>\n\n<h3>2. Detecção de Anomalias</h3>\n\n<p>Algoritmos de machine learning identificam padrões incomuns que indicam defeitos, revolucionando o monitoramento de qualidade.</p>\n\n<h4>Técnicas Utilizadas</h4>\n\n<p>##### Análise de Séries Temporais<br><ol><li>Identificação de anomalias em métricas de performance</li><br><li>Detecção de degradação gradual</li><br><li>Alertas proativos sobre problemas</li><br></ol><br>##### Clustering<br><ol><li>Agrupamento de testes similares</li><br><li>Identificação de testes atípicos</li><br><li>Detecção de padrões de falha</li><br></ol><br>##### Redes Neurais<br><ol><li>Detecção de padrões complexos</li><br><li>Aprendizado de comportamentos normais</li><br><li>Previsão de falhas</li><br></ol><br><h4>Ferramentas de Detecção de Anomalias</h4></p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tipo</th><th>Aplicação</th></tr>\n<tr><td><strong>Elastic APM</strong></td><td>APM</td><td>Detecção de anomalias em produção</td></tr>\n<tr><td><strong>Datadog</strong></td><td>Monitoring</td><td>ML para métricas</td></tr>\n<tr><td><strong>New Relic</strong></td><td>APM</td><td>Detecção inteligente</td></tr>\n<tr><td><strong>Grafana + Loki</strong></td><td>Logging</td><td>Análise de logs com ML</td></tr>\n</table></figure>\n\n<h3>3. Manutenção Inteligente de Testes</h3>\n\n<p>IA ajuda a identificar e remover testes obsoletos ou flaky, mantendo a suite de testes saudável.</p>\n\n<h4>Problemas que a IA Resolve</h4>\n\n<p><strong>Testes Flaky (Instáveis)</strong><br><ol><li>Identificação de padrões que causam instabilidade</li><br><li>Predição de quais testes podem falhar</li><br><li>Sugestões de correções</li><br><li>Quarentena automática</li><br></ol><br><strong>Testes Obsoletos</strong><br><ol><li>Detecção de funcionalidades removidas</li><br><li>Identificação de código não coberto</li><br><li>Sugestões de remoção segura</li><br></ol><br><h4>Exemplo de Detecção de Testes Flaky</h4></p>\n\n<pre><code># Sistema simplificado de detecção de testes flaky\nclass FlakyTestDetector:\n    def __init__(self):\n        self.test_history = {}\n        self.ml_model = load_trained_model()\n\n<p>def analyze_test(self, test_name, execution_history):<br>        features = self.extract_features(execution_history)<br>        flaky_probability = self.ml_model.predict_proba([features])[0]</p>\n\n<p>if flaky_probability &gt; 0.7:<br>            return {<br>                \"test\": test_name,<br>                \"flaky_probability\": flaky_probability,<br>                \"recommendation\": \"QUARANTINE\",<br>                \"reasons\": self.explain_prediction(features)<br>            }<br>        return {\"test\": test_name, \"flaky_probability\": flaky_probability}</p>\n\n<p>def extract_features(self, history):<br>        return [<br>            history.success_rate,<br>            history.avg_duration,<br>            history.recent_failures,<br>            history.environment_changes,<br>            history.dependency_changes<br>        ]<br></code></pre></p>\n\n<h3>4. Análise de Código Estático com IA</h3>\n\n<p>Identifica potenciais problemas de qualidade antes da execução, usando análise semântica avançada.</p>\n\n<h4>Capacidades Avançadas</h4>\n<ol><li><strong>Detecção de vulnerabilidades</strong> - OWASP Top 10</li>\n<li><strong>Análise de dependências</strong> - Bibliotecas desatualizadas</li>\n<li><strong>Code smells</strong> - Padrões problemáticos</li>\n<li><strong>Débito técnico</strong> - Métricas de qualidade</li>\n</ol>\n<h4>Ferramentas com IA</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Capacidades IA</th><th>Integração</th></tr>\n<tr><td><strong>SonarQube</strong></td><td>Débito técnico, code smells</td><td>CI/CD</td></tr>\n<tr><td><strong>Snyk</strong></td><td>Vulnerabilidades, licenças</td><td>IDE, CI</td></tr>\n<tr><td><strong>CodeClimate</strong></td><td>Quality, maintainability</td><td>GitHub</td></tr>\n<tr><td><strong>DeepSource</strong></td><td>Análise estática com ML</td><td>Git</td></tr>\n</table></figure>\n\n<h3>5. Testes Visuais Automatizados</h3>\n\n<p>Comparação de interfaces visuais usando visão computacional para detectar regressões.</p>\n\n<h4>Como Funciona</h4>\n\n<pre><code>Página Capturada → Modelo de Visão Computacional → Comparação com Baseline\n     ↓                          ↓                                    ↓\n  Screenshots           Detecção de Elementos           Diff Visual\n                                            ↓\n                                    Alertas de Regressão\n</code></pre>\n\n<h4>Ferramentas Líderes</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Tecnologia</th><th>Diferencial</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Visual AI</td><td>99.9{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de precisão</td></tr>\n<tr><td><strong> Percy</strong></td><td>Visual testing</td><td>Integração simples</td></tr>\n<tr><td><strong>Chromatic</strong></td><td>Visual regression</td><td>Para Storybook</td></tr>\n<tr><td><strong>Lost Pixel</strong></td><td>Open source</td><td>Self-hosted</td></tr>\n</table></figure>\n\n<h3>6. Oráculos de Teste Baseados em IA</h3>\n\n<p>Validação de resultados usando modelos treinados para determinar se o comportamento está correto.</p>\n\n<h4>Tipos de Oráculos</h4>\n<ol><li><strong>Oráculo de Imagem</strong> - Validação visual de UI</li>\n<li><strong>Oráculo de Texto</strong> - Análise de conteúdo</li>\n<li><strong>Oráculo de Comportamento</strong> - Detecção de anomalias</li>\n<li><strong>Oráculo de Dados</strong> - Validação de datasets</li>\n</ol>\n<hr>\n<h2>Ferramentas de IA para QA: Comparativo</h2>\n\n<h3>Plataformas Completas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Testim</strong></td><td>Automação inteligente E2E</td><td>$600+/mês</td><td>Equipes enterprise</td></tr>\n<tr><td><strong>Functionize</strong></td><td>Automação com ML</td><td>Sob consulta</td><td>Escala enterprise</td></tr>\n<tr><td><strong>Mabl</strong></td><td>Automação inteligente</td><td>$500+/mês</td><td>CI/CD integrado</td></tr>\n<tr><td><strong>Avo Assure</strong></td><td>No-code com IA</td><td>Sob consulta</td><td>Enterprise</td></tr>\n<tr><td><strong>Perfecto</strong></td><td>Testes mobile/web com IA</td><td>Sob consulta</td><td>Mobile testing</td></tr>\n</table></figure>\n\n<h3>Ferramentas Especializadas</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Foco</th><th>Preço</th><th>Melhor Para</th></tr>\n<tr><td><strong>Applitools</strong></td><td>Testes visuais</td><td>$100+/mês</td><td>UI testing</td></tr>\n<tr><td><strong>Diffblue</strong></td><td>Unit tests</td><td>$299/assinante</td><td>Dev teams</td></tr>\n<tr><td><strong>Snyk</strong></td><td>SCA</td><td>Grátis + Pro</td><td>Developers</td></tr>\n<tr><td><strong>SonarCloud</strong></td><td>SAST</td><td>Grátis + Pro</td><td>CI/CD</td></tr>\n</table></figure>\n\n<h3>Ferramentas Emerging (2025-2026)</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ferramenta</th><th>Descrição</th><th>Status</th></tr>\n<tr><td><strong>CodiumAI</strong></td><td>Testes gerados automaticamente</td><td>Beta</td></tr>\n<tr><td><strong>Mutable AI</strong></td><td>Code review + tests</td><td>Beta</td></tr>\n<tr><td><strong>Dagger</strong></td><td>CI/CD programável</td><td>GA</td></tr>\n<tr><td><strong>Trunk</strong></td><td>Linting inteligente</td><td>GA</td></tr>\n</table></figure>\n\n<hr>\n<h2>Implementando IA em QA: Roadmap Prático</h2>\n\n<h3>Fase 1: Avaliação e Planejamento (1-2 meses)</h3>\n\n<h4>Checklist de Avaliação</h4>\n<ol><li>[ ] Mapeamento de processos atuais de QA</li>\n<li>[ ] Identificação de pontos de dor</li>\n<li>[ ] Análise de ROI potencial</li>\n<li>[ ] Avaliação de maturidade tecnológica</li>\n<li>[ ] Levantamento de stakeholders</li>\n</ol>\n<h4>Métricas de Baseline</h4>\n\n<p>Antes de implementar, estabeleça métricas de referência:</p>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Métrica</th><th>Como Medir</th><th>Ferramenta</th></tr>\n<tr><td>Tempo de teste</td><td>Duração de suite</td><td>CI/CD logs</td></tr>\n<tr><td>Cobertura de teste</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de código testado</td><td>Coverage tools</td></tr>\n<tr><td>Taxa de defeitos</td><td>Bugs em produção</td><td>Bug tracker</td></tr>\n<tr><td>Testes flaky</td><td>{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de falhas instáveis</td><td>CI/CD</td></tr>\n<tr><td>Custo de QA</td><td>$/teste executado</td><td>Financeiro</td></tr>\n</table></figure>\n\n<h3>Fase 2: Pilot (2-3 meses)</h3>\n\n<h4>Escolha do Piloto</h4>\n\n<p>Selecione um projeto ou área com:<br><ol><li>✅ Escopo controlado</li><br><li>✅ Equipe aberta a inovação</li><br><li>✅ Processos definidos</li><br><li>✅ Métricas disponíveis</li><br></ol><br><h4>Pilotos Recomendados</h4><br><ol><li><strong>Geração de unit tests</strong> - Diffblue, CodiumAI</li><br><li><strong>Testes visuais</strong> - Applitools</li><br><li><strong>Detecção de flaky tests</strong> - Ferramentas de CI</li><br><li><strong>Análise estática</strong> - SonarQube, Snyk</li><br></ol><br><h3>Fase 3: Expansão (3-6 meses)</h3></p>\n\n<h4>Escalar Sucesso</h4>\n<ol><li>Documente aprendizados</li>\n<li>Treine outras equipes</li>\n<li>Padronize processos</li>\n<li>Melhore integrações</li>\n</ol>\n<h4>KPIs de Sucesso</h4>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>KPI</th><th>Meta (6 meses)</th></tr>\n<tr><td>Redução de tempo de teste</td><td>30-40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Aumento de cobertura</td><td>20-30{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de testes flaky</td><td>50{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>Redução de defeitos em prod</td><td>25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}</td></tr>\n<tr><td>ROI positivo</td><td>Sim</td></tr>\n</table></figure>\n\n<h3>Fase 4: Maturidade (6-12 meses)</h3>\n\n<h4>Implementação Enterprise</h4>\n<ol><li>Integração completa com CI/CD</li>\n<li>IA em produção (monitoramento)</li>\n<li>Maintenance automatizado</li>\n<li>Reporting avançado</li>\n</ol>\n<hr>\n<h2>Futuro da IA em QA: Tendências 2026-2028</h2>\n\n<h3>1. Testes Autônomos</h3>\n\n<p>Sistemas que automaticamente:<br><ol><li>Geram testes baseados em requisitos</li><br><li>Executam testes continuamente</li><br><li>Detectam e reportam falhas</li><br><li>Propõem correções</li><br></ol><br><h3>2. Manutenção Preditiva</h3></p>\n\n<p>IA que prevê:<br><ol><li>Quando testes vão falhar</li><br><li>Quando código precisa de mais testes</li><br><li>Quando componentes estão em risco</li><br><li>Quando fazer refactoring</li><br></ol><br><h3>3. GenAI Nativa em QA</h3></p>\n\n<p>Modelos treinados especificamente para:<br><ol><li>Entender código e testes</li><br><li>Gerar código de teste</li><br><li>Analisar requisitos</li><br><li>Documentar testes</li><br></ol><br><h3>4. Testes em Produção com IA</h3></p>\n\n<p>Monitoramento inteligente:<br><ol><li>Detecção de anomalias em produção</li><br><li>Geração automática de testes de regressão</li><br><li>Validação de deployments</li><br><li>Root cause analysis</li><br></ol><br><hr><br><h2>Considerações Éticas e Best Practices</h2></p>\n\n<h3>Governança de IA em QA</h3>\n\n<h4>Princípios</h4>\n<ol><li><strong>Transparência</strong> - Documente como a IA toma decisões</li>\n<li><strong>Responsabilidade</strong> - Humanos mantêm responsabilidade final</li>\n<li><strong>Fairness</strong> - Evite viés em modelos</li>\n<li><strong>Privacidade</strong> - Proteja dados sensíveis</li>\n<li><strong>Segurança</strong> - Proteja modelos contra ataques</li>\n</ol>\n<h4>Checklist de Governança</h4>\n<ol><li>[ ] Política de uso de IA em QA documentada</li>\n<li>[ ] Processos de revisão de decisões de IA</li>\n<li>[ ] Documentação de modelos utilizados</li>\n<li>[ ] Plano de contingência para falhas de IA</li>\n<li>[ ] Treinamento de equipe em uso responsável</li></ol></ul>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>A IA está transformando fundamentalmente a QA, oferecendo oportunidades sem precedentes para aumentar eficiência, cobertura e qualidade. Embora a adoção em escala ainda seja um desafio, organizações que investem estrategicamente em IA para QA estão obtendo vantagens competitivas significativas.</p>\n\n<p><strong>Resumo dos Principais Aprendizados:</strong></p>\n\n<p>✅ IA pode reduzir tempo de teste em 40-60{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}  <br>✅ GenAI está sendo buscada por 90{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} das organizações, mas apenas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} implementaram em escala  <br>✅ Ferramentas como Playwright, Applitools e Testim estão liderando a adoção  <br>✅ Implementação requer estratégia, não apenas ferramentas  <br>✅ Futuro aponta para testes autônomos e manutenção preditiva</p>\n\n<p><strong>Próximos Passos:</strong><br><ol><li><strong>Avalie seu contexto</strong> - Nem toda organização precisa de todas as capacidades</li><br><li><strong>Comece pequeno</strong> - Pilotos controlados são mais eficazes</li><br><li><strong>Meça resultados</strong> - Métricas são essenciais</li><br><li><strong>Treine sua equipe</strong> - Competências em IA são necessárias</li><br><li><strong>Governarize</strong> - Adote práticas éticas desde o início</li><br></ol><br><hr><br><h3>FAQ - Perguntas Frequentes sobre IA em QA</h3></p>\n\n<p><strong>P: A IA vai substituir testadores humanos?</strong>  <br>R: Não. A IA complementa o trabalho humano, permitindo que testadores foquem em atividades estratégicas, exploratory testing e design de testes.</p>\n\n<p><strong>P: Qual é o ROI da implementação de IA em QA?</strong>  <br>R: O ROI típico é de 200-500{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} em 12-18 meses, considerando redução de tempo de teste, aumento de cobertura e redução de defeitos em produção.</p>\n\n<p><strong>P: Preciso de especialistas em dados para implementar IA em QA?</strong>  <br>R: Não necessariamente. Muitas ferramentas são \"plug-and-play\" e não requerem conhecimento de ML. No entanto, para implementações avançadas, especialistas são úteis.</p>\n\n<p><strong>P: Quais são os principais riscos do uso de IA em QA?</strong>  <br>R: Os principais riscos incluem: dependência excessiva, viés em modelos, falta de transparência e custos inesperados de manutenção.</p>\n\n<p><strong>P: Quando devo começar a usar IA em QA?</strong>  <br>R: Se você tem mais de 100 testes automatizados ou gastando mais de 20 horas/semana em QA, é um bom momento para avaliar ferramentas de IA.</p>\n\n<hr>\n<em>Fonte: World Quality Report 2025, Software Testing Magazine, Gartner Research, IEEE Software</em>', 'Inteligência Artificial em Quality Assurance: Guia Completo para 2025-2026', '', 'inherit', 'closed', 'closed', '', '181-revision-v1', '', '', '2026-07-06 23:05:56', '2026-07-07 02:05:56', '', '181', 'http://localhost:8082/ideiasti/?p=477', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('479', '0', '2026-07-06 23:11:19', '2026-07-07 02:11:19', '<h2>Quem Somos</h2>\n\n<p>O <strong>Blog Ideiasti</strong> é uma plataforma educacional dedicada ao universo da Qualidade de Software e Testes de Software. Nascemos com o propósito de democratizar o conhecimento sobre QA, tornando acessível a profissionais, estudantes e empresas as melhores práticas e tendências do mercado.</p>\n\n<p>Nossa missão é <strong>transformar a forma como pensamos e praticamos a qualidade de software</strong>, contribuindo para a formação de profissionais mais capacitados e organizações mais competitivas.</p>\n\n<hr>\n<h2>Nossa História</h2>\n\n<h3>O Início</h3>\n\n<p>O Blog Ideiasti surgiu da necessidade de centralizar conteúdo de qualidade sobre Quality Assurance em português. Enquanto existiam diversos recursos em inglês, a comunidade brasileira carecia de uma fonte confiável e atualizada.</p>\n\n<h3>Nossa Evolução</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Ano</th><th>Marco</th></tr>\n<tr><td><strong>2024</strong></td><td>Fundação do Blog Ideiasti</td></tr>\n<tr><td><strong>2024</strong></td><td>Primeiros 10 artigos publicados</td></tr>\n<tr><td><strong>2025</strong></td><td>Expansão para 40+ artigos especializados</td></tr>\n<tr><td><strong>2026</strong></td><td>Conteúdo contínuo e comunidade ativa</td></tr>\n</table></figure>\n\n<h3>Nossa Visão</h3>\n\n<p>Ser a <strong>principal referência em Qualidade de Software em português</strong>, abrangendo desde conceitos fundamentais até técnicas avançadas e emergentes.</p>\n\n<hr>\n<h2>O Que Oferecemos</h2>\n\n<h3>Conteúdo Especializado</h3>\n\n<p>Produzimos conteúdo educacional em diversas áreas:</p>\n\n<ul><li><strong>Fundamentos de QA</strong> — Conceitos, metodologias e padrões</li><ol><li><strong>Automação de Testes</strong> — Frameworks, ferramentas e estratégias</li>\n<li><strong>Testes Ágeis</strong> — Scrum, Kanban, XP e práticas DevOps</li>\n<li><strong>Testes de Performance</strong> — Load, stress e endurance testing</li>\n<li><strong>Testes de Segurança</strong> — OWASP, penetration testing</li>\n<li><strong>Tendências</strong> — IA, GenAI, continuous testing</li>\n</ol>\n<h3>Nossos Diferenciais</h3>\n\n<figure class=\"wp-block-table\"><table>\n<tr><th>Diferencial</th><th>Descrição</th></tr>\n<tr><td><strong>Profundo</strong></td><td>Artigos técnicos detalhados e atualizados</td></tr>\n<tr><td><strong>Prático</strong></td><td>Exemplos reais e casos de uso</td></tr>\n<tr><td><strong>Atualizado</strong></td><td>Conteúdo alinhado com as tendências do mercado</td></tr>\n<tr><td><strong>Gratuito</strong></td><td>Todo conteúdo acessível sem custo</td></tr>\n<tr><td><strong>Em Português</strong></td><td>Linguagem nativa para brasileiros</td></tr>\n</table></figure>\n\n<hr>\n<h2>Metodologia de Conteúdo</h2>\n\n<h3>Como Criamos Artigos</h3>\n\n<p>Nosso processo editorial:<br><ol><li><strong>Pesquisa</strong> — Fontes confiáveis e atualizadas</li><br><li><strong>Estruturação</strong> — Organização lógica e didática</li><br><li><strong>Revisão</strong> — Verificação técnica e editorial</li><br><li><strong>Publicação</strong> — Formatação otimizada para SEO</li><br><li><strong>Atualização</strong> — Manutenção contínua do conteúdo</li><br></ol><br><h3>Nossas Fontes</h3></p>\n\n<p>Baseamos nosso conteúdo em:<br><ol><li><strong>Padrões Internacionais</strong> — ISO/IEC 25010, IEEE</li><br><li><strong>Frameworks Reconhecidos</strong> — ISTQB, CMMI</li><br><li><strong>Pesquisas de Mercado</strong> — Gartner, Forrester, World Quality Report</li><br><li><strong>Comunidade Técnica</strong> — Especialistas e profissionais do mercado</li><br><li><strong>Experiência Prática</strong> — Casos reais e melhores práticas</li><br></ol><br><hr><br><h2>Para Quem É o Blog</h2></p>\n\n<h3>Profissionais de TI</h3>\n\n<p>Se você é <strong>desenvolvedor, QA engineer, test analyst ou manager</strong>, encontrará:<br><ol><li>Estratégias avançadas de teste</li><br><li>Comparativos de ferramentas</li><br><li>Boas práticas de mercado</li><br><li>Preparação para certificações</li><br></ol><br><h3>Estudantes</h3></p>\n\n<p>Se você está <strong>aprendendo sobre QA</strong>, encontrará:<br><ol><li>Conceitos fundamentais explicados</li><br><li>Tutoriais passo a passo</li><br><li>Glossários e referências</li><br><li>Caminho de aprendizagem</li><br></ol><br><h3>Empresas</h3></p>\n\n<p>Se você representa uma <strong>empresa ou startup</strong>, encontrará:<br><ol><li>Cases de sucesso</li><br><li>ROI de qualidade de software</li><br><li>Estratégias de implementação</li><br><li>Métricas e KPIs</li></ol></ul></p>\n\n<hr>\n<h2>Entre em Contato</h2>\n\n<p>Estamos sempre abertos para ouvir você:</p>\n\n<p><strong>Blog Ideiasti</strong><br>E-mail: contato@ideiasti.com<br>Website: www.ideiasti.com</p>\n\n<hr>\n<h2>Junte-se a Nós</h2>\n\n<p>A qualidade de software é uma <strong>jornada, não um destino</strong>. Comece hoje mesmo a explorar nosso conteúdo e faça parte da nossa comunidade.</p>\n\n<p><strong>Obrigado por escolher o Blog Ideiasti como seu guia em Qualidade de Software!</strong></p>\n\n<hr>\n<em>Última atualização: Julho de 2026</em>', 'Sobre o Blog Ideiasti', '', 'inherit', 'closed', 'closed', '', '53-revision-v1', '', '', '2026-07-06 23:11:19', '2026-07-07 02:11:19', '', '53', 'http://localhost:8082/ideiasti/?p=479', '0', 'revision', '', '0');
INSERT INTO `wp_posts` VALUES ('480', '0', '2026-07-06 23:13:50', '2026-07-07 02:13:50', '<h2>Introdução</h2>\n\n<p>A automação de testes sempre foi um pilar essencial para garantir qualidade, velocidade e confiabilidade no desenvolvimento de software. Porém, o cenário mudou radicalmente nos últimos anos: a Inteligência Artificial deixou de ser um conceito futurista e passou a atuar como força motriz na evolução dos testes automatizados. Hoje, IA não é apenas um complemento — é um multiplicador de eficiência que redefine como equipes desenvolvem, validam e mantêm sistemas.<br><hr><br><h2>Desenvolvimento</h2></p>\n\n<p>A implementação de Inteligência Artificial nos testes automatizados exige uma abordagem estratégica que combine tecnologia, metodologia e cultura organizacional. O primeiro passo é compreender que IA não substitui o processo de QA tradicional, mas o potencializa. O desenvolvimento de uma arquitetura de testes inteligente começa pela integração entre ferramentas de automação e modelos de aprendizado de máquina capazes de interpretar padrões de falhas e sugerir melhorias contínuas.</p>\n\n<p>Durante o desenvolvimento, é essencial definir pipelines de CI/CD que incorporem módulos de IA para análise de regressão, priorização de testes e detecção de anomalias. Esses módulos podem ser treinados com dados históricos de execução, relatórios de bugs e métricas de desempenho, permitindo que o sistema aprenda e se adapte a cada nova versão do software.</p>\n\n<p>Outro ponto crítico é a integração entre IA e frameworks de teste como Selenium, Cypress ou Playwright. A IA pode gerar scripts automaticamente, identificar elementos dinâmicos na interface e ajustar os testes conforme o comportamento do usuário. Isso reduz drasticamente o tempo de manutenção e aumenta a confiabilidade dos resultados.</p>\n\n<p>Por fim, o sucesso do desenvolvimento depende da colaboração entre desenvolvedores, analistas de QA e cientistas de dados. Essa sinergia garante que os modelos de IA sejam alimentados com dados relevantes e que as decisões automatizadas estejam alinhadas aos objetivos de negócio. O resultado é um ciclo de testes mais inteligente, autônomo e escalável — capaz de acompanhar o ritmo acelerado da inovação tecnológica.</p>\n\n<hr>\n<h3>Tópico 1</h3>\n<ol><li>O salto dos testes tradicionais para testes inteligentes</li>\n</ol>Os testes automatizados tradicionais dependem de scripts rígidos, cenários pré-definidos e manutenção constante. Eles funcionam bem, mas têm limitações claras:\n\n<p>Quebram facilmente quando a interface muda</p>\n\n<p>Exigem grande esforço de manutenção</p>\n\n<p>Não conseguem prever cenários não mapeados</p>\n\n<p>Não aprendem com execuções anteriores</p>\n\n<p>A IA muda esse paradigma ao introduzir testes adaptativos, geração automática de casos, análise preditiva e detecção inteligente de falhas.</p>\n\n<hr>\n<h3>Tópico 2</h3>\n<ol><li>Como a IA transforma o ciclo de testes</li>\n</ol>Geração automática de casos de teste\nModelos de IA analisam requisitos, código-fonte e histórico de bugs para criar casos de teste completos, cobrindo cenários que humanos frequentemente ignoram.\nIsso reduz o tempo de planejamento e aumenta a cobertura de forma significativa.\n\n<p>Testes autossustentáveis<br>Ferramentas baseadas em IA identificam mudanças na interface ou no fluxo do sistema e ajustam automaticamente os scripts.<br>O resultado: menos testes quebrados e menos retrabalho.</p>\n\n<p>Detecção inteligente de falhas<br>Em vez de simplesmente apontar que “algo falhou”, a IA correlaciona logs, métricas e comportamento do sistema para sugerir a causa raiz.<br>Isso acelera o diagnóstico e reduz o tempo médio de resolução.</p>\n\n<p>Análise preditiva<br>Com base em dados históricos, a IA prevê áreas do sistema mais propensas a falhas, permitindo priorização inteligente e testes direcionados.</p>\n\n<hr><ol><li>Exemplos práticos de implementação</li>\n</ol>a) Testes de UI com visão computacional\nA IA interpreta elementos visuais da interface como um usuário humano faria, tornando testes mais resilientes a mudanças de layout.\n\n<p>b) Testes de API com modelos de linguagem<br>Modelos de IA geram payloads complexos, simulam comportamentos inesperados e validam respostas com base em padrões aprendidos.</p>\n\n<p>c) Testes de performance com análise comportamental<br>A IA identifica gargalos antes que eles se tornem críticos, simulando cargas realistas baseadas em uso real.</p>\n\n<hr><ol><li>Benefícios concretos para equipes de desenvolvimento</li>\n</ol>Redução de até 40{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} no tempo de criação de testes\n\n<p>Cobertura ampliada sem aumento de esforço humano</p>\n\n<p>Menos falhas em produção</p>\n\n<p>Ciclos de entrega mais rápidos</p>\n\n<p>Menos dependência de especialistas em QA para tarefas repetitivas</p>\n\n<p>A IA libera o time para focar no que realmente importa: estratégia, arquitetura e inovação.</p>\n\n<hr><ol><li>Desafios e cuidados necessários</li>\n</ol>Nem tudo são flores — e é importante reconhecer isso.\n\n<p>Modelos de IA precisam de dados de qualidade</p>\n\n<p>A implementação exige mudança cultural</p>\n\n<p>Ferramentas inteligentes ainda podem gerar falsos positivos</p>\n\n<p>A supervisão humana continua indispensável</p>\n\n<p>IA não substitui profissionais de QA; ela amplia suas capacidades.</p>\n\n<hr><ol><li>O futuro dos testes automatizados</li>\n</ol>O caminho aponta para:\n\n<p>Testes totalmente autônomos, capazes de aprender continuamente</p>\n\n<p>Integração nativa com pipelines DevOps</p>\n\n<p>Ambientes de teste gerados automaticamente</p>\n\n<p>Simulações avançadas com agentes inteligentes</p>\n\n<p>A IA não é mais tendência — é o novo padrão.</p>\n\n<hr>\n<h2>Conclusão</h2>\n\n<p>Testes automatizados com IA representam uma revolução silenciosa, porém profunda. Eles elevam a qualidade, reduzem custos e aceleram entregas. Para empresas que buscam competitividade, adotar IA nos testes não é mais opcional: é estratégico.</p>\n\n<hr>\n<em>Última atualização: julho de 2026</em>', 'Testes Automatizados com Implementação de IA: A Nova Era da Qualidade de Software', '', 'publish', 'open', 'open', '', '41testesautomatizadoscomimplementacaodeiaanovaeradaqualidadedesoftware', '', '', '2026-07-06 23:13:50', '2026-07-07 02:13:50', '', '0', 'http://localhost:8082/ideiasti/41testesautomatizadoscomimplementacaodeiaanovaeradaqualidadedesoftware/', '0', 'post', '', '0');
INSERT INTO `wp_posts` VALUES ('481', '0', '2026-07-06 23:17:12', '2026-07-07 02:17:12', '', 'TestesIA-1', '', 'inherit', 'open', 'closed', '', 'testesia-1', '', '', '2026-07-06 23:17:12', '2026-07-07 02:17:12', '', '0', 'http://localhost:8082/ideiasti/wp-content/uploads/2026/07/TestesIA-1.png', '0', 'attachment', 'image/png', '0');

DROP TABLE IF EXISTS `wp_term_relationships`;
CREATE TABLE `wp_term_relationships` (
  `object_id` bigint(20) unsigned NOT NULL DEFAULT 0,
  `term_taxonomy_id` bigint(20) unsigned NOT NULL DEFAULT 0,
  `term_order` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`object_id`,`term_taxonomy_id`),
  KEY `term_taxonomy_id` (`term_taxonomy_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

INSERT INTO `wp_term_relationships` VALUES ('1', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('3', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('7', '2', '0');
INSERT INTO `wp_term_relationships` VALUES ('9', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('10', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('11', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('12', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('13', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('14', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('15', '7', '0');
INSERT INTO `wp_term_relationships` VALUES ('16', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('17', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('18', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('19', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('20', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('21', '9', '0');
INSERT INTO `wp_term_relationships` VALUES ('22', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('23', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('24', '10', '0');
INSERT INTO `wp_term_relationships` VALUES ('25', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('26', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('27', '11', '0');
INSERT INTO `wp_term_relationships` VALUES ('28', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('30', '12', '0');
INSERT INTO `wp_term_relationships` VALUES ('33', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('34', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('35', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('36', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('37', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('38', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('39', '7', '0');
INSERT INTO `wp_term_relationships` VALUES ('40', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('41', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('42', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('43', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('44', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('45', '9', '0');
INSERT INTO `wp_term_relationships` VALUES ('46', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('47', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('48', '10', '0');
INSERT INTO `wp_term_relationships` VALUES ('49', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('50', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('51', '11', '0');
INSERT INTO `wp_term_relationships` VALUES ('52', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('53', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('56', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('57', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('58', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('59', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('60', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('61', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('62', '7', '0');
INSERT INTO `wp_term_relationships` VALUES ('63', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('64', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('65', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('66', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('67', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('68', '9', '0');
INSERT INTO `wp_term_relationships` VALUES ('69', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('70', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('71', '10', '0');
INSERT INTO `wp_term_relationships` VALUES ('72', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('73', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('74', '11', '0');
INSERT INTO `wp_term_relationships` VALUES ('75', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('136', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('138', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('140', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('142', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('144', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('146', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('148', '7', '0');
INSERT INTO `wp_term_relationships` VALUES ('150', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('152', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('154', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('156', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('158', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('160', '9', '0');
INSERT INTO `wp_term_relationships` VALUES ('162', '8', '0');
INSERT INTO `wp_term_relationships` VALUES ('164', '3', '0');
INSERT INTO `wp_term_relationships` VALUES ('166', '10', '0');
INSERT INTO `wp_term_relationships` VALUES ('168', '4', '0');
INSERT INTO `wp_term_relationships` VALUES ('170', '5', '0');
INSERT INTO `wp_term_relationships` VALUES ('172', '11', '0');
INSERT INTO `wp_term_relationships` VALUES ('174', '6', '0');
INSERT INTO `wp_term_relationships` VALUES ('176', '1', '0');
INSERT INTO `wp_term_relationships` VALUES ('177', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('178', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('179', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('180', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('181', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('182', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('183', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('184', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('185', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('186', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('187', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('188', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('189', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('190', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('191', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('192', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('193', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('194', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('195', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('196', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('197', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('198', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('199', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('200', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('201', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('202', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('203', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('204', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('205', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('206', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('207', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('208', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('209', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('210', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('211', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('212', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('213', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('214', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('215', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('216', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('217', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('218', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('281', '18', '0');
INSERT INTO `wp_term_relationships` VALUES ('282', '18', '0');
INSERT INTO `wp_term_relationships` VALUES ('283', '18', '0');
INSERT INTO `wp_term_relationships` VALUES ('284', '17', '0');
INSERT INTO `wp_term_relationships` VALUES ('285', '17', '0');
INSERT INTO `wp_term_relationships` VALUES ('286', '17', '0');
INSERT INTO `wp_term_relationships` VALUES ('287', '17', '0');
INSERT INTO `wp_term_relationships` VALUES ('288', '17', '0');
INSERT INTO `wp_term_relationships` VALUES ('289', '17', '0');
INSERT INTO `wp_term_relationships` VALUES ('336', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('337', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('338', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('342', '19', '0');
INSERT INTO `wp_term_relationships` VALUES ('452', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('457', '14', '0');
INSERT INTO `wp_term_relationships` VALUES ('458', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('459', '15', '0');
INSERT INTO `wp_term_relationships` VALUES ('480', '14', '0');

DROP TABLE IF EXISTS `wp_term_taxonomy`;
CREATE TABLE `wp_term_taxonomy` (
  `term_taxonomy_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `term_id` bigint(20) unsigned NOT NULL DEFAULT 0,
  `taxonomy` varchar(32) NOT NULL DEFAULT '',
  `description` longtext NOT NULL,
  `parent` bigint(20) unsigned NOT NULL DEFAULT 0,
  `count` bigint(20) NOT NULL DEFAULT 0,
  PRIMARY KEY (`term_taxonomy_id`),
  UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`),
  KEY `taxonomy` (`taxonomy`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

INSERT INTO `wp_term_taxonomy` VALUES ('1', '1', 'category', '', '0', '0');
INSERT INTO `wp_term_taxonomy` VALUES ('2', '2', 'wp_theme', '', '0', '1');
INSERT INTO `wp_term_taxonomy` VALUES ('3', '3', 'categoria-achadinho', '', '0', '8');
INSERT INTO `wp_term_taxonomy` VALUES ('4', '4', 'categoria-achadinho', '', '0', '28');
INSERT INTO `wp_term_taxonomy` VALUES ('5', '5', 'categoria-achadinho', '', '0', '8');
INSERT INTO `wp_term_taxonomy` VALUES ('6', '6', 'categoria-achadinho', '', '0', '8');
INSERT INTO `wp_term_taxonomy` VALUES ('7', '7', 'categoria-achadinho', '', '0', '4');
INSERT INTO `wp_term_taxonomy` VALUES ('8', '8', 'categoria-achadinho', '', '0', '12');
INSERT INTO `wp_term_taxonomy` VALUES ('9', '9', 'categoria-achadinho', '', '0', '4');
INSERT INTO `wp_term_taxonomy` VALUES ('10', '10', 'categoria-achadinho', '', '0', '4');
INSERT INTO `wp_term_taxonomy` VALUES ('11', '11', 'categoria-achadinho', '', '0', '4');
INSERT INTO `wp_term_taxonomy` VALUES ('12', '12', 'wp_theme', '', '0', '1');
INSERT INTO `wp_term_taxonomy` VALUES ('14', '14', 'category', '', '0', '12');
INSERT INTO `wp_term_taxonomy` VALUES ('15', '15', 'category', '', '0', '37');
INSERT INTO `wp_term_taxonomy` VALUES ('17', '17', 'nav_menu', '', '0', '6');
INSERT INTO `wp_term_taxonomy` VALUES ('18', '18', 'nav_menu', '', '0', '3');
INSERT INTO `wp_term_taxonomy` VALUES ('19', '19', 'wp_theme', '', '0', '1');

DROP TABLE IF EXISTS `wp_termmeta`;
CREATE TABLE `wp_termmeta` (
  `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `term_id` bigint(20) unsigned NOT NULL DEFAULT 0,
  `meta_key` varchar(255) DEFAULT NULL,
  `meta_value` longtext DEFAULT NULL,
  PRIMARY KEY (`meta_id`),
  KEY `term_id` (`term_id`),
  KEY `meta_key` (`meta_key`(191))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;


DROP TABLE IF EXISTS `wp_terms`;
CREATE TABLE `wp_terms` (
  `term_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL DEFAULT '',
  `slug` varchar(200) NOT NULL DEFAULT '',
  `term_group` bigint(10) NOT NULL DEFAULT 0,
  PRIMARY KEY (`term_id`),
  KEY `slug` (`slug`(191)),
  KEY `name` (`name`(191))
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

INSERT INTO `wp_terms` VALUES ('1', 'Sem categoria', 'sem-categoria', '0');
INSERT INTO `wp_terms` VALUES ('2', 'assets/..', 'assets', '0');
INSERT INTO `wp_terms` VALUES ('3', 'Utilitários', 'utilitarios', '0');
INSERT INTO `wp_terms` VALUES ('4', 'Acessórios', 'acessorios', '0');
INSERT INTO `wp_terms` VALUES ('5', 'Smart Home', 'smart-home', '0');
INSERT INTO `wp_terms` VALUES ('6', 'Setup', 'setup', '0');
INSERT INTO `wp_terms` VALUES ('7', 'Áudio', 'audio', '0');
INSERT INTO `wp_terms` VALUES ('8', 'Ferramentas', 'ferramentas', '0');
INSERT INTO `wp_terms` VALUES ('9', 'PC', 'pc', '0');
INSERT INTO `wp_terms` VALUES ('10', 'Entretenimento', 'entretenimento', '0');
INSERT INTO `wp_terms` VALUES ('11', 'Periféricos', 'perifericos', '0');
INSERT INTO `wp_terms` VALUES ('12', 'achadinhos-tech', 'achadinhos-tech', '0');
INSERT INTO `wp_terms` VALUES ('14', 'Introdução a Qualidade de Software', 'introducao-a-qualidade-de-software', '0');
INSERT INTO `wp_terms` VALUES ('15', 'Testes Automatizados', 'testes-automatizados', '0');
INSERT INTO `wp_terms` VALUES ('17', 'Primary Menu', 'primary-menu', '0');
INSERT INTO `wp_terms` VALUES ('18', 'Footer Menu', 'footer-menu', '0');
INSERT INTO `wp_terms` VALUES ('19', 'ideiasti-tech', 'ideiasti-tech', '0');

DROP TABLE IF EXISTS `wp_usermeta`;
CREATE TABLE `wp_usermeta` (
  `umeta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned NOT NULL DEFAULT 0,
  `meta_key` varchar(255) DEFAULT NULL,
  `meta_value` longtext DEFAULT NULL,
  PRIMARY KEY (`umeta_id`),
  KEY `user_id` (`user_id`),
  KEY `meta_key` (`meta_key`(191))
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

INSERT INTO `wp_usermeta` VALUES ('1', '1', 'nickname', 'pcyasuic');
INSERT INTO `wp_usermeta` VALUES ('2', '1', 'first_name', '');
INSERT INTO `wp_usermeta` VALUES ('3', '1', 'last_name', '');
INSERT INTO `wp_usermeta` VALUES ('4', '1', 'description', '');
INSERT INTO `wp_usermeta` VALUES ('5', '1', 'rich_editing', 'true');
INSERT INTO `wp_usermeta` VALUES ('6', '1', 'syntax_highlighting', 'true');
INSERT INTO `wp_usermeta` VALUES ('7', '1', 'comment_shortcuts', 'false');
INSERT INTO `wp_usermeta` VALUES ('8', '1', 'admin_color', 'modern');
INSERT INTO `wp_usermeta` VALUES ('9', '1', 'use_ssl', '0');
INSERT INTO `wp_usermeta` VALUES ('10', '1', 'show_admin_bar_front', 'true');
INSERT INTO `wp_usermeta` VALUES ('11', '1', 'locale', '');
INSERT INTO `wp_usermeta` VALUES ('12', '1', 'wp_capabilities', 'a:1:{s:13:\"administrator\";b:1;}');
INSERT INTO `wp_usermeta` VALUES ('13', '1', 'wp_user_level', '10');
INSERT INTO `wp_usermeta` VALUES ('14', '1', 'dismissed_wp_pointers', '');
INSERT INTO `wp_usermeta` VALUES ('15', '1', 'show_welcome_panel', '1');
INSERT INTO `wp_usermeta` VALUES ('16', '1', 'session_tokens', 'a:4:{s:64:\"be69e7c3cb429a657be8ecdd322c82c4789d228eb322a0ab0859c15b83d0aa5d\";a:4:{s:10:\"expiration\";i:1783454279;s:2:\"ip\";s:3:\"::1\";s:2:\"ua\";s:125:\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36 Edg/149.0.0.0\";s:5:\"login\";i:1783281479;}s:64:\"be0a3c631e2088f8f735e7755dbda92d7fb6180ec47503fc6524e0099aa6d89a\";a:4:{s:10:\"expiration\";i:1783555587;s:2:\"ip\";s:3:\"::1\";s:2:\"ua\";s:125:\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 OPR/132.0.0.0\";s:5:\"login\";i:1783382787;}s:64:\"b911f7da7633a2f719e42a87e884082c93e861bf81beced67e8b2e66a731999a\";a:4:{s:10:\"expiration\";i:1783555630;s:2:\"ip\";s:3:\"::1\";s:2:\"ua\";s:4:\"node\";s:5:\"login\";i:1783382830;}s:64:\"c899e199169bdb67b9be7bc137e90d7e4f88b69e784fcf4af2efac9633c266ab\";a:4:{s:10:\"expiration\";i:1783555741;s:2:\"ip\";s:3:\"::1\";s:2:\"ua\";s:4:\"node\";s:5:\"login\";i:1783382941;}}');
INSERT INTO `wp_usermeta` VALUES ('17', '1', 'wp_user-settings', 'mfold=o&libraryContent=browse');
INSERT INTO `wp_usermeta` VALUES ('18', '1', 'wp_user-settings-time', '1783307673');
INSERT INTO `wp_usermeta` VALUES ('19', '1', 'wp_dashboard_quick_press_last_post_id', '5');
INSERT INTO `wp_usermeta` VALUES ('20', '1', 'wp_persisted_preferences', 'a:3:{s:4:\"core\";a:1:{s:26:\"isComplementaryAreaVisible\";b:1;}s:14:\"core/edit-post\";a:1:{s:12:\"welcomeGuide\";b:0;}s:9:\"_modified\";s:24:\"2026-07-03T04:12:04.553Z\";}');
INSERT INTO `wp_usermeta` VALUES ('21', '1', 'nav_menu_recently_edited', '18');
INSERT INTO `wp_usermeta` VALUES ('22', '1', 'managenav-menuscolumnshidden', 'a:5:{i:0;s:11:\"link-target\";i:1;s:11:\"css-classes\";i:2;s:3:\"xfn\";i:3;s:11:\"description\";i:4;s:15:\"title-attribute\";}');
INSERT INTO `wp_usermeta` VALUES ('23', '1', 'metaboxhidden_nav-menus', 'a:1:{i:0;s:12:\"add-post_tag\";}');
INSERT INTO `wp_usermeta` VALUES ('25', '1', 'AkeebaSession_17c300153888c35a1fd764a83b090f53', 'a:7:{s:9:\"insideCMS\";b:1;s:22:\"platformNameForUpdates\";s:9:\"wordpress\";s:25:\"platformVersionForUpdates\";s:3:\"7.0\";s:13:\"newSecretWord\";N;s:7:\"profile\";i:1;s:16:\"solo_manage_task\";s:4:\"main\";s:7:\"__flash\";a:0:{}}');
INSERT INTO `wp_usermeta` VALUES ('26', '1', 'AkeebaSession_7d7d2718644b93cd6f10d19ed7d851b8', '');

DROP TABLE IF EXISTS `wp_users`;
CREATE TABLE `wp_users` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_login` varchar(60) NOT NULL DEFAULT '',
  `user_pass` varchar(255) NOT NULL DEFAULT '',
  `user_nicename` varchar(50) NOT NULL DEFAULT '',
  `user_email` varchar(100) NOT NULL DEFAULT '',
  `user_url` varchar(100) NOT NULL DEFAULT '',
  `user_registered` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
  `user_activation_key` varchar(255) NOT NULL DEFAULT '',
  `user_status` int(11) NOT NULL DEFAULT 0,
  `display_name` varchar(250) NOT NULL DEFAULT '',
  PRIMARY KEY (`ID`),
  KEY `user_login_key` (`user_login`),
  KEY `user_nicename` (`user_nicename`),
  KEY `user_email` (`user_email`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

INSERT INTO `wp_users` VALUES ('1', 'pcyasuic', '$wp$2y$10$lLXvRCjGdrkm7GULbNKpq.ZTLd4XEolXkO1Q926jIY41hNiOkZ0AC', 'pcyasuic', 'pcyasuic@outlook.com', 'http://localhost/achadinhos', '2026-07-03 04:08:54', '', '0', 'pcyasuic');

